如何用open()、read()、write()读取程序运行时传入的文件内容?
用open()/read()/write()实现命令行传参读取文件内容
你的代码存在几个问题,会导致文件内容丢失、读取错误或逻辑混乱,下面先指出问题,再给出正确的实现:
原代码的问题
- 未检查命令行参数数量:如果运行程序时没传入文件名,
argv[1]为空,open会直接出错 - 首次读取的内容未输出:第一次
read把文件开头的1024字节读到buffer里,但之后没有将这部分内容写入标准输出,直接丢弃了 malloc后的缓冲区使用错误:sizeof(buf)是指针的大小(通常8字节),不是你分配的内存大小,循环读取时会限制每次最多读8字节,效率极低还可能出错- 错误信息输出到了标准输出:应该用文件描述符2(stderr)输出错误,避免和正常文件内容混在一起
- 未处理
read返回-1的错误情况:读取过程中出现错误时没有处理逻辑 - 空文件判断后未退出:空文件判断后继续执行后面的代码,
malloc(0)的行为是实现定义的,存在风险
正确的实现代码
#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char const *argv[]) { // 检查是否传入了文件名参数 if (argc != 2) { write(STDERR_FILENO, "用法: 程序名 文件名\n", 16); return EXIT_FAILURE; } // 打开文件,只读模式 int fd = open(argv[1], O_RDONLY); if (fd == -1) { write(STDERR_FILENO, "无法打开文件\n", 12); return EXIT_FAILURE; } // 定义固定大小的缓冲区,循环读取并输出 unsigned char buffer[1024]; ssize_t bytes_read; while ((bytes_read = read(fd, buffer, sizeof(buffer))) > 0) { // 将读取到的内容写入标准输出 write(STDOUT_FILENO, buffer, bytes_read); } // 处理读取错误 if (bytes_read == -1) { write(STDERR_FILENO, "读取文件出错\n", 12); close(fd); return EXIT_FAILURE; } // 关闭文件 close(fd); return EXIT_SUCCESS; }
代码说明
- 参数检查:先判断
argc是否等于2,确保用户传入了文件名,否则提示用法 - 文件打开:用
O_RDONLY只读模式打开文件,失败时输出错误到stderr - 循环读写:用1024字节的缓冲区循环读取文件,每次读取后立即写入标准输出,直到
read返回0(文件读完)或-1(出错) - 错误处理:单独处理
read返回-1的情况,输出错误信息后退出 - 资源释放:最后关闭文件描述符,避免资源泄漏
这个实现逻辑简单清晰,符合你只能用open()/read()/write()的要求,同时处理了各种异常情况。
内容的提问来源于stack exchange,提问作者marko MK ツ
相关产品推荐
相关产品推荐

