Они оба обычно буферизуются, что означает, что ввод / вывод, который вы выполняете в потоке, не соответствует 1: 1 вводу / выводу, выполненному для базового системного объекта (например, файла).
Например, fread()
вызов для чтения 2 байтов может попытаться прочитать 1024 байта из файла, который, в свою очередь, может вернуть только 57, если вы были так близко к концу файла. Разница скрыта за реализацией потока, который вернет 2 байта и помнит, что у него есть еще 55 в буферах. Таким образом, он будет удовлетворять следующий запрос на чтение, не затрагивая уровень файла вообще.
EDIT: Стоит отметить, что потоки ошибок по умолчанию на обоих языках (stderr
и cerr
соответственно) не буферизируются. Это большая победа, поскольку она увеличивает шансы на своевременное получение результатов. Когда вы преследуете странные баги с ошибками путем разбрызгивания кода с помощью операторов printf()
, по этой конкретной причине очень полезно печатать в потоке ошибок.