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

我试图用以下代码找到两个不同文件的字节长度,但得到字节长度为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; } } 

>因此优先级高于=

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

相当于

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

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

你想要的是什么

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

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

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

我认为在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_f1byte_read_f2

这可以帮到你吗?

更新

评论意见如何:

正确的表格将是:

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

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