Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article décrit un problème qui se produit lorsque vous lisez des lignes de texte à l’aide de la Fscanf
fonction.
Version du produit d’origine : Visual C
Numéro de la base de connaissances d’origine : 60336
Résumé
Lorsqu’un fichier est ouvert en mode texte, une tentative de lecture de lignes de texte à l’aide de la Fscanf
fonction peut échouer et une seule ligne de texte est lue à partir du fichier. Le délimiteur est défini sur [^\n]
. La Fscanf
fonction lit jusqu’à mais n’inclut pas le caractère de limitation. Par conséquent, le flux de fichiers s’arrête au premier \n
dans le fichier. Les appels de fonction suivants Fscanf
échouent, car le pointeur de fichier reste au niveau du caractère de limitation et la Fscanf
fonction ne peut pas avancer le pointeur de fonction au-delà de celui-ci. Pour déplacer le pointeur de fichier au-delà du caractère de limitation, utilisez l’une des deux méthodes suivantes :
Mettez à jour le code pour utiliser l’appel de fonction suivant
Fscanf
:fscanf(stream, "%[^\n]%*c", line)
Le
%*c
spécificateur de format lit un caractère du flux d’entrée, mais ne l’affecte à aucun des paramètres de l’appelfscanf
de fonction.Appelez la
Fgetc
fonction après l’appelFscanf
de fonction pour déplacer le pointeur de fichier au-delà du\n
caractère.
L’exemple de code suivant illustre ce problème. L’exemple de code doit lire et imprimer des lignes à partir d’un fichier texte jusqu’à ce qu’il atteigne EOF. Toutefois, l’exemple de code lit uniquement la première ligne du fichier. Étant donné que la fin du caractère de fichier n’a pas été trouvée, l’exemple de code s’exécute dans une boucle infinie si le flux de fichiers contient un \n
caractère.
Exemple de code
FILE *stream;
char line[80];
while ((fscanf(stream, "%[^\n]", line))!= EOF )
{
printf("Line = %s \n",line);
}
L’exemple de code suivant illustre la deuxième méthode ci-dessus pour contourner ce problème :
FILE *stream;
char line[80];
while ((fscanf(stream, "%[^\n]", line))!= EOF)
{
fgetc(stream); // Reads in '\n' character and moves file
// stream past delimiting character
printf("Line = %s \n", line);
}