2016-06-25 6 views
0

私は2つのテキストファイルを比較し、それらが異なる最初の行を印刷しようとしていますが、fgets()コマンドで500のバッファを使用しています。 行の長さが分からない場合、どうすれば同じプログラムを作成できますか?ここでcで2つのtxtファイルを比較する

は私のコードです:

#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

ファイルがない場合あなたは無限ループを持っています。 'fgets()'の戻り値を確認してください。 – chux

+0

charが異なっていれば、両方のファイルの文字を比較し、行を印刷する関数を呼び出すことができます。私たちがこのラインに従っていないので、これは難しいことがあります。改行文字を取得するまで、逆方向にトラバースすることができます。その行を印刷します。 –

+1

目的を達成するためにバッファーは必要ありません。私は、即座にコレスポンデントのキャラクタを比較し、プロセスで直面した最新の改行文字を覚えています。 – mw215

答えて

2

あなたは「廃棄物の空間」にしたくない場合は、データがファイルメモリであることを覚えておいてください。時間に1文字を読む。差異が見つかったら、前の改行の場所にを探して、次の行を報告してください。

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 
} 

[編集]様々な問題に対処するためにいくつかの改善点:等の最後のバイトのミスマッチ、異なるモードで開いたファイル、エラー処理、

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

'if(c1 == EOF && c2 == EOF)'の条件を 'if(c1 == c2)'に短縮できますか? –

+0

@Chrono Kitsuneはい、それは可能です - 非常に良い。 – chux

関連する問題