gpt4 book ai didi

c++ - 这个 stdout 重定向是如何工作的?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:58:28 27 4
gpt4 key购买 nike

下面的代码将 stdout 重定向到文件 fname,然后重定向回原始 stdout。这对我来说可以。但我无法理解它实际上是如何工作的。如果有人能帮助我理解,我会很感激。

    printf("\n This is console");
fflush(stdout);
fgetpos(stdout, &pos);
fd = dup(fileno(stdout));
freopen(fname, "a+", stdout);

printf("inside file op");

fflush(stdout);
dup2(fd,fileno(stdout));
close(fd);
clearerr(stdout);
fsetpos(stdout, &pos);
printf("\nBack to Console");

最佳答案

让我们逐行分析。第一行向 stdout 打印一些内容:

printf("\n This is console");

然后它刷新 stdout,所以缓冲区中所有剩余的数据都被发送到 stdout 并且不会与文件数据混淆:

fflush(stdout);

现在我们将我们自己的当前位置存储在 stdout 中,否则如果 stdout 已经指向一个文件,我们可能(?)覆盖它的早期部分。

fgetpos(stdout, &pos);

现在我们克隆当前stdout 的文件描述符。由于我们即将更改 stdout 指向的位置,因此我们需要保留原始拷贝:

fd = dup(fileno(stdout));

现在我们已经保存了所有内容,我们可以将 stdout 作为文件重新打开:

freopen(fname, "a+", stdout);

此时,stdout 已经被重定向到文件。我们现在可以打印到它:

printf("inside file op");  

现在我们已经完成了文件的打印。我们需要刷新 stdout(现在是文件),这样它就不会与正常的 stdout 数据混淆:

fflush(stdout);

之后,我们将原始的 stdout 文件描述符克隆到当前的 stdout 描述符上。

dup2(fd,fileno(stdout));

克隆的现在可以关闭了:

close(fd);

我不太确定为什么会出现这种情况,但这会清除写入文件时发生的任何错误:

clearerr(stdout);

现在我们恢复我们在 stdout 中的位置。同样,据我所知,这仅在最初重定向到文件时才有用:

fsetpos(stdout, &pos);

现在我们回到原来的stdout,所以我们可以再次打印:

printf("\nBack to Console");

关于c++ - 这个 stdout 重定向是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6975189/

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