我想编写一个比较两个文本文件的程序,并将文件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;
}
答案 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文件并访问内存。