2013-02-13 2 views
12

Есть ли какие-либо обстоятельства, когда std::cout << "hello" не работает? У меня есть код c/C++, однако std::cout ничего не печатает, даже постоянные строки (например, «привет»).std :: cout не будет печатать

Есть ли способ проверить, способен ли cout открыть поток? Есть некоторые функции-члены, такие как good(), bad(), ... но я не знаю, какой из них подходит для меня.

+7

А, буферизованный выход, хотя и бессердечный и жестокий. – WhozCraig

+3

Нет. 'Std :: cout' в C. –

+0

В системе окон,' std :: cout' может быть не реализована, потому что есть окна, и ОС не знает, какое из ваших окон вывести на. –

ответ

29

Убедитесь, что вы смываете поток. Это необходимо, потому что выходные потоки буферизованы, и у вас нет гарантии, когда буфера будет очищено, если вы вручную не начнете его самостоятельно.

std::cout << "Hello" << std::endl; 

std::endl будет выводить символ перевода строки и промывать поток. Альтернативно, std::flush будет только сделать флеш. Промывка также может быть сделано с помощью функции-члена ручья:

std::cout.flush(); 
+1

+1 или использовать 'std :: cout <<" hello \ n "' –

+0

нет разницы :( – mahmood

+3

@GrijeshChauhan С каких пор отправка только символа новой строки в форматированный выходной поток заставляет флеш? Я думал, что стандарт не был («flush()») и манипуляторами ('endl'), чтобы отключить сброс буфера потока? Было ли это похоже на определенный стандарт C++? – WhozCraig

5

Вполне вероятно, что std::cout не работает из-за буферизации (то, что вы пишете заканчивается в буфере std::cout, а не в выходе).

Вы можете сделать один из этих вещей:

  • вровень std::cout явно:

    std::cout << "test" << std::flush; // std::flush is in <iostream> 
    

    std::cout << "test"; 
    std::cout.flush(); // explicitly flush here 
    

    std::cout << "test" << std::endl; // endl sends newline char(s) and then flushes 
    
  • std::cerr вместо этого. std::cerr не буферизуется, но использует другой поток (т. Е. Второе решение может не работать для вас, если вас интересует больше, чем «см. Сообщение на консоли»).

+0

Ни один из них не работал в моем коде. –

1

Чтобы эффективно отключить буферизацию вы можете назвать это:

std::setvbuf(stdout, NULL, _IONBF, 0); 

В качестве альтернативы, вы можете вызвать вашу программу и отключить буферизацию вывода в командной строке:

stdbuf -o 0 ./yourprogram --yourargs 

Имейте в виду, обычно не выполняется по соображениям производительности.

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