Я згадав, читаючи про це в стандарті, так ось що:
Дивіться стандарт 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 .