Partager via


La fonction Fscanf ne lit pas les lignes consécutives comme prévu

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’appel fscanf de fonction.

  • Appelez la Fgetc fonction après l’appel Fscanf 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);
}