einstein Posted March 17, 2012 at 07:12 PM Report Share #444369 Posted March 17, 2012 at 07:12 PM pretendo criar um programa que abra um ficheiro com o nome definido pelo utilizador e que o imprima no ecra, so que este programa so esta a funcionar para as primeiras palavras de cada linha. O que devo alterar para ler a linha toda? O código é o seguinte : #include<stdio.h> #include<stdlib.h> int main () { char ficheiro[80]; char linha[80]; char valor[80]; FILE * fp; printf("Indique o nome do ficheiro\n"); scanf("%s",ficheiro); fp=fopen(ficheiro,"r"); if (fp == NULL){ printf("ficheiro nao existente\n"); exit(0); } else { while(fgets(linha, 80, fp)!= NULL){ sscanf(linha," %s",valor); printf("%s\n",valor); } fclose(fp); } exit(0); } Em relação ao comprimento das string. Qual deve ser? Link to comment Share on other sites More sharing options...
bsccara Posted March 17, 2012 at 07:43 PM Report Share #444373 Posted March 17, 2012 at 07:43 PM O código está a ler um máximo de 79 caracteres de cada linha terminada com um newline (ASCII 0x0A). Se sabes o número de caracteres da maior linha podes substituir o 80 por esse valor + 1. Se não sabes isso escolhes um valor arbitrário grande (1024 ou coisa assim) ou carregas o ficheiro em blocos (por exemplo de 16K), procuras as linhas uma a uma no bloco e copia-as para uma lista de strings, que depois imprimes. Tens de prever que as linhas podem atravessar dois blocos carregados consecutivamente e nesse caso terás de copiar o início dessa linha para o topo do bloco e preencher apenas o resto do bloco. Já agora, podes usar o fscanf em vez do par fgets e sscanf. Link to comment Share on other sites More sharing options...
pmg Posted March 17, 2012 at 08:01 PM Report Share #444377 Posted March 17, 2012 at 08:01 PM O fgets() lê a linha toda, incluindo o \n. Depois, com o sscanf() é que "perdes" o que vem depois da primeira palavra. Deixa de fazer o sscanf() e imprime o conteudo de linha directamente: while (fgets(linha, sizeof linha, fp)) { printf("%s", linha); /* linha contem '\n' */ } Se uma linha for maior que o espaço disponível, a vez seguinte que corre o ciclo vai buscar o resto da linha. Outra maneira é fazeres o sscanf() mas aceitares espaços: o "%s" ignora espaços antes e depois das strings. Para isso usa o "%79c" ou "%79[^\n]". Podes substituir o 79 por um asterisco e passar o valor para argumento sscanf(linha, "%*c", sizeof valor - 1, valor); What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
einstein Posted March 17, 2012 at 09:19 PM Author Report Share #444388 Posted March 17, 2012 at 09:19 PM O fgets() lê a linha toda, incluindo o \n. Depois, com o sscanf() é que "perdes" o que vem depois da primeira palavra. Deixa de fazer o sscanf() e imprime o conteudo de linha directamente: while (fgets(linha, sizeof linha, fp)) { printf("%s", linha); /* linha contem '\n' */ } Se uma linha for maior que o espaço disponível, a vez seguinte que corre o ciclo vai buscar o resto da linha. Outra maneira é fazeres o sscanf() mas aceitares espaços: o "%s" ignora espaços antes e depois das strings. Para isso usa o "%79c" ou "%79[^\n]". Podes substituir o 79 por um asterisco e passar o valor para argumento sscanf(linha, "%*c", sizeof valor - 1, valor); Muito obrigado pela resposta da primeira forma funciona. Agora da segunda forma que referiste se eu usar o"%79c", quando o programa vai ler o ficheiro, nao funciona correctamente repetindo algumas partes . . . Link to comment Share on other sites More sharing options...
pmg Posted March 17, 2012 at 10:33 PM Report Share #444399 Posted March 17, 2012 at 10:33 PM Agora da segunda forma que referiste se eu usar o"%79c", quando o programa vai ler o ficheiro, nao funciona correctamente repetindo algumas partes . . . Oops ... erro meu, sorry. O "%c" não termina as string correctamente, isto é, não escreve o '\0' no fim da string. Mas o fgets() funciona e é, a meu ver, a função que melhor se adequa para ler linhas. O "%[]" e o "%c" eram mais como exemplos de outras formas que poderás ver em algum código. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
einstein Posted March 17, 2012 at 10:36 PM Author Report Share #444400 Posted March 17, 2012 at 10:36 PM Oops ... erro meu, sorry. O "%c" não termina as string correctamente, isto é, não escreve o '\0' no fim da string. Mas o fgets() funciona e é, a meu ver, a função que melhor se adequa para ler linhas. O "%[]" e o "%c" eram mais como exemplos de outras formas que poderás ver em algum código. Ah . Ok . Então usando o fgets e sscanf não existe nenhuma maneira? Link to comment Share on other sites More sharing options...
pmg Posted March 17, 2012 at 10:46 PM Report Share #444403 Posted March 17, 2012 at 10:46 PM Ah . Ok . Então usando o fgets e sscanf não existe nenhuma maneira? Tens que especificar melhor o que pretendes. Se pretendes ler e tratar linhas o fgets() é o melhor; se pretendes ler linhas e depois separá-las em palavras, fgets() seguido de sscanf("%*s") é uma boa hipótese; se pretendes ler linhas e depois separá-las em inteiros, fgets() seguido de strtol() é uma boa hipótese; ... ... se pretendes tratar a informação sem a noção de linhas, o fgets() provavelmente não deve ser uma boa escolha ... What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
einstein Posted March 17, 2012 at 10:48 PM Author Report Share #444405 Posted March 17, 2012 at 10:48 PM Tens que especificar melhor o que pretendes. Se pretendes ler e tratar linhas o fgets() é o melhor; se pretendes ler linhas e depois separá-las em palavras, fgets() seguido de sscanf("%*s") é uma boa hipótese; se pretendes ler linhas e depois separá-las em inteiros, fgets() seguido de strtol() é uma boa hipótese; ... ... se pretendes tratar a informação sem a noção de linhas, o fgets() provavelmente não deve ser uma boa escolha ... Apenas pretendo ler e tratar linhas. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now