C 尝试使用文件i/o读写查找两个文件不同的字节位置
我试图用读写命令来比较两个文件,找出它们的不同之处,从某种意义上讲,我脱离了一本书的例子,认为我的比较函数是正确的,但我显然没有,因为sprintf函数会打印出来。我最好的猜测是我是如何比较这两个文件的: (更新代码) 我现在在这里。如果(memcmp(buf1,buf2,len)!=0){,它就不会进入C 尝试使用文件i/o读写查找两个文件不同的字节位置,c,file-io,C,File Io,我试图用读写命令来比较两个文件,找出它们的不同之处,从某种意义上讲,我脱离了一本书的例子,认为我的比较函数是正确的,但我显然没有,因为sprintf函数会打印出来。我最好的猜测是我是如何比较这两个文件的: (更新代码) 我现在在这里。如果(memcmp(buf1,buf2,len)!=0){,它就不会进入: void比较两个二进制文件(int f1,int f2) { //写(1,sprintf,10); ssize_t byte_read_f1,byte_read_f2,长度,numRead,
:
void比较两个二进制文件(int f1,int f2)
{
//写(1,sprintf,10);
ssize_t byte_read_f1,byte_read_f2,长度,numRead,bob;
字符buf1[BUF_大小]、buf2[BUF_大小]、a[100]、b[100]、计数器[100];
int count=0,b_pos1,b_pos2,嘿;
而((字节读取=read(f1,buf1,sizeof buf1)>0)和&(字节读取=read(f2,buf2,sizeof buf2)>0)){
ssize_t len=byte_read_f1需要单独的缓冲区,并使用memcmp
和/或循环来比较字节。
所有人都知道文件长度可能不同
// Untested code
char buf1[BUF_SIZE];
char buf2[BUF_SIZE];
while (((byte_read_f1 = read(f1, buf1, sizeof buf1)) > 0) &&
((byte_read_f2 = read(f2, buf2, sizeof buf2)) > 0)) {
// find min length
ssize_t len = byte_read_f1 <byte_read_f2 ? byte_read_f1 : byte_read_f2;
if (memcmp(buf1, buf2, len) != 0) { // use memcmp for speed
ssize_t i;
for (i = 0; i<len; i++) {
if (buf1[i] != buf2[i]) break;
}
sprintf(counter, "Byte pos where two files differ is:%lld\n", (long long) count + i);
sprintf(a, "Byte value of file 1: %hho\n", buf1[i]);
sprintf(b, "Byte value of file 2: %hho\n", buf2[i]);
break;
}
count += len;
// If lengths differ
if (byte_read_f1 != byte_read_f2) {
sprintf(counter, "Byte pos where two files differ in length: %lld\n", (long long) count);
// TBD code for a and b
break;
}
}
//未测试的代码
字符buf1[BUF_大小];
字符buf2[BUF_大小];
而((byte_read_f1=read(f1,buf1,sizeof buf1))>0)和
((字节_read_f2=read(f2,buf2,sizeof buf2))>0)){
//查找最小长度
ssize\u t len=byte\u read\u f1先读取read
。1.您正在将两个文件中的n个字节读取到同一个缓冲区中--测试时,它们总是“相同的”.2.您正在比较读取的字节数。3.您无法使用==
@Jongware来比较字符数组。如果您正在比较读取的字节数,则是因为后续的memcmp()
还需要正确读取的缓冲区。请缩进代码consistently@chux:当然可以,但OP似乎也希望这样比较字节。OP:chux的意思是,如果byte\u read\u f1!=byte\u read\u f2
,则不必进行比较——读取的字节数不同,因此文件在这一点上不同。@chux-所以循环的buf,buf部分很好,只是你说的memcmp()。@Chux或其他人-你能告诉我为什么write像我第一篇文章中那样工作,而不是将write语句放在if语句中吗?我仍然得到%lld,%hho,etc@OSU_2016不清楚您的请求。read()
在一个中,而在原始帖子和这个答案中都是循环。read()
不在if()
语句中。@OSU\u 2016请显示您的代码“仍然获得%lld,%hho的输出”。@OSU\u 2016基于您最近的帖子,我已经更正了这个错误。
void compare_two_binary_files(int f1, int f2)
{
ssize_t byte_read_f1, byte_read_f2, length, i;
char buf1[BUF_SIZE], buf2[BUF_SIZE], a[BUF_SIZE], b[100], counter[100];
int count = 0;
while ((byte_read_f1 = read(f1, buf1, BUF_SIZE) > 0) && (byte_read_f2 = read(f2, buf2, BUF_SIZE) >0)){
if (byte_read_f1 != byte_read_f2){
sprintf(counter, "Byte pos where two files differ is:%lld\n", (long long) count + 1);
sprintf(a, "Byte value of file 1: %o\n", buf1[i]);
sprintf(b, "Byte value of file 2: %o\n", buf2[i]);
write(1, counter, 100);
write(1, a, 100);
write(1, b, 100);
}
i++;
count++;
}
}
void compare_two_binary_files(int f1, int f2)
{
//write(1, sprintf, 10);
ssize_t byte_read_f1, byte_read_f2, length, numRead, bob;
char buf1[BUF_SIZE], buf2[BUF_SIZE], a[100], b[100], counter[100];
int count = 0, b_pos1, b_pos2, hey;
while ((byte_read_f1 = read(f1, buf1, sizeof buf1) > 0) && (byte_read_f2 = read(f2, buf2, sizeof buf2) >0)) {
ssize_t len = byte_read_f1 <byte_read_f2 ? byte_read_f1 : byte_read_f2;
if (memcmp(buf1, buf2, len) != 0){
ssize_t i;
for (i = 0; i<len; i++){
if (buf1[i] != buf2[i]) break;
}
sprintf(counter, "Byte pos where two files differ is:%lld\n", (long long) count + i);
write(1, counter, 100);
sprintf(a, "Byte value of file 1: %hho\n", buf1[i]);
sprintf(b, "Byte value of file 2: %d\n", buf2[i]);
write(1, counter, 100);
write(1, b, 100);
write(1, a, 100);
break;
}
count += len;
}
}
// Untested code
char buf1[BUF_SIZE];
char buf2[BUF_SIZE];
while (((byte_read_f1 = read(f1, buf1, sizeof buf1)) > 0) &&
((byte_read_f2 = read(f2, buf2, sizeof buf2)) > 0)) {
// find min length
ssize_t len = byte_read_f1 <byte_read_f2 ? byte_read_f1 : byte_read_f2;
if (memcmp(buf1, buf2, len) != 0) { // use memcmp for speed
ssize_t i;
for (i = 0; i<len; i++) {
if (buf1[i] != buf2[i]) break;
}
sprintf(counter, "Byte pos where two files differ is:%lld\n", (long long) count + i);
sprintf(a, "Byte value of file 1: %hho\n", buf1[i]);
sprintf(b, "Byte value of file 2: %hho\n", buf2[i]);
break;
}
count += len;
// If lengths differ
if (byte_read_f1 != byte_read_f2) {
sprintf(counter, "Byte pos where two files differ in length: %lld\n", (long long) count);
// TBD code for a and b
break;
}
}