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?
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;
}
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;
}
Si vous codez pour une plate-forme pour laquelle la bibliothèque GNU C est disponible, vous pouvez utiliser getline ():
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);
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
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 ... } }
fgets()
devrait être la voie à suivre…
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
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 .. :)