Ви хочете небуферований вихід, коли хочете переконатися, що результат був записаний перед продовженням. Одним із прикладів є стандартна помилка в бібліотеці середовища виконання C - вона зазвичай не буферизована за замовчуванням. Оскільки помилки (сподіваємось) нечасті, ви хочете дізнатися про них негайно. З іншого боку, стандартний висновок в буферному просто тому , що передбачається , що буде набагато більше даних , що проходять через нього.
Інший приклад - бібліотека журналів. Якщо ваші журнальні повідомлення містяться в буферах у вашому процесі, а ваш процес скидає ядро, є дуже великий шанс, що вихідні дані ніколи не будуть записані.
Крім того, зводиться до мінімуму не лише системні виклики, але й введення-виведення на диску. Скажімо, програма читає файл по одному байту за раз. За допомогою буферизованого введення ви вийдете на (відносно дуже повільний) диск за кожним байтом, хоча він, мабуть, і так повинен прочитати цілий блок (саме обладнання диска може мати буфери, але ви все одно виходите на контролер диска що буде повільнішим, ніж доступ до пам'яті).
Буферизуючи, весь блок відразу зчитується в буфер, потім окремі байти доставляються вам із (в пам'яті, неймовірно швидко) області буфера.
Майте на увазі, що буферизація може мати різні форми, наприклад, у наступному прикладі:
+-------------------+-------------------+
| Process A | Process B |
+-------------------+-------------------+
| C runtime library | C runtime library | C RTL buffers
+-------------------+-------------------+
| OS caches | Operating system buffers
+---------------------------------------+
| Disk controller hardware cache | Disk hardware buffers
+---------------------------------------+
| Disk |
+---------------------------------------+
FILE
внутрішній буфер об'єкта (потоку) повністю відрізняється відfgets
необхідного параметра буфера. Це просто бентежило мене годинами, перш ніж я написав якийсь код, щоб зрозуміти це. QAQ