freopen stdout和控制台

时间:2011-10-05 16:47:16

标签: c windows stdout

给出以下功能:

freopen("file.txt","w",stdout);

将stdout重定向到一个文件中,如何将stdout重定向回控制台?

我会注意到,是的还有其他类似的问题, 但是 它们与linux / posix有关。我正在使用Windows。

您无法分配到stdout,这会使依赖它的一组解决方案无效。 dup和dup2()不是Windows的原生,使另一组无效。如上所述,posix函数不适用(除非你计算fdopen())。

3 个答案:

答案 0 :(得分:17)

您应该可以使用_dup来执行此操作

这样的事情应该有效(或者您可能更喜欢_dup文档中列出的示例):

#include <io.h>
#include <stdio.h>

...
{
    int stdout_dupfd;
    FILE *temp_out;

    /* duplicate stdout */
    stdout_dupfd = _dup(1);

    temp_out = fopen("file.txt", "w");

    /* replace stdout with our output fd */
    _dup2(_fileno(temp_out), 1);
    /* output something... */
    printf("Woot!\n");
    /* flush output so it goes to our file */
    fflush(stdout);
    fclose(temp_out);
    /* Now restore stdout */
    _dup2(stdout_dupfd, 1);
    _close(stdout_dupfd);
}

答案 1 :(得分:15)

另一种解决方案是:

freopen("CON","w",stdout);

Per wikipedia“CON”是一个特殊的关键字,指的是控制台。

答案 2 :(得分:2)

在发布答案后,我注意到这是一个特定于Windows的问题。以下问题仍然可能对其他人提出问题。 Windows还提供_fdopen,因此只需将0更改为正确的HANDLE就可以将此Linux解决方案修改为Windows。

stdout = fdopen(0, "w")

#include <stdio.h>
#include <stdlib.h>
int main()
{
    freopen("file.txt","w",stdout);
    printf("dupa1");
    fclose(stdout);
    stdout = fdopen(0, "w");
    printf("dupa2");
    return 0;
}