如何将两个文本文件读入两个动态分配的数组并在c中逐字节比较?

时间:2013-10-30 01:20:12

标签: c arrays text dynamic-memory-allocation difference

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

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

#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;
}

1 个答案:

答案 0 :(得分: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下时,你可以直接mmap文件并访问内存。