2016-06-25 9 views
0

J'essaie de comparer 2 fichiers texte et d'imprimer la première ligne où ils diffèrent, mais j'utilise un tampon de 500 dans la commande fgets() et je pense que je gaspille de l'espace. Comment puis-je faire le même programme si je ne connais pas la longueur de la ligne?Comparaison de deux fichiers txt dans c

Voici mon code:

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

int main(int argc, char const *argv[]) 
{ 
    FILE *fp1, *fp2; 

    int nLine = 1; 
    char l1[500], l2[500]; 

    system("clear"); 

    if (argc < 3) 
    { 
     printf("Usage: %s <file1.txt> <file2.txt>\n",argv[0]); 
     exit(1); 
    } 

    if ((fp1 = fopen(argv[1],"r")) == NULL){ 
     printf("Can't open file: %s\n", argv[1]); 
     exit(1); 
    } 

    if ((fp2 = fopen(argv[2],"r")) == NULL){ 
     printf("Can't open file: %s\n", argv[2]); 
     exit(1); 
    } 

    fgets(l1,500,fp1); 
    fgets(l2,500,fp2); 

    while ((l1 != 0) && (l2 != 0)){ 
     if(strcmp(l1,l2) != 0){ 
      printf("Line number: %d\n", nLine); 
      printf("%s", l1); 
      printf("%s\n", l2); 
      exit(1); 
     } else { 
      fgets(l1,500,fp1); 
      fgets(l2,500,fp2); 
      nLine++;  
     } 
    } 

    return 0; 
} 
+0

Si les fichiers ne différer, vous avez une boucle infinie. Vérifiez la valeur de retour de 'fgets()'. – chux

+0

Vous pouvez comparer les caractères des deux fichiers, si le caractère est différent, appelez une fonction pour imprimer la ligne. Cela peut être difficile car nous ne suivions pas la ligne. Vous pouvez inverser le cheminement jusqu'à obtenir un nouveau trait. puis imprimez la ligne. –

+1

Vous n'avez pas besoin de tampons pour atteindre votre objectif. Je compare simplement les caractères correspondants à la volée et je me souviens du dernier caractère de nouvelle ligne que vous avez rencontré dans le processus. – mw215

Répondre

2

Si vous ne voulez pas « perdre de l'espace », rappelez-vous que les données sont dans la mémoire de fichiers . Lire 1 caractère à la fois. Lorsque vous trouvez une différence, recherchez à l'emplacement du saut de ligne précédent et signalez les lignes suivantes.

long index = 0; 
long index_lf = 0; 
int c1,c2; 

// read until a difference or done 
while ((c1 = fgetc(fp1)) == (c2 = fgetc(fp2)) && (c1 != EOF)) { 
    index++; 
    if (c1 == '\n') index_lf = index; 
} 
if (c1 == c2) { 
    puts("same"); 
} else { 
    puts("differ"); 
    fseek(fp1, index_lf, SEEK_SET); 
    fseek(fp2, index_lf, SEEK_SET); 
    // read and print each file until a following \n or EOF occurs. 
    // TBD code for OP 
} 

[Modifier] Certaines améliorations pour faire face à diverses questions: désadaptation sur le dernier octet, les fichiers ouverts dans différents modes, gestion des erreurs, etc.

long offset1 = ftell(fp1);; 
long offset2 = ftell(fp2);; 
int c1,c2; 

// read until a difference or done 
while ((c1 = fgetc(fp1)) == (c2 = fgetc(fp2)) && (c1 != EOF)) { 
    if (c1 == '\n') { 
    offset1 = ftell(fp1); 
    offset2 = ftell(fp2); 
    } 
} 

if (offset1 == -1 || offset2 == -1 || ferror(fp1) || ferror(fp2)) { 
    puts("problem"); 
} else if (c1 == c2) { 
    puts("same"); 
} else { 
    puts("differ"); 
    fseek(fp1, offset1, SEEK_SET); 
    fseek(fp2, offset2, SEEK_SET); 
    // read and print each file until a following \n or EOF occurs. 
    // TBD code for OP 
} 
+1

La condition 'if (c1 == EOF && c2 == EOF)' pourrait être raccourcie à 'if (c1 == c2)', n'est-ce pas? –

+0

@Chrono Kitsune Oui, il pourrait - très bien. – chux