【发布时间】:2021-12-30 02:44:34
【问题描述】:
被要求获取 2 个文件,并带有一个文件描述符 - 检查两者上的每个字符并查看是否相等,如果文件 n.1 中的 1 个字符与文件 n.2 不同 - 返回 1,如果两个文件都有相同的内容 - 返回 2,如果除了我提到的之外还有任何情况(问题) - 返回 0/1。
我的问题是程序每次都返回 2,如果 2 个文件具有以下内容:“abcd”,或者即使一个文件具有:“abcd”而另一个文件具有:“abcg”/“abc”。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/fcntl.h>
#include <errno.h>
int main(int argc, char * argv[]){
if(argc != 3)
return 0;
int fd1 = open(argv[1], O_RDONLY);
int fd2 = open(argv[2], O_RDONLY);
if(fd1 == -1 || fd2 == -1)
return 0;
char c1, c2;
if(read(fd1, &c1, 1) == 0 || read(fd2, &c2, 1) == 0)
return 1;
if(c1 != c2)
return 1;
while(read(fd1, &c1, 1) == 0 || read(fd2, &c2, 1) == 0){
if(c1 != c2)
return 1;
}
return 2;
}
在此先感谢各位,对于语法错误,我深表歉意,英语不是我的主要语言。
【问题讨论】:
-
解释一下while:
while(at_end_of_file(fd1) || at_end_of_file(fd2))——如果文件长于一个字符,则根本不会进入循环。 -
@dratenik 嘿,感谢您的快速回复:)您能否进一步解释一下?我对此很陌生
-
没有理由单独检查第一个字符,折腾
if read...。你需要重新思考这个循环。 -
此外,逐字节读取文件的效率非常低。您应该读取更大的块(一次可能 64 K)并比较这些块,例如与
memcmp -
@Jabberwocky ,我的老师告诉我们检查每个字符来完成这项任务,但我仍然不明白为什么程序只返回 2,而不是如果文件不同则返回 1他们拥有的内容:/
标签: c system-calls file-descriptor