2016-12-08 3 views
0

Je souhaite fusionner deux fichiers dans C et arrêter à la fin.Fusionner deux fichiers dans C

J'ai un programme mais il continue d'épeler des mots même après la fin de mon fichier. Par exemple:

Fichier 1:

a 
b 
c 

Fichier 2:

1 
2 
3 
4 
5 

Et le résultat que je reçois est:

a 
1 
b 
2 
c 
3 
c 
4 
c 
5 

Et je veux:

a 
1 
b 
2 
c 
3 
4 
5 

Je pense que c'est ma déclaration if dans ma boucle while qui est mon problème. Je ne sais pas comment définir cela.

Mon code est:

#include <stdio.h> 
#include <stdlib.h> 


int main(void) { 

    char d[200];      //char för da.txt 
    char h[200];      //char för hej.txt 
    FILE *hptr, *dptr; 

    hptr = fopen("hej.txt", "r");  //Öppna hej.txt => hptr 
    dptr= fopen("da.txt", "r");   //Öppna da.txt => dptr 

    /* 
    if(((hptr) == NULL && (dptr) == NULL)) //Fall 1 
    { 
     printf("Error, båda filerna är tom"); 
     exit(1); 
    } 


    if ((hptr) == NULL)     //Fall 2 när hej.txt är tom 
    { 
     fscanf(dptr,"%[^/]", d);  //Hämtar från da.txt 
     printf("\nFil 2:\n%s", d);  //Skriver ut från da.txt 
     exit(1); 
    } 

    if ((dptr) == NULL)     //Fall 3 när da.txt är tom 
    { 
     fscanf(hptr,"%[^/]", h);  //Hämtar från hej.txt 
     printf("Fil 1:\n%s", h);  //Skriver ut från hej.txt 
     exit (1); 
    } */ 

    if(hptr != NULL || dptr != NULL)  //Fall 4 när ingen fil är tom 
    { 

     while (!feof (hptr) && !feof (dptr)) 
     { 
      if (hptr ***I guess this is the problem*** == feof) 
      { 
      fgets(d, 200, dptr); 
      printf("%s", d); 
      } 

      if (hptr == feof) 
      { 
      fgets(h, 200, hptr); 
      printf("%s", h); 
      } 

     } 

     fclose (hptr); 
     fclose (dptr); 
    } 
    //getch(); 
    return EXIT_SUCCESS; 
} 
+5

'while (! Feof())' est toujours tort (http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong). – pmg

+1

'feof' est une fonction. Comparer un pointeur de fichier est un non-sens. –

+0

Compile avec les avertissements activés. –

Répondre

0

Essayez d'utiliser

!feof (hptr) 

au lieu de

hptr == feof 

Explication: feof est une fonction - vous comparez un pointeur de fichier hptr contre un pointeur de fonction feof qui ne fonctionnera jamais - mais puisque vous peut toujours comparer les pointeurs dans C le compilateur ne vous donne pas d'erreurs.

Vous semble aussi avoir une erreur coupe-coller que vous utilisez hptr dans les deux cas des déclarations - je suis sûr que l'un d'entre eux aurait été dptr

+0

Pourquoi la downvote? –

+0

La réponse est essentiellement «comparer un pointeur de données contre un pointeur de fonction ne fonctionnera pas» - quelle partie de ce qui est faux? – Soren

+0

(et puis il a supprimé ses commentaires) – Soren

0

feof seulement les mises à jour lorsque vous essayez de faire quelques IO . Lorsque vous appelez fgets, et qu'il atteint EOF et échoue, vous imprimez quand même la chaîne, même si elle n'a pas été mise à jour. C'est pourquoi vous obtenez le répéter "c"

Essayez ceci:

while (!feof (hptr) || !feof (dptr)) 
{ 
    if (fgets(d, 200, dptr)) 
    { 
     printf("%s", d); 
    } 

    if (fgets(h, 200, hptr)) 
    { 
     printf("%s", h); 
    } 
} 
+0

Merci pour votre aide! Nous avons changé && en || et ça fonctionne bien. – Karim

+0

Bien sûr ... BTW il semble que le code ci-dessus ne donne pas réellement la sortie que vous avez dit, c'est-à-dire que les instructions if ne doivent pas être saisies, et que le tout se termine par le fichier de tri. Cela le rend difficile à commenter. –

+2

Veuillez lire [Pourquoi est-ce que "(! Feof (fichier))" toujours faux? "(Http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) –

0

En fait, vous avez besoin ceci:

if (hptr != NULL && dptr != NULL)  //Fall 4 när ingen fil är tom 
    {    //^ you need && here, not || 

    do 
    { 
     if (fgets(d, 200, dptr) != NULL) 
      printf("%s", d); 

     if (fgets(h, 200, hptr) != NULL) 
      printf("%s", h); 
    } while (!(feof(hptr) && feof(dptr))); 

    fclose(hptr); 
    fclose(dptr); 
    } 

S'il vous plaît voir cette question SO: Why is “while (!feof (file))” always wrong?

+1

Pourquoi la baisse? –

-1

Vous pas besoin de feof() (il est terrible!), il suffit d'utiliser la valeur de retour de fgets(), un lternating entre les deux fichiers d'entrée.

#include <stdio.h> 

int main(void) 
{ 
char buff[100]; 
int state; 

FILE * one, *two; 
one = fopen("one", "r"); 
two = fopen("two", "r"); 

if (!one || !two) return 1; 

for (state=0; ; state ^=1) { 
     if (!fgets(buff, sizeof buff, state ? two: one)) break; 
     printf("%s", buff); 
     } 

while (fgets(buff, sizeof buff, state? one : two)) { 
     printf("%s", buff); 
     } 
fclose(one); 
fclose(two); 

return 0; 
}