C fprintf()函数可以';t将数据持久化到文件中;必须后跟fflush()函数吗?

C fprintf()函数可以';t将数据持久化到文件中;必须后跟fflush()函数吗?,c,io,c++,C,Io,C++,我正在使用fopen()函数打开要写入的文件,并返回文件指针。然后,我将此指针用于fprintf(),但数据不会将我的写入持久化到文件中。这是直接IO/O\u Direct相关的,还是有什么问题?您要么需要调用,要么在完成写入后只调用文件fclose()将在关闭前尝试刷新。此行为是ISO C和POSIX的一部分,因此您可以依赖它。有关fclose()的更多信息,请参阅: 刷新流,然后关闭与该流关联的文件 流动之后 该函数释放与流关联的所有缓冲区。冲洗 未写入的缓冲数据被写入文件,未读数据被缓冲

我正在使用
fopen()
函数打开要写入的文件,并返回
文件
指针。然后,我将此指针用于
fprintf()
,但数据不会将我的写入持久化到文件中。这是直接IO/
O\u Direct
相关的,还是有什么问题?

您要么需要调用,要么在完成写入后只调用文件<代码>fclose()将在关闭前尝试刷新。此行为是ISO C和POSIX的一部分,因此您可以依赖它。有关
fclose()
的更多信息,请参阅:

刷新流,然后关闭与该流关联的文件 流动之后 该函数释放与流关联的所有缓冲区。冲洗 未写入的缓冲数据被写入文件,未读数据被缓冲 数据被丢弃


如果您一直在写入文件,但从未刷新或关闭文件,则在足够的写入排队后,操作系统将开始“在准备就绪时”将数据刷新到文件。

“打开”函数具有O_DIRECT标志,但“fopen”函数没有。谢谢,威尔!我认为如果我使用“open”函数和O_DIRECT标志,数据会立即写入磁盘。对,所有缓存都会被绕过,这可能是一件坏事,也会影响读缓存。例如,您没有提到正在使用的操作系统,但是
O_DIRECT
O_SYNC
可能是Linux的一个很好的解决方案(尽管出于上述原因,通常建议不要使用
O_DIRECT
)。最安全/最可移植的选项就是在需要时使用
fflush()
。没问题,很乐意帮忙!stdio将开始写入文件。缓冲区在stdio中,而不是在操作系统中。一旦写操作进入操作系统,它最终将进入文件,除非崩溃。问题是
stdio
中的缓冲区,除了刷新或关闭外,没有任何刷新。请注意,如果从
main()
返回或调用常规的
exit()
函数,则打开的文件流将关闭,挂起的输出将刷新到磁盘(或输出要到达的任何位置)。如果调用“紧急出口”函数之一(
\u exit()
等),或者如果程序崩溃(内存故障等),则不会发生这种情况。