0

我想编写一个程序来比较两个文本文件并将文件二中与文件一不同的每个字节写入第三个文件。问题是必须将文本文件读入动态分配的数组中。这些数组逐字节进行比较,文件二的数组中与文件一的数组不同的任何字节都将被放入第三个数组中。然后将该数组复制到一个新的文本文件中。这将如何实现?

基本上,以下代码如何使用动态分配的数组获得相同的结果?

#include <stdio.h>
int main(int argc, char *argv[])
{
    int offset;
    int ch1, ch2;
    FILE *fh1, *fh2, *fh3=stdout;
    if( argc<3 ) {
        printf("need two file names\n"); return(1);
    }
    if(!(fh1 = fopen(argv[1], "r"))) {
        printf("cannot open %s\n",argv[1]); return(2);
    }
    if(!(fh2 = fopen(argv[2], "r"))) {
        printf("cannot open %s\n",argv[2]); return(3);
    }
    if(argc>3) {
        if(!(fh3 = fopen(argv[3], "w+"))) {
            printf("cannot open %s\n",argv[3]); return(4);
        }
    }
    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);
        else
            fprintf(fh3,"%c\n", ch1);
    }
    return 0;
}
4

1 回答 1

0

简单的方法可能是使用 fseek() + ftell() 来确定文件的大小并然后分配空间。另一种方法可以是

size_t pos = 0;
size_t allocated = 1024;  /* arbitrary value */
void *tmp = malloc(allocated);
BUG_ON(!tmp)
while (!feof(f)) {
    size_t l = fread(tmp + pos, 1, allocated - pos, f);
    pos += l;
    allocated += l + 1024;    /* arbitrary value */
    tmp = realloc(tmp, allocated);
    BUG_ON(!tmp);
}

tmp = realloc(tmp, pos);  /* free unneeded space */

在 Linux/POSIX 下,可以直接映射文件并访问内存。

于 2013-10-30T01:30:49.150 回答