1

我正在尝试使用以下代码查找两个不同文件的字节长度,但是得到的字节长度为1,这显然是错误的。从长远来看,我正在尝试比较每个文件的内存位置并打印出它们的不同之处,如您所见。所以我没有得到任何结果,并做了printf陈述来看看问题可能出在哪里。因此,看起来我的长度没有正确计算。

旁注可能有助于解决我的问题 - 我为 memcmp 找到了这个,但这是否意味着我不能使用!=?:

if 返回值 if < 0 则表示 str1 小于 str2

if 返回值 if > 0 则表示 str2 小于 str1

if 返回值 if = 0 则表示 str1 等于 str2

请帮忙!

 void compare_two_binary_files(int f1, int f2)
 {
         ssize_t byte_read_f1, byte_read_f2, length, numRead, bob, length2;
         char buf1[BUF_SIZE], buf2[BUF_SIZE], a[100], b[100], counter[100];
         int count = 0, b_pos1, b_pos2;
         while ((byte_read_f1 = read(f1, buf1, sizeof buf1) > 0) && (byte_read_f2 = read(f2, buf2, sizeof buf2) >0)) {
                 length = byte_read_f1;
                 length2 = byte_read_f2;
                 printf("F1 byte length:%o\n", length);
                 printf("F2 byte length:%o\n", length2);
                 ssize_t len =  byte_read_f1 <byte_read_f2 ? byte_read_f1 : byte_read_f2;
                 b_pos1 = memcmp(buf1, buf2, len);
                 printf("Memcmp: %d\n", b_pos1);
                 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;
                         }
 }
4

3 回答 3

3

我认为while条件有一个错误:

while ((byte_read_f1 = read(f1, buf1, sizeof buf1) > 0) && 
       (byte_read_f2 = read(f2, buf2, sizeof buf2) >0))

您在哪里分配read(f1, buf1, sizeof buf1) > 0(结果为 true = 1)byte_read_f1 ,等等byte_read_f2

这可以帮助你吗?

更新

评论如何建议:

正确的形式是:

while (((byte_read_f1 = read(f1, buf1, sizeof buf1)) > 0) && 
       ((byte_read_f2 = read(f2, buf2, sizeof buf2)) >0))
于 2014-01-30T22:16:47.430 回答
1

>的优先级高于=,因此

if ((byte_read_f1 = read(f1, buf1, sizeof buf1) > 0) && ...)

相当于

if (byte_read_f1 = (read(f1, buf1, sizeof buf1) > 0) && ...)

如果至少读取了一个字节,则分配1给。byte_read_f1

你想要的是

if ((byte_read_f1 = read(f1, buf1, sizeof buf1)) > 0 && ...)

如果您的程序从非常规文件(例如标准输入)读取,那么您还必须考虑 read() 返回的字节数少于请求的字节数的情况。

对于常规文件,read() 总是返回请求的字节数,当然唯一的例外是在文件末尾。因此,如果文件的长度不同,那么在某些时候,read(f1, ...)将返回与 不同的数量read(f2, ...),或者一个返回零而另一个不返回。

于 2014-01-30T22:16:21.763 回答
0

fseek()'ing 到每个文件的末尾,并查询文件位置偏移量怎么样?fstat() 调用或类似的调用甚至可以直接告诉您大小。

于 2014-01-30T22:16:52.453 回答