2010-08-21 2 views
0

je la fonction suivante:fgets lit trop de caractères que existe

void writeResults(FILE* fp, FILE* fpw, Vector w, int size) { 

Vector x; 

while (1) { 

     char line[MAX_DIMENSION]; //max dimension is 200 

     if((fgets(line,MAX_DIMENSION,fp)) == NULL) { //EOF 
      return; 
     } 
     else { 
      int i=0; 
      while (line[i]!='\0') { 
       printf("% d %c\n",i,line[i]); //print to check it 
       i++; 
      } 
     } 
} 
} 

La ligne du fichier il lit est:

1,1 
2,2 

Cependant lorsque j'imprime chaque ombles jusqu'à ce que « \ 0 » Je reçois cette sortie:

0 1 
1 , 
2 1 
3 
4 
0 2 
1 , 
2 2 
3 
4 

Quelqu'un at-il une idée de la raison pour laquelle il lit les 3 et 4 caractères supplémentaires? (il n'y a pas d'espaces supplémentaires dans le fichier).

Note: le fichier a été ouvert de la manière suivante:

FILE* fp = fopen(fileIn, "r"); 
if (fp == NULL) { 
    perror("Couldn't open File"); 
    exit(errno); 
} 
+0

N'oubliez pas de sélectionner la réponse qui vous a le plus aidé - mettez en surbrillance la coche blanche (coche) sur le LHS. Et faites cela pour toutes les questions où vous avez une réponse utile. Cela fait partie d'être un bon citoyen sur SO. –

Répondre

1

retour chariot, saut de ligne - sous Windows?

Il serait utile si nous savions comment vous avez ouvert le fichier. Si vous l'avez ouvert en tant que fichier texte, vous ne devriez pas voir les deux caractères supplémentaires - juste un pour le retour à la ligne. Cependant, si vous l'ouvrez en tant que fichier binaire, il devrait en effet lire à la fois le CR et le LF.

Si vous êtes sur Linux, comme indiqué dans les commentaires, nous avons plus d'outils de diagnostic disponibles. Peut-être le plus simple pour commencer est «od -c file»; Cela vous montrera exactement ce qu'il y a dans le fichier. Notez que si le fichier se trouvait dans une boîte Windows, il pouvait toujours avoir des fins de ligne CRLF. Si vous utilisez 'vim', cela peut indiquer que le type de fichier est '[dos]'.

Sinon, vous pouvez imprimer les caractères comme des entiers (ainsi que des caractères):

printf("%d (%2d) %c\n", i, line[i], line[i]); 

Vous devriez voir 49 pour '1', 50 pour '2', 44 pour '', 10 pour newline (LF, '\n'), et quelque chose d'autre aussi - c'est le mystère (mais il montrerait 13 pour CR).


CR est le caractère \r dans la source C. Il était utilisé pour indiquer que la tête d'impression devait revenir au début de la ligne (le chariot de l'imprimante revenait au début de la ligne); le LF ou le saut de ligne fait défiler le papier d'une ligne. Windows et MS-DOS utilisent tous deux la séquence CRLF (curr-liff) pour indiquer une fin de ligne; Unix utilisait toujours juste LF, alias newline ou NL; MacOS 9 et plus tôt utilisé juste CR.

+0

Je ne sais pas vraiment ce qu'est le retour de chariot ... je cours sur Linux –

+0

OK - sur Linux, c'est beaucoup moins susceptible d'être le problème. Je vais ajouter quelques suggestions à ma réponse. –

+0

mis à jour la question avec openinig flux ... mais vous êtes bien ... merci pour les réponses –

2

N'imprimez pas% c, imprimez% d et vous verrez le code ASCII des caractères. vous trouverez les caractères sont le retour chariot et le saut de ligne.13 et 10

se réfèrent à http://www.asciitable.com/

1

Je pense que votre fichier d'entrée contains-

1,1 
[SPACESPACE] 
2,2 
[SPACESPACE] 

donc premier fgets temps de lecture comme-

line{'1',',','1','',''} 

et la deuxième fois lit

line{'2',',','2','',''} 

C'est pourquoi, vous obtenez la sortie comme vous l'avez spécifié