【发布时间】:2021-09-14 00:47:41
【问题描述】:
我正在尝试从文件中读取并打印出来供用户阅读。我的任务类似于 UNIX 'cat' 命令,但我的代码不打印任何内容。
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h> //for printf
int main(int argc, char *argv[])
{
int fd;
char buffer;
if(argc==1)
fd=open(argv[1],O_RDONLY);
else
if (fd=open(argv[1],O_RDONLY) ==0){
printf("Error opening");
return(0);
}
while((read(fd,&buffer,1)) != -1){
read(fd,&buffer,1);
write(STDOUT_FILENO,buffer, 1);
}
return(0);
}
【问题讨论】:
-
为什么要打开文件两次?
-
这有很多问题,如果您打开警告,您的编译器会告诉您其中一些问题(
-Wall -Wextra是 gcc 和 clang 的良好开端)。 -
if(argc==1) fd=open(argv[1],O_RDONLY);如果argc < 2访问argv[1]是不合法的。 -
@RetiredNinja 如果
argc为1,则argv[1]保证为空指针。当然,您不应该将其传递给open,但仅访问它是合法的。 -
在执行
read/write时,缓冲区大小为 1 有点慢。每个调用都是一个内核 用户空间上下文切换,具有复杂的错误处理。建议使用更大的缓冲区和更复杂的错误处理。幸运的是,libc 已经提供了易于使用的缓冲区。使用fopen和fclose的文件流,然后可以使用fgetc和fputc进行单字节IO。