Я вспомнил, что читал об этом в стандарте, поэтому здесь идет:
См. стандарт C11, который определяет, как ведут себя стандартные потоки, поскольку программы на C ++ взаимодействуют с CRT, стандарт C11 должен регулировать политику промывки здесь .
ISO / IEC 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 .