0

如果我们使用 fread() 读取文件并且不包含 fclose 以关闭相同的文件引用但它仍然有效,为什么会这样。

但是,如果我们忘记在 fwrite 之后包含 fclose 则它不起作用。即文件上没有写入反映。

4

3 回答 3

6

fread(),顾名思义,从文件中读取数据。从逻辑上讲,它在实际读取数据(将其存储在您提供的缓冲区中)或报告错误之前无法返回。一旦fread()返回,您就可以使用数据。

fwrite()另一方面,可以在 C 运行时库、操作系统和其他地方进行多层缓冲。fwrite()当它处理您的数据并将其写入......某处时返回。fflush(outfile);在您刷新它 ( ) 或关闭它 ( )之前,无法保证它实际上已写入物理文件fclose(outfile);。一旦fwrite()返回,您可以对传递给它的数据做您喜欢的事情(它已被复制),但这就是您可以假设的全部。

如果您的程序正常终止,它将隐式关闭(并因此刷新)所有打开的输出文件。如果您的程序异常终止,这可能不会发生。

fclose()(实际上,我认为在某些情况下,即使在或之后,数据也可能不会实际到达文件中fflush()。)

于 2013-09-28T01:26:24.073 回答
1

文件访问被缓冲。执行 anfread()时,在读取实际数据之前它无法返回,但如果执行 an fwrite()then 它可以在将写入的数据放入文件缓冲区之后但在将其写入基础文件之前返回。

的副作用fclose()是刷新文件缓冲区 - 您也可以使用fflush()afterfwrite()来达到相同的效果。

于 2013-09-28T01:26:12.167 回答
0

因为读取操作显然必须在fread函数返回后完成 - 实际读取缓冲区中的数据是 的后置条件之一fread,否则您无法确定在调用fread1后可以对缓冲区中的数据执行任何有用的操作。

fwrite,相反,可以(并且将)进行写缓冲——它会在其私有缓冲区中积累数据,然后将其传递给操作系统以实际将其写入文件中;这是可能的(并且方便),因为就您的程序而言,这件事是完全透明的:数据已经存储在其他缓冲区中,如果您从同一个流中读回,您会在那里找到您的数据,并且您仍然可以从缓存中获得性能改进。不过,如果您需要将数据立即发送到操作系统,您可以使用fflush.

顺便说一句,即使您不立即调用fclose该标准,也保证在正常程序终止的情况下,流会自动关闭,因此它们的内容会被刷新。


  1. 顺便说一句,在某些情况下,仅当数据可用时才获取数据或启动读取操作并稍后检查数据是否已实际读取是有用的——这就是操作系统提供非阻塞和异步 IO 功能的原因。
于 2013-09-28T01:27:13.037 回答