web-dev-qa-db-fra.com

Lecture d'une ligne à la fois en C

Quelle méthode peut être utilisée pour lire une ligne à la fois à partir d’un fichier en C?

J'utilise la fonction fgets , mais cela ne fonctionne pas. Il ne lit que le jeton séparé par des espaces.

Que faire? 

10
Mahesh Gupta

Cela devrait fonctionner si vous ne pouvez pas utiliser fgets() pour une raison quelconque.

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; 
}
12
LukeN

Utilisez le programme suivant pour obtenir la ligne par ligne à partir d’un fichier.

#include <stdio.h>
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;
}
16
rekha_sri

Si vous codez pour une plate-forme pour laquelle la bibliothèque GNU C est disponible, vous pouvez utiliser getline ():

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

8
Ant

La fonction fgets va lire une seule ligne d'un fichier ou num caractères où num est le deuxième paramètre passé à fgets. Passez-vous un nombre assez grand pour lire la ligne?

Par exemple

// 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);
7
JaredPar

C'est plus un commentaire qu'une réponse complète, mais je n'ai pas assez de points pour commenter. :)

Voici le prototype de fonction pour fgets ():

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

Il lit n-1 octets ou jusqu'à une nouvelle ligne ou eof. Pour plus d'informations, voir ici

3
Mike Yam

Utilisez fgets pour lire à partir de la ligne, puis getc(...) pour mâcher la nouvelle ligne ou la fin de ligne pour continuer à lire ... voici un exemple de lecture à perpétuité d'une ligne ...

 // Lit 500 caractères ou 1 ligne, selon la valeur la plus courte 
 Char c [500], effet de mâchonnement; [.____ (c), fichier); 
 si (! feof (fichier)) {
 chewup = getc (fichier); // Pour mâcher le terminateur de nouvelle ligne 
 // Faire quelque chose avec C 
} Else {
 Break; // Fin de fichier atteint ... 
} 
} 
2
t0mm13b

fgets() devrait être la voie à suivre…

2
Didier Trosset

utilisez soit fgets si vous savez que vos lignes vont tenir dans la mémoire tampon ou utilisez fgetc pour plus de contrôle sur la lecture

2
Andrey

Source d'erreur:

En fait, ce n’était pas de ma faute… Dans ce cas, J’utilisais la fonction strtok et j’ai modifié par inadvertance ma chaîne originale. ...

Merci à tous pour m'aider .. :)

0
Mahesh Gupta