- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:我已经成功缩小了问题范围,但对我来说仍然没有多大意义。我的代码变成8行:
int savedOut = dup(1);
printf("Changing the outstream to process.txt!")
if ( freopen("process.txt", "w"m stdout) == NULL)
printf("FREOPEN() FAILURE")
printf("Print to File\n");
dup2(savedOut, 1);
printf("Done with print to file");
return 1;
此代码将所有内容打印到终端。使用“savedOut”删除这两行会将所有内容打印到 process.txt。我理解后一个结果,但我不理解前一个结果。
编辑结束
我在使用 freopen()
时遇到很多困难。获取这段代码:
int savedIn = dup(0);
int savedOut = dup(1);
while(1)
{
readFile[0] = '\0';
writeFile[0] = '\0';
dup2(savedIn, 0);
dup2(savedOut, 1);
if(getInputFlag == 1)
{
printf("myshell$ ");
gotInputFlag = getUserInput(arguments, command, readFile, writeFile, catOrApp, bkgdFlag);
}
else
{
gotInputFlag = getUserInput(arguments, command, readFile, writeFile, catOrApp, bkgdFlag);
}
if(gotInputFlag == 1)
{
history[historySize] = (char*)malloc(sizeof(char) * 1000);
if (writeFile[0] != '\0' && *catOrApp == 0)
{
printf("Changing the outstream!\n");
freopen(writeFile, "w", stdout);
}
printf("Print to File\n");
dup2(savedIn, 0);
dup2(savedOut, 1);
printf("Done with print to file!\n");
...
该程序将执行并打印“Changing the Outstream!”正如预期的那样。 “打印到文件!”永远不会打印,既不打印到终端,也不打印到 writeFile。 “完成打印到文件!\n”也不打印。稍后在代码中,代码调用 Hello World 程序上的 execv()
,该程序按预期打印到终端。然而,程序终止后,突然所有 printf 语句都打印到终端,甚至是“打印到文件”语句。
保存为单个 fgets()
,getUserInput()
不适用于流。
我一生都无法理解为什么会发生这种情况。有人知道吗?
最佳答案
我相信正在发生的事情都与流缓冲有关。您将从指向您的终端的 stdout 开始。因为它是字符设备,所以流是行缓冲的。您打印 Changing the outstream to process.txt!
不带换行符,以便文本保留在缓冲区中。现在,您重新打开文件的标准输出;流切换到全缓冲。然后,您打印Print to File\n
,尽管有换行符,它仍保留在缓冲区中。
现在您使用 dup2 将 stdout 更改回终端。然而,这适用于流下的 fd。流库代码不知道此更改,并让流完全缓冲。您再次打印并退出,这会将流刷新到 fd(现在是您的终端)。
在每个 printf
之后添加 fflush
调用,我敢打赌您会看到您期望的行为。
关于c - freopen() 和流的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19430619/
编辑:我已经成功缩小了问题范围,但对我来说仍然没有多大意义。我的代码变成8行: int savedOut = dup(1); printf("Changing the outstream to p
我是 C++ 的初学者,我有一个超出我能力范围的问题。我在 GNU GCC 下编译。我用 #include 也称为: #include 在我的程序中的某个时刻,我告诉程序使用文件 de_facut.t
知道为什么会这样: #include #include int nrpart; int k; void main() { printf("lol"); freopen("p2.in
我正在使用我的共享库将 freopen 用于 GUI 应用程序,这样我就可以将调试消息从 stdout 重定向到一个文件 我一直在使用基于 C++ 引用站点片段的代码: /* freopen exam
我正在编写一个 Qt GUI 应用程序(用于进行 XSL 转换)。要将错误消息打印到文件,我正在使用如下调用: freopen("my-error-file.txt", "w", stderr); /
给定以下函数: freopen("file.txt","w",stdout); 将 stdout 重定向到一个文件中,如何使 stdout 重定向回控制台? 我会注意到,是的,还有其他类似的问题,但是
我在执行 2 个连续的 freopen 时遇到错误,file1 包含偶数个整数 int x, y; freopen("file1", "r", stdin); while (cin >> x) {
我正在尝试使用文件重定向 stdout 和 stderr 的输出。我正在使用 freopen,它会在正确的目录中创建文件,但文件是空白的。当我注释掉重定向 stdout 和 stderr 的代码时 -
试图implement freopen() ,据我所知,我在标准中找到了一条实际上没有指定任何内容的规范。 所以... freopen()将关闭流(忽略错误),清除其错误和 EOF 标志,重置宽方向,
我有一个程序,该程序获取两个路径作为命令行参数。第一个参数(实际上是第二个参数,因为第一个是命令名称本身)是程序从中读取文件(输入文件)的路径。第二个是程序写入的文件(输出文件)的路径。 int ma
目前,这是我创建的代码,但我似乎找不到其背后的问题。我正在编写一个加密程序 int countWords(FILE *f){ int count = 0; char ch; whil
我正在尝试使用 freopen 写入子目录内的文件: freopen("output/output-1.txt", "w", stdout); 我尝试将其更改为输出到当前目录并且它有效。当目标输出文件
我有一堆批处理文件,用程序 A 做这样的事情: A > log.txt ; grep 'result:' log.txt > result.txt || raise_hell.sh 我想做的是修改 A
我正在尝试创建一个文件,其名称是一个字符串常量,但是一个由常量字符串“List”组成的字符串,一个整数++ 一个扩展名。这是我的代码: #include #include #include #i
来自 In multi thread application how can i redirect stderr & stdout in separate file as per thread? 的扩
这是 How to capture output of printf? 的后续行动- 特别是 jxh 的回答。 我在 Viesturs 在 2018 年的答案中遇到了同样的问题。有人建议他打开一个新问
freopen 的签名是FILE * freopen (const char * filename, const char * mode, FILE * stream) 根据文档,返回值与 strea
我尝试编译并运行具有以下几行的 C 代码: FILE *preproc_producer = NULL; preproc_producer = tmpfile(); // preproc_produc
你好,我想知道在我调用之后我们如何再次从 stdin 获取输入: freopen("Smefile.txt","r",stdin); 准确地说,我希望我的程序的第一个部分应该从指定的文件中获取输入,下
我尝试使用以下命令从标准输出重定向我的 C++ 程序中的输出: freopen(cmd.c_str(),"w",stdout); 然后调用system执行cmd。我也尝试过 fork 然后调用
我是一名优秀的程序员,十分优秀!