使用文件i / o读取字节长度

时间:2014-01-30 22:07:46

标签: c file-io memcmp

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

可能有助于解决我的问题的附注 - 我发现这是针对memcmp的,但这是否意味着我无法使用!=?:

如果返回值为< 0然后它表示str1小于str2

如果返回值为> 0然后它表示str2小于str1

如果返回值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;
                         }
 }

3 个答案:

答案 0 :(得分:2)

我认为在这段时间里有一个错误:

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))

答案 1 :(得分: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, ...)不同的金额, 或者一个返回0而另一个不返回。

答案 2 :(得分:0)

如果fseek()到每个文件的末尾,并查询文件位置偏移量? fstat()调用或类似的东西甚至可以直接告诉你大小。

相关问题