2010-10-06 12 views
0

J'ai un programme C qui rencontre des erreurs lorsque j'entre dans une boucle while.C: fscanf efface les valeurs de variables entières?

J'initialiser une variable (fragmentcount) et écrire dans l'aide fscanf et lui attribuer une valeur de 4 (cela fonctionne)

int fragmentCount; 
if ((fscanf(fp, "%i", &fragmentCount)) == 1) { 
    ... 
} 

Cependant, lorsque je tente d'y accéder dans une boucle while ci-dessous, fragmentCount = 0

while ((fscanf(fp, "%[#]", discards)) != EOF) { 
    printf(fragmentCount); // <- pseudocode 
} 

pour une brève expérience, j'ai essayé enlevons le fscanf que le test conditionnel pour la boucle while et fragmentCount était la valeur correcte (4).

Pourquoi est-ce ainsi? Comment puis-je éviter ça?

+0

Il est plus la lecture des # 's dans les rejets de chaîne, que d'éviter l'EOF – Daniel

Répondre

1

Comment est discards déclarée? Il est possible que fscanf lise plus de données que discards a de la place, ce qui pourrait écraser la valeur d'autres variables.

En utilisant le format « % de [ » sans une largeur de champ est une mauvaise idée - il leaves your program open to buffer overflow errors.

+0

rejets carbonisés [2]; – Daniel

+0

@Daniel ce sera un problème s'il y a plus d'un '#' consécutif - vous avez seulement de la place pour 1 (plus le nul final). –

+0

Il n'y a qu'un seul # (donc le 2), mais en passant par GDB, c'est cette ligne qui tue tout: fscanf (fp, "% [#]", rejets); – Daniel

0

fscanf lit une valeur à partir d'un fichier et l'interprète selon la chaîne de format. La chaîne de format '% i' est inconnue (peut-être que vous vouliez dire '% d'?) Selon http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/, il est donc peu probable que vous lisiez la valeur attendue.

En dehors de fichier FILE* et la chaîne de format, tous les paramètres sont à fscanf des paramètres, ce qui signifie que la valeur qu'ils contiennent avant l'appel à fscanf ne sont pas pertinents et pourrait être remplacé.

+0

% i est le format entier - il permet octal, hexadécimal ou décimal. http://www.kernel.org/doc/man-pages/online/pages/man3/scanf.3.html –

+0

Ah, je comprends mieux la question maintenant. Vous avez raison, un dépassement de tampon est beaucoup plus probable. – Zooba

Questions connexes