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

C 使用文件i/o读取字节长度,c,file-io,memcmp,C,File Io,Memcmp,我试图用下面的代码找到两个不同文件的字节长度,但得到的字节长度为1,这显然是错误的。 从长远来看,我试图比较每个文件的内存位置,并打印出它们的不同之处,如您所见。因此,我没有取得任何进展,我做了printf语句,看看问题出在哪里。因此,看起来我的长度没有正确计算 旁注:这可能有助于解决我的问题-我为memcmp找到了这个,但这是否意味着我不能使用=?: 如果返回值小于0,则表示str1小于str2 如果返回值if>0,则表示str2小于str1 如果返回值if=0,则表示str1等于str2 救

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

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

如果返回值小于0,则表示str1小于str2

如果返回值if>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;
                         }
 }
void比较两个二进制文件(int f1,int f2)
{
ssize_t byte_read_f1,byte_read_f2,长度,numRead,bob,长度2;
字符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)){
长度=字节\读取\ f1;
length2=字节_read _f2;
printf(“F1字节长度:%o\n”,长度);
printf(“F2字节长度:%o\n”,长度2);

因此,ssize\u t len=byte\u read\u f1
的优先级高于
=

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

if (byte_read_f1 = (read(f1, buf1, sizeof buf1) > 0) && ...)
如果至少读取了一个字节,则将
1
分配给
byte\u read\u f1

你想要的是

if ((byte_read_f1 = read(f1, buf1, sizeof buf1)) > 0 && ...)
如果您的程序读取的不是常规文件(如标准输入) 然后,还要考虑读()返回的字节比请求少的情况。

对于常规文件,read()始终返回请求的字节数, 当然只有文件末尾的例外。因此,如果文件长度不同, 然后在某个点,
read(f1,…)
将返回与
read(f2,…)
不同的量,
或者一个返回零,另一个不返回。

的优先级高于
=
,因此

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

if (byte_read_f1 = (read(f1, buf1, sizeof buf1) > 0) && ...)
如果至少读取了一个字节,则将
1
分配给
byte\u read\u f1

你想要的是

if ((byte_read_f1 = read(f1, buf1, sizeof buf1)) > 0 && ...)
如果您的程序读取的不是常规文件(如标准输入) 然后,还要考虑读()返回的字节比请求少的情况。

对于常规文件,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\u read\u f1
对于
字节读取
,也是如此

这个能帮你吗

使现代化 评论如何表明:

正确的表格为:

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

我认为在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\u read\u f1
对于
字节读取
,也是如此

这个能帮你吗

使现代化 评论如何表明:

正确的表格为:

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

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

fseek()定位到每个文件的末尾,并查询文件位置偏移量如何?fstat()调用或类似的操作可能会直接告诉您大小。

这是实际代码吗?只有在不添加两个右大括号的情况下它才会编译。这是实际代码吗?只有在不添加两个右大括号的情况下它才会编译。为了澄清:可能的预期形式是
((byte\u read\u f1=read(f1,buf1,sizeof buf1))>0)
谢谢@zebediah49我将此澄清添加到回答中以澄清:可能的预期形式是
((byte_read_f1=read(f1,buf1,sizeof buf1))>0)
谢谢@zebediah49我将此澄清添加到回答中,我将在何处使用
lseek()调整文件偏移量
?我在while循环之前猜测?然后使用
SEEK\u CUR
执行一个if语句来比较两个文件是否位于不同的位置,如果是,则返回轨道或其他什么?@OSU\u 2016:我又想了一次。如果只比较常规文件,那么read()总是按照您的要求读取尽可能多的字符,当然只有文件末尾的例外。-如果您的程序还必须处理其他文件描述符,例如来自终端的标准输入,则读取()可能会返回更少的字符。但您无法在这些文件描述符上查找。如果是这样,您必须接受第二个建议。我的程序是模仿
cmp
命令。我只担心比较两个文件,而不是标准输入。因此我仍然需要
lseek()
对吗?@OSU_2016:cmp命令可以从标准输入中读取。但如果只从常规文件读取,则读取()尽可能多地读取,因此您不必搜索。好的。这是否意味着我不需要担心,就让它保持原样?因此,如果两个文件长度不同,我的代码仍然有效?我将在哪里使用
lseek()调整文件偏移量
?我在while循环之前猜测?然后使用
SEEK\u CUR
执行一个if语句来比较两个文件是否位于不同的位置,如果是,则返回轨道或其他什么?@OSU\u 2016:我又想了一次。如果只比较常规文件,那么read()总是按照您的要求读取尽可能多的字符,当然只有文件末尾的例外。-如果您的程序还必须处理其他文件描述符,例如s