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

使用dup2与printf写入文件失败求助:代码无内容写入目标文件

解决printf通过dup2重定向后无法写入文件的问题

我来帮你排查这个问题,你的代码有两个关键问题导致"test"没有写入到目标文件里:

1. open函数参数不完整

当你使用O_CREAT标志创建新文件时,必须传入第三个参数指定文件权限,否则会触发未定义行为(比如文件权限异常,甚至无法正常写入)。你当前的调用缺少了这个权限参数,这是第一个隐患。

2. printf的缓冲区未刷新

printf是带缓冲的I/O函数:当输出目标是终端时,它是行缓冲(遇到换行符就刷新);但当输出被重定向到文件时,默认是全缓冲——也就是说,只有当缓冲区满了,或者程序显式刷新缓冲、关闭文件时,内容才会写入磁盘。你只调用了printf("test");,没有换行也没有主动刷新,缓冲区的内容就没被写入文件。


修正后的完整代码

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

int main(int argc, char const *argv[]) { 
    // 补充O_CREAT对应的权限参数0644(可根据需求调整)
    int fichier = open("ecrire.txt", O_APPEND | O_WRONLY | O_CREAT, 0644); 
    if (fichier == -1) { // 增加错误检查,快速定位open失败原因
        perror("open failed");
        return EXIT_FAILURE;
    }
    dup2(fichier, 1); 
    printf("test");
    fflush(stdout); // 强制刷新stdout缓冲区,确保内容写入文件
    close(fichier); // 关闭文件描述符,也会触发缓冲刷新(好习惯)
    return EXIT_SUCCESS; 
}

额外说明

  • 权限参数0644表示文件所有者可读可写,同组和其他用户可读,是常规文件的常用权限,你可以根据实际需求修改(比如0666表示所有用户可读可写)。
  • 增加perror错误检查可以帮你快速定位open是否失败(比如路径权限不足、磁盘空间不够等问题)。
  • 除了调用fflush,你也可以在printf的字符串末尾加换行符printf("test\n");,部分环境下文件输出的行缓冲会因换行触发刷新,但显式调用fflush的兼容性和可靠性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:13:03