2013-10-29 47 views
1

我想編寫一個程序來比較兩個文件,並將第二個文件中與第二個文件不同的文件中的每個字節寫入第三個文件。我想逐字節比較文件,並將任何不同的單個字節寫入第三個文件。我對文件I/O不是很熟悉。有人能給我一個完成這個任務的例子程序嗎?如何將兩個文本文件中的差異寫入C中的另一個文本文件?

這是我到目前爲止有:

int main(int argc, char *argv[]) { 
    int file1, file2, file1size, file2size; 
    // int difference1, difference2; 
    char buf; 

    if (argc != 3){ 
    fprintf(stderr, "Usage %s <file1> <file2>", argv[0]); 
    exit(1); 
    } 
    if ((file1 = open(argv[1], 0400)) < 0) { //read permission for user on file source 
    fprintf(stderr, "Can't open source"); 
    exit(1); 
    } 
    if ((file2 = open(argv[2], 0400)) < 0) { //read permission for user on file source 
    fprintf(stderr, "Can't open source"); 
    exit(1); 
    } 
    file1size = lseek(file1, (off_t) 0, SEEK_END); 
    printf("File 1's size is %d\n", file1size); 
    file2size = lseek(file2, (off_t) 0, SEEK_END); 
    printf("File 2's size is %d\n", file2size); 



} 

我不知道如何比較文件1和文件2的字節,然後寫的差異到另一個文件。

+0

向我們展示您的嘗試 – sukhvir

+0

歡迎來到SO - 您到目前爲止嘗試過什麼? http://mattgemmell.com/2008/12/08/what-have-you-tried/ – Sadique

回答

2

這是接近你在找什麼。

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    FILE *file1 = fopen(argv[1], "r"); 
    FILE *file2 = fopen(argv[2], "r"); 
    int i; 
    for(i = 0; !feof(file1) || !feof(file2); i++) { 
     int byte1 = getc(file1); 
     int byte2 = getc(file2); 
     if(byte1 != byte2) { 
      printf("%d %d %d\n", i, byte1, byte2); 
     } 
    } 
    return 0; 
} 

它將兩個文件作爲命令行參數並逐字節比較。如果兩個字節不同,則會顯示字符#和兩個字符的ASCII值。 -1表示已經達到EOF。

你必須(理解和)適應你想要的輸出格式。 (我假設這是作業。)

feof測試文件結束。

getc從文件中獲取下一個字符(字節)。如果已到達文件末尾,則爲-1。

而你似乎已經知道printf是做什麼的。

+0

考慮檢查fopen()的返回值。 printf(file3,...? –

+0

@CharlieBurns,對不起,這是從OP請求打印到第三個文件的剩餘部分,然後在他的例子中,他打印到標準輸出,所以我(不完整地)重構了 –

2

這你想要做什麼,編譯並運行,

#include <stdio.h> 
int main(int argc, char *argv[]) 
{ 
    int offset; 
    int argi=1; 
    int ch1, ch2; 
    FILE *fh1, *fh2, *fh3=stdout; 
     FILE *fh4=stdout; 
    if(argc<3) { 
     printf("usage: diff <file> <file> { <outfile> }\n"); return(1); 
    } 
    if(argi<argc) { 
     if(!(fh1 = fopen(argv[argi], "r"))) { 
      printf("cannot open %s\n",argv[argi]); return(2); 
     } 
    } 
    if(++argi<argc) { 
     if(!(fh2 = fopen(argv[argi], "r"))) { 
      printf("cannot open %s\n",argv[argi]); return(3); 
     } 
    } 
    if(++argi<argc) { 
     if(!(fh3 = fopen(argv[argi], "w+"))) { 
      printf("cannot open %s\n",argv[argi]); return(4); 
     } 
    } 
     if(++argi<argc) { 
      //duplicate output to a second file? 
      if(!(fh4 = fopen(argv[argi], "r"))) { 
       printf("cannot open %s\n",argv[argi]); return(3); 
      } 
     } 
    for(offset = 0; (!feof(fh1)) && (!feof(fh2)); offset++) 
    { 
     ch1=ch2='-'; 
     if(!feof(fh1)) ch1 = getc(fh1); 
     if(!feof(fh2)) ch2 = getc(fh2); 
     if(ch1 != ch2) { 
      fprintf(fh3,"%d:%c %c\n", offset, ch1, ch2); 
      //additional file here 
     } 
     else { 
      fprintf(fh3,"%c\n", ch1); 
      //additional file here 
     } 
    } 
    return 0; 
} 

更通常,你會讀出使用與fgets整個行,strcmp的對線進行比較。

char str1[1024], str2[1024]; 
    ... 
    for(offset = 0; (!feof(fh1)) && (!feof(fh2)); offset++) 
    { 
     strcpy(str1,"-");strcpy(str2,"-"); 
     if(!feof(fh1)) fgets(str1,sizeof(str1),fh1); 
     if(!feof(fh2)) fgets(str2,sizeof(str1),fh2); 
     if(strcmp(str1,str2)!=0) 
      fprintf(fh3,"%d:%s %s", offset, str1, str2); 
     else 
      fprintf(fh3,"%c", str1); 
    } 
+0

。文本文件與輸出文件的差異如何將差異放入第三個新創建的txt文件? – user2264035

+0

請注意,命令行的可選第三個參數可用於命名輸出文件,如果該參數被忽略,則使用stdout fprintf(fh3,...)打印stdout或命名文件 – ChuckCottrill

+0

非常感謝!我還有一個問題,假設有一個新文件fh4,我希望程序輸出相同的字符到(fh3 = fopen(argv [3],「w +」))){ printf(「無法打開%s \ n」,argv [ 3]); return(4);如果(fh4 = fopen(argc [4],「w +」))){ \t printf(「不能打開%s \ n」,argv [4]);返回(5); \t} }但是,我收到一個錯誤,說「下標值既不是數組也不是指針」。 – user2264035

相關問題