我正在尝试使用以下代码查找两个不同文件的字节长度,但是将字节长度设置为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;
}
}
答案 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()调用或类似的东西甚至可以直接告诉你大小。