fwite / putc如何写入磁盘?

时间:2013-08-08 16:29:57

标签: c fwrite disk stdio fseek

假设我们已有一个文件,比如<File>。此文件已由C程序打开以进行更新(r+b)。我们使用fseek导航到<File>内的一个点,而不是它的结尾。现在我们开始使用fwrite/fputc编写数据。请注意,我们不会删除以前<File> ...

中存在的任何数据

系统如何处理这些写入?它是否将整个文件重写到磁盘中的另一个位置,现在包含新数据?它是分割文件并只在另一个位置写入新数据(并且只记得中间有一些空闲空间)?它实际上仅覆盖已更改的部分吗?

有一个很好的理由要问:在第一种情况下,如果您不断更新文件,系统可能会变慢。在第二种情况下,它可能会更快但如果对许多文件进行操作会使文件系统陷入困境。在第三种情况下,特别是如果你有固态磁盘,反复更新文件的相同位置可能会使磁盘的那部分无用。

实际上,这就是我的问题所在。我已经读过,为了节省过度使用的磁盘扇区,固态磁盘使用不同的技术将数据移动到较少使用的扇区。但是stdio函数究竟是如何处理这种情况的呢?

提前感谢您的时间! :d

2 个答案:

答案 0 :(得分:1)

文件系统处理程序创建了一种写入光盘扇区的dicationary,所以当你更新文件的内容时,文件系统会查找光盘上的字典,告诉它,光盘上的哪个扇区文件数据位于。然后它旋转(或等待光盘到达那里)并更新光盘上的相应扇区。

那是短版本。

因此,如果要更新文件,通常不会将文件移动到新位置。当您向文件写入新数据并附加到该文件,并且数据不适合现有扇区时,则会分配其他扇区并将数据写入其中。

如果删除文件,通常会将扇区标记为空闲并重复使用。因此,只有当您打开一个新文件并重写它时,才会发生该文件放在不同扇区中的情况。

但细节可能因硬件而异。 AFAIK如果覆盖CD上的数据,则新写入数据(只要会话未完成),因为一旦写入CD就无法更新CD上的数据。

答案 1 :(得分:0)

您的理解不正确:“请注意,我们不会删除以前存在于文件中的任何数据”

如果你进入文件的中间并开始写作,那么它将会写出之前在该位置的任何内容。

如何在封面下完成这可能取决于硬盘中的计算机如何实现它。它应该在硬盘外看不见,并不重要。