2009-10-29 3 views
1

I ont programme comme (de link text)fgets en C++ se répète la dernière ligne

FILE* soubor; 
char buffer[100]; 
soubor = fopen("file","r"); 
string outp = ""; 
while (! feof(soubor)) 
{ 
     fgets(buffer,100,soubor); 
     fputs (buffer , stdout); 
} 
fclose(soubor); 

et déposer comme

A 
B 
C 
D 
E 

et la sortie du programme est

A 
B 
C 
D 
E 
E 

il répète la dernière ligne du fichier deux fois. J'ai ce problème dans d'autres programmes aussi.

Répondre

7

En utilisant feof() comme condition pour une boucle de lecture d'un fichier conduit presque toujours à des problèmes. La manière standard devrait ressembler à ceci:

while (fgets(buffer, 100, infile)) 
    fputs(buffer, stdout); 
7

Le problème est que pour la dernière ligne, les failles échoueront. Cependant, vous ne vérifiez pas feof avant la prochaine boucle, donc vous appelez toujours fputs qui imprimera le contenu du tampon, c'est-à-dire la ligne précédente.

Essayez ceci:

FILE* soubor; 
char buffer[100]; 
soubor = fopen("file","r"); 
string outp = ""; 
while (true) 
{ 
    fgets(buffer,100,soubor); 
    if (feof(soubor)) 
    break; 
    fputs (buffer , stdout); 
} 
fclose(soubor); 
+0

Nooooo .. Ne faites pas cela. –

+0

Le motif standard (dans tous les langages porocéduraux) consiste à placer l'instruction get comme condition de la boucle. Si elle échoue, la boucle n'est jamais entrée. –

0

J'aime Ben Russels réponse. C'est ma version pour éviter de répéter la dernière ligne du code c. Cela fonctionne mais je ne comprends pas pourquoi, car la condition if (fgets != NULL) devrait faire ce travail.

int main() 
{ 
    FILE* pFile; 
    char name[41] = "fileText04.txt"; 
    char text[81]; 
    int i; 

    pFile = fopen("fileText04.txt", "wt"); 
    if (pFile == NULL) 
    { 
     printf("Error creating file \n"); 
     exit(1); 
    } 
    else 
    { 
     for (i=0; i<5; i++) 
     { 
      printf("Write a text: \n"); 
      fgets(text, 81, stdin); 
      fputs(text, pFile); 
     } 
    } 
    fclose (pFile); 
    pFile = fopen(name, "rt"); 
    if (pFile == NULL) 
    { 
     printf("File not found. \n"); 
     exit(2); 
    } 
    while (! feof(pFile)) 
    { 
     fgets(text, 80, pFile); 
     if (feof(pFile)) // This condition is needed to avoid repeating last line. 
      break;   // This condition is needed to avoid repeating last line. 
     if (fgets != NULL) 
      fputs(text, stdout); 
    } 
    fclose (pFile); 
    return 0; 
} 

Un grand merci, Jaime Daviu

0

La raison pour laquelle FeOF (inputfile_pointer) n'est pas la bonne façon de vérifier la fin lors de la copie du fichier, est parce qu'il ne fonctionne pas dans DEUX du les situations suivantes:

  1. Le fichier se termine sans caractère de retour à la ligne.
  2. Le fichier se termine par un caractère de retour à la ligne.

Preuve:

  • Assumer le feof est vérifié après la fgets(), mais avant fputs(). Ensuite, cela ne fonctionne pas pour le cas 1. ci-dessus, car les caractères fgets() lues avant l'EOF ne seront pas utilisés par fputs().
  • Supposons que feof est cochée après fputs(), mais avant fgets(). Ensuite, cela ne fonctionne pas pour le cas 2. ci-dessus, comme quand fgets() rencontre enfin EOF, il ne remplace pas la chaîne de tampon avec quelque chose de nouveau, et comme fputs() est autorisé à fonctionner une fois de plus, il mettra dans le fichier de sortie le même contenu de chaîne de tampon comme dans l'itération précédente; donc répété dernière ligne dans le fichier de sortie.
Questions connexes