Странное поведение std :: cout в Linux - PullRequest
1 голос
/ 25 марта 2011

Я пытаюсь распечатать результаты за 2 вложенных цикла for, используя std::cout.Однако результаты выводятся на консоль не сразу, а с задержкой (после завершения обоих циклов или программы).

Я не считаю такое поведение нормальным, под Windows печать работает нормально.Программа не использует потоки.

В чем может быть проблема?(Ubuntu 10.10 + NetBeans 6.9).

Ответы [ 2 ]

9 голосов
/ 25 марта 2011

std::cout - это поток, и он буферизуется.Вы можете очистить его несколькими способами:

std::cout.flush();

std::cout << std::flush;

std::cout << std::endl;  // same as:  std::cout << "\n" << std::flush`


johny:

Я очищаю буфер перед циклом, используя std :: endl.Проблема возникает при печати точки, представляющей% обработанных данных внутри цикла.

Если вы очищаете буфер до цикла, это не влияет на вывод in цикл.Вы должны промыть в или после цикла, чтобы увидеть вывод.

1 голос
/ 25 марта 2011

Если вы не очищаете свой вывод, ваш вывод не гарантированно будет виден за пределами вашей программы.Тот факт, что он не печатает в вашем терминале, является лишь следствием поведения по умолчанию в linux для буферизации строк, когда вывод tty.Если вы запустите свою программу в Linux с выводом ее по другому каналу, например

 ./your_program | cat

, тогда буфер по умолчанию будет НАМНОГО больше, скорее всего он будет не менее 4096 байт.Так что ничего не будет отображаться, пока большой буфер не заполнится.но на самом деле поведение зависит от ОС, если вы сами не сбросите std :: cout.

Чтобы сбросить std :: cout, используйте также:

std::cout << std::flush;

, используя

std::cout << std::endl;

является ярлыком для

std::cout << '\n' << std::flush;
...