1

我需要逐行比较两个文件。其中一个文件在行尾有一个类似 ^M 的字符。我想在比较时排除它。我还需要找到匹配的行数。这是我的代码。如何添加该 ^M 以及在哪里增加行 contor?

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 各有自己的)。

您可能应该将输入拆分为行,忽略使用的确切行终止,然后比较

更新编写一个函数,一次读取一个字符,当它到达任何有效的行终止序列时停止,并确保随着行的增长动态分配内存。

于 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 回答