Перенаправление stdout и stderr одновременно
От: Nikita.Trophimov  
Дата: 03.04.13 08:41
Оценка:
Приветствую.

#include <cstdio>

int main()
{
    std::freopen("D:/output.txt", "w", stdout);
    std::setbuf(stdout, NULL);
    std::freopen("D:/output.txt", "w", stderr);

    std::printf("1 \n");
    std::fprintf(stderr, "2 \n");
    std::printf("3 \n");
}


В результате выполнения данного кода в output.txt оказывается

2
3


Если пробежаться в отладчике, то будет заметно, что до вывода второй строки в файле действительно присутствует первая, однако она перезаписывается сразу после записи второй (первая не появляется вообще, если убрать вызов функции std::setbuf или не сделать std::fflush — я так понимаю, что в Win stdout не имеет строковой буферизации).

Следующий код работает точно так же:

#include <fstream>
#include <iostream>

int main()
{
    std::ofstream std_out("output.txt");
    std::cout.rdbuf(std_out.rdbuf());

    std::ofstream std_err("output.txt");
    std::cerr.rdbuf(std_err.rdbuf());

    std::cout << "1" << std::endl;
    std::cerr << "2" << std::endl;
    std::cout << "3" << std::endl;
}


Почему так происходит? Ленивое создание файла?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.