问题描述
- c标准库的fputc写入文件的机制问题
-
最近用c编一个小程序,用到fputc向文件内写入字符,希望保持原有文件内容而能覆盖特定位置的字符。使用fputc以rt+方式打开文件可以实现这个。可是问题来了,硬盘在读写的时候将同时读写一整个扇区,那么fputc实现覆盖文件某个位置的字符是怎样实现的呢?是将一整个扇区读入后修改对应字符再写入?那么这样的话势必需要一个缓冲区,如果真是这样,这个缓冲区会维持到什么时候呢?比如我连续调用两次fputc,写入的数据在都同一扇区内,需要读取几次文件?
解决方案
这个根本不劳你操心,这些是操作系统底层甚至硬件的事情。硬盘自身、操作系统都有缓存。
通常一个机械硬盘自身带有8~64MB的缓存,并且它会自动优化读写顺序,避免来回寻址。操作系统的IO缓存就更大了。这个没法估计。
而且,事实上,现代的硬盘,因为容量非常非常大,速度非常非常快,每次读写其实都不是1个扇区,可能是8个扇区或更多——即便你只修改一个字节。
不过不管怎么说,从你编程的角度看,你不用关心底层这些实现,操作系统和硬盘本身无论怎么设计,都保证了你的数据读写是没有问题的。
解决方案二:
你看的教材,通常都是几十年前的东西,这个世界早就完全变了。
好比,我们管汽车的加速踏板叫做油门,但是其实现在的喷油量都是计算机控制的,你踩下加速踏板,其实控制的是节气门的开闭,你感觉到和油门的差别了么?
车还是一样的开。
甚至在电动车上,油门踏板其实控制的是电机,但是你同样不要重新培训就能驾驶。
一样的道理,你讨论的这些,基本上都毫无意义。对于一个C程序员来说,他写的程序可能变化不大,但是底层的实现完全变了。不过你不用过分担心。这些都是向前兼容的。
解决方案三:
C标准库文件之string.c文件
C标准库 memset 的一个问题
时间: 2024-10-02 20:00:22