Я вспомнил, что читал об этом в стандарте, так вот:
См. Стандарт C11, который определяет, как ведут себя стандартные потоки, поскольку программы C ++ взаимодействуют с CRT, стандарт C11 должен управлять здесь политикой очистки.
ИСО / МЭК 9899: 201x
7.21.3 §7
При запуске программы предварительно определены три текстовых потока, которые не нужно открывать явно: стандартный ввод (для чтения обычного ввода), стандартный вывод (для записи обычного вывода) и стандартный поток ошибок (для записи диагностического вывода). При первоначальном открытии стандартный поток ошибок не полностью буферизуется; потоки стандартного ввода и вывода полностью буферизуются тогда и только тогда, когда можно определить, что поток не относится к интерактивному устройству.
7.21.3 §3
Когда поток небуферизован, символы должны появляться из источника или в месте назначения как можно скорее. В противном случае символы могут накапливаться и передаваться в или из среды хоста в виде блока. Когда поток полностью буферизован, символы предназначены для передачи в или из среды хоста в виде блока при заполнении буфера. Когда поток буферизуется по строкам, символы предназначены для передачи в среду хоста или из нее в виде блока, когда встречается символ новой строки. Кроме того, символы предназначены для передачи в виде блока в среду хоста, когда буфер заполняется, когда ввод запрашивается в небуферизованном потоке или когда ввод запрашивается в потоке с линейной буферизацией, который требует передачи символов из среды хоста. . Поддержка этих характеристик определяется реализацией и может быть затронута с помощью функций setbuf и setvbuf.
Это означает, что std::cout
и std::cin
полностью буферизуются, если и только если они относятся к неинтерактивному устройству. Другими словами, если к терминалу подключен stdout, разницы в поведении нет.
Однако, если вызывается std::cout.sync_with_stdio(false)
, '\n'
не вызовет сброса даже на интерактивные устройства. В противном случае '\n'
эквивалентно std::endl
, если не выполняется конвейерная обработка файлов: c ++ ref на std :: endl.
person
Emily L.
schedule
29.08.2014
'\n'
. - person derobert   schedule 13.11.2013