使用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
相关产品推荐
相关产品推荐

