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

使用open()、write()、sprintf()实现数组逆序写入文件的问题排查

C程序文件写入错误排查与修复

常见错误原因

  • 文件打开模式不正确:未添加O_CREAT | O_TRUNC标志,要么文件不存在时无法创建,要么保留旧文件内容导致输出混乱;权限设置错误也会导致写入失败。
  • write调用的长度参数错误:硬编码写入长度,而非使用sprintf的返回值(实际生成的字符数),导致只写入部分内容。
  • 缓冲区逻辑漏洞:循环中未正确重置缓冲区,残留旧数据,或者仅写入了最后一次生成的内容。

修复后的完整代码

#include <fcntl.h>
#include <unistd.h>

int main() {
    int arr[10];
    char buf[32];
    int fd;
    int i;
    int read_len;

    // 读取10个输入元素(终端输入逻辑)
    for (i = 0; i < 10; i++) {
        read_len = read(0, buf, sizeof(buf) - 1);
        buf[read_len] = '\0'; // 确保字符串结束
        sscanf(buf, "%d", &arr[i]);
    }

    // 打开输出文件:创建/清空、只写模式,设置常规权限
    fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        sprintf(buf, "文件打开失败\n");
        write(1, buf, 12);
        return 1;
    }

    // 输出标题到终端和文件
    int title_len = sprintf(buf, "逆序输出结果:\n");
    write(1, buf, title_len);
    write(fd, buf, title_len);

    // 逆序遍历数组,逐个写入
    for (i = 9; i >= 0; i--) {
        int str_len = sprintf(buf, "%d ", arr[i]);
        // 同步写入终端和文件
        write(1, buf, str_len);
        write(fd, buf, str_len);
    }

    // 写入换行符
    write(1, "\n", 1);
    write(fd, "\n", 1);

    close(fd);
    return 0;
}

关键修复说明

  1. 文件打开参数修正:

    • O_WRONLY:仅写模式
    • O_CREAT:文件不存在时自动创建
    • O_TRUNC:文件存在时清空原有内容
    • 0644:设置文件权限为所有者读写、其他用户只读,避免权限问题
  2. 精确控制写入长度:
    利用sprintf的返回值(实际生成的字符数)作为write的第三个参数,确保每次都写入完整的字符串,避免因硬编码长度导致的部分内容写入。

  3. 同步终端与文件写入逻辑:
    终端(文件描述符1)和输出文件使用完全相同的缓冲区生成与写入逻辑,保证两者输出内容一致。

  4. 缓冲区安全处理:
    输入时手动添加字符串结束符,避免sscanf读取错误;循环中每次重新生成缓冲区内容,防止旧数据残留。

内容的提问来源于stack exchange,提问作者stackunderflow3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:05:48