gpt4 book ai didi

c - freopen() 和流的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 17:46:08 25 4
gpt4 key购买 nike

编辑:我已经成功缩小了问题范围,但对我来说仍然没有多大意义。我的代码变成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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com