freopen未写入指定的文件
freopen not writing to the specified file
我正在尝试使用一个文件重定向stdout和stderr的输出。我使用的是freopen,它会在正确的目录中创建文件,但文件是空白的。当我注释掉重定向stdout和stderr的代码时,输出会显示在控制台上。
这是代码:
freopen(stderrStr.c_str(), "a+", stderr); //where stderrStr and stdoutStr are the path/file name
freopen(stdoutStr.c_str(), "a+", stdout);
fclose(stdout);
fclose(stderr);
我在main中放置了一个printf("I WORK"),并没有它输出的抑制器,但不会写入文件。
为了完成您想要做的事情,我使用了dup2(2)。
只需打开(2)两个文件fd1和fd2,然后对stdout使用dup2(fd1, 1)
,对stderr使用dup2(fd2, 2)
。
操作系统(libc、加载程序或内核,不确定是哪一个)在进入main之前设置了3个打开的文件描述符:
0 : stdin pipe
1 : stdout pipe
2 : stderr pipe
和来自dup2的文档:
dup2(int oldfd,int newfd)使newfd成为oldfd的副本,必要时先关闭newfd
因此,这两个dup2调用将1和2替换为打开的文件。因此,当您的进程向fd 1或fd 2调用write(2)(系统调用所有输出例程,如printf和cout调用)后,数据将被写入您的文件,而不是OS 设置的管道
手册页注释:
手册页分为几章。符号foo(N)表示第N章中名为"foo"的手册页。要打开foo(N),请键入:
$ man N foo
例如打开写(2)类型:
$ man 2 write
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中使用 freopen 时如何检测文件结尾?
- freopen和fwprintf将不正确的宽字符写入TXT文件
- 使用C 中的Freopen打开多个文件
- 使用freopen()打印到文件和屏幕
- 尝试使用freopen创建输出文件,使用非常量字符串
- Eclipse 在使用 freopen 或 fopen CPP 时无法读取文件
- freopen未写入指定的文件
- Freopen多文件输入-C++