1

2つのファイルを1行ずつ比較する必要があります。ファイルの1つに、行末に^Mのような文字があります。比較する際には除外したいと思います。また、一致した行数を見つける必要があります。これが私のコードです。その^Mを追加する方法と、ラインコントローラーをインクリメントする場所は?

int compareFile(FILE* file_compared, FILE* file_checked)
{
    bool diff = 0;
    int N = 65536;
    char* b1 = (char*) calloc (1, N+1);
    char* b2 = (char*) calloc (1, N+1);
    size_t s1, s2;

    do {
        s1 = fread(b1, 1, N, file_compared);
        s2 = fread(b2, 1, N, file_checked);

        if (s1 != s2 || memcmp(b1, b2, s1)) {
            diff = 1;
            break;
        }
      } while (!feof(file_compared) || !feof(file_checked));

    free(b1);
    free(b2);

    if (diff) return 0;
    else return 1;
}

void main(int argc, char *argv[] )
{
FILE *fpread, *fpread2;
  char filebuff[MAXLINE];
  char filebuff2[MAXLINE];
  int var = 0;
  int linecount = 0;
printf ("COMPARE RESULT %d \n",compareFile("file1","file2"));
4

2 に答える 2

1

^M実際には、キャリッジリターン文字(ASCII 13、C構文)が表示され\rます。テキストファイルを比較するときは、いくつかある(Unix、Windows、Macにはそれぞれ独自の)ため、使用される回線終了モードを気にしないのが最善です。

おそらく、使用されている正確な行末を無視して、入力を行に分割し、行を比較する必要があります

UPDATE一度に1文字を読み取り、有効な行末シーケンスに達すると停止する関数を記述し、行が大きくなるにつれてメモリを動的に割り当てるようにします。

于 2012-09-13T08:39:46.577 に答える
0

まず最初に:

int diff = 0;

カウンターをインクリメントします。

if (s1 != s2 || memcmp(b1, b2, s1)) {
    ++diff;
}

そして最後にこれだけ:

return diff;

また、関数は次のようになります。

int compareFile(char* fc_name,char* fk_name){
    /* Variable Declarations */
    FILE *file_compared = fopen(fc_name,"r");
    FILE *file_checked = fopen(fk_name,"r");
    if(file_compared == NULL || file_checked == NULL)
          return -1;
    /* .... */
}
于 2012-09-13T08:43:37.827 に答える