C 使用文件i/o读取字节长度
我试图用下面的代码找到两个不同文件的字节长度,但得到的字节长度为1,这显然是错误的。 从长远来看,我试图比较每个文件的内存位置,并打印出它们的不同之处,如您所见。因此,我没有取得任何进展,我做了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 救
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