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