You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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 ツ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:19:21