freopen стандартный вывод и консоль - PullRequest
6 голосов
/ 05 октября 2011

С учетом следующей функции:

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

Перенаправляет стандартный вывод в файл, как мне сделать так, чтобы стандартный вывод перенаправлялся обратно в консоль?

Замечу, да, есть другие вопросы, подобные этому, , но они касаются linux / posix Я использую Windows.

Вы не можете быть назначены на стандартный вывод, который сводит на нет один набор решений, которые полагаются на него. dup и dup2 () не являются родными для окон, аннулируя другой набор. Как уже говорилось, функции posix не применяются (если не считать fdopen ()).

Ответы [ 3 ]

17 голосов
/ 05 октября 2011

Вы должны быть в состоянии использовать _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);
}
15 голосов
/ 05 октября 2011

Альтернативное решение:

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

Per wikipedia «CON» - это специальное ключевое слово, которое относится к консоли.

2 голосов
/ 05 октября 2011

После публикации ответа я заметил, что это специфический для 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;
}
...