Есть буферизация на многих уровнях, это зависит от ОС и многих других вещей.
Обычно в FILE * находится внутренний буфер в вашем приложении, который либо выгружается в файл (или на любое устройство, к которому подключен FILE *)
- когда внутренний буфер FILE * заполнен
- когда вы пишете новую строку (в случае строки с буферизацией FILE *)
- при закрытии ФАЙЛА *
- при вызове fflush ()
- ФАЙЛ * также может быть небуферизован
В случае обычного дискового файла большинство ОС имеют буферизацию в ядре, поэтому
Буфер FILE * включает в себя более или менее простую копию памяти из буфера вашего приложения в ядре ОС, и ядро позаботится о том, чтобы записать его в текущий файл на досуге асинхронно, что приведет к возврату fclose () "прямо сейчас".
Могут возникнуть обстоятельства, когда ОС сначала придется выполнить некоторую служебную работу, прежде чем данные будут скопированы в буферы ОС / ядра, например, может потребоваться сброс данных в физический файл, чтобы освободить место для дополнительных данных, выделить место в файле, чтобы обеспечить место, и т. д., чтобы он не возвращался мгновенно.
Короче, это зависит, и вы не можете это контролировать. Обычно «лучшее», что вы можете сделать, это использовать зависящие от платформы API, которые, по крайней мере, позволяют сбрасывать буферы ОС в физический файл, например API posix fsync () / fdatasync ().