Lendo uma linha por vez em C

Qual método pode ser usado para ler uma linha por vez a partir de um arquivo em C?

Eu estou usando a function fgets , mas não está funcionando. Está lendo apenas o token separado por espaço.

O que fazer?

Isso deve funcionar, quando você não pode usar fgets() por algum motivo.

 int readline(FILE *f, char *buffer, size_t len) { char c; int i; memset(buffer, 0, len); for (i = 0; i < len; i++) { int c = fgetc(f); if (!feof(f)) { if (c == '\r') buffer[i] = 0; else if (c == '\n') { buffer[i] = 0; return i+1; } else buffer[i] = c; } else { //fprintf(stderr, "read_line(): recv returned %d\n", c); return -1; } } return -1; } 

Use o programa a seguir para obter a linha por linha de um arquivo.

 #include  int main ( void ) { char filename[] = "file.txt"; FILE *file = fopen ( filename, "r" ); if (file != NULL) { char line [1000]; while(fgets(line,sizeof line,file)!= NULL) /* read a line from a file */ { fprintf(stdout,"%s",line); //print the file contents on stdout. } fclose(file); } else { perror(filename); //print the error message on stderr. } return 0; } 

Se você está codificando para uma plataforma que tem a biblioteca GNU C disponível, você pode usar o getline ():

http://www.gnu.org/s/libc/manual/html_node/Line-Input.html

A function fgets lerá uma única linha de um arquivo ou num caracteres em que num é o segundo parâmetro passado para fgets . Você está passando um número grande o suficiente para ler a linha?

Por exemplo

 // Reads 500 characters or 1 line, whichever is shorter char c[500]; fgets(c, 500, pFile); 

Vs.

 // Reads at most 1 character char c; fgets(&c,1,pFile); 

Este é mais um comentário do que uma resposta completa, mas não tenho pontos suficientes para comentar. 🙂

Aqui está o protótipo da function para fgets ():

 char *fgets(char *restrict s, int n, FILE *restrict stream); 

Ele irá ler n-1 bytes ou até uma nova linha ou eof. Para mais informações, veja aqui

fgets() deve ser o caminho a percorrer …

use fgets se você souber que suas linhas caberão no buffer ou usar o fgetc para ter mais controle sobre a leitura

Use fgets para ler a partir da linha e, em seguida, use getc(...) para mastigar a nova linha ou o final de linha para continuar lendo … aqui está um exemplo de sempre lendo uma linha …

 // Lê 500 caracteres ou 1 linha, o que for menor
 char c [500], chewup;
 while (true) {
     fgets (c, sizeof (c), pFile);
     if (! feof (pFile)) {
         chewup = getc (pFile);  // Para mastigar o terminador de nova linha
         // faça algo com C
     }outro{
         pausa;  // Fim do arquivo alcançado ...
     }
 }

Fonte de Erro:

Na verdade, não foi minha culpa .. Neste caso. Eu estava usando a function strtok e acidentalmente modifiquei minha string original original. Por isso, durante a impressão eu estava recebendo o erro …

Obrigado a todos por me ajudar .. 🙂

Você pode usar fscanf em vez de fgets. Porque fgetscan fscanf para caracteres, incluindo espaços, mas ao usar fscanf você pode acessar separadamente aos dados salvos em um arquivo.eg, haverá um arquivo com a class de nome roll.now declarar uma seqüência de caracteres e dois inteiros de linha.