2013-09-20 3 views
2

Я пытаюсь перенаправить трассировки на выходной консоли в Windows Visual 2012, Linker/Subsystem = Windows (/ SUBSYSTEM: WINDOWS), используя классический Функция RedirectIOToConsole.Выполнение std :: endl перед AllocConsole не вызывает отображения std :: cout

Выполнение std :: endl перед тем, как AllocConsole вызывает проблемы для отображения следов.

Ниже мой тест:

#include <windows.h>  
#include <stdio.h> 
#include <iostream> 
void RedirectIOToConsole() 
{ 
    FILE *conin, *conout; 
    AllocConsole(); 
    freopen_s(&conin, "conin$", "r", stdin); 
    freopen_s(&conout, "conout$", "w", stdout); 
    freopen_s(&conout, "conout$", "w", stderr); 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    // std::cout << "My Trace 1";    // Uncomment this line for Test 1 
    // std::cout << "My Trace 1" << std::endl; // Uncomment this line for Test 2 
    RedirectIOToConsole(); 
    printf("redirected console\n"); 
    std::cout << "My Trace 2" << std::endl; 
    ch = getchar(); 
    return 0; 
} 
  • Выполнить это, как это - выход в окне консоли:

перенаправлены консоль

Мой след 2 -> OK

  • Раскоментируйте линия для теста 1 - выход в окне консоли:

перенаправлены консоли

Мой след 2 -> OK

  • Раскоментируйте линия для испытания 2 - выход в окне консоли:

переадресованная консоль -> NOK

+0

'std :: cout' буферизуется,' std :: endl; 'очищает буфер. Надеюсь, что это поможет, потому что я вообще не понял проблему/вопрос. –

+0

Первое, что вам нужно сделать, это проверить наличие ошибок в функции, которую вы вызываете. И если они указывают на ошибку, вы можете проверить, какая ошибка (например, «GetLastError» для «AllocConsole» или возвращаемое значение для 'freopen_s'). –

ответ

10

Перед тем, как позвонить по номеру RedirectIOToConsole(), ничего не найдено для cout. Так как буферизуется cout, выход сохраняется в буфере до тех пор, пока не будет выполнено flush. endl содержит flush.

При попытке сбросить выход без пульта, поток cout устанавливает badbit в iostate.

Когда вы затем сделать следующий шаг cout << "My Trace 2" << endl; выход происходит не потому, что перед тем как писать данные в файл вывода (STDOUT), cout проверяет iostate и говорит: «О, это не хорошо, мы имеем badbit набор »и спасается, не пытаясь написать.

Вы можете теоретически исправить это, позвонив по номеру cout.clear();, но я бы предположил, что лучше не звонить cout до того, как вы выделили консоль - это нецелесообразно выводить данные, прежде чем вы сможете что-то выводить ,

+0

Да! cout.clear(); решить проблему – joseAndresGomezTovar

Смежные вопросы