[有人就 comp.lang.c FAQ 列表中的第 19.14 个问题向我寻求澄清。这是我的回复。]
日期:2000 年 2 月 16 日,星期三,10:55:50 -0800 (PST)
Message-Id: <200002161855.KAA11838@mail.eskimo.com>
发件人:scs@eskimo.com (Steve Summit)
主题:Re: 'q' - 回复
回复:您 1999 年 9 月 4 日星期六 14:38:04 +0530 的消息 <37D0E174.AB9D0DA0@srasys.co.in>
of Sat, 04 Sep 1999 14:38:04 +0530
抄送:scs@eskimo.com
你写道
> 我只想知道是否可以在现有文件中插入一行?
> 尽管问题非常直接,但答案却不是
> (当然)
> 是/否
> 您回复中我唯一能理解的是“您大概不能”。
没错。
> 如果您不介意,能否澄清一下是否可行?
> 实际上,文件追加与此相同,为什么不能
> 插入一行
问题在于,几乎所有操作系统下的文件访问基本模型都是“顺序”的,这意味着文件是一个字节流,您需要按顺序访问。在末尾添加字节很容易(这本质上是您每次写入文件时所做的),但无法在中间插入字节。通常您可以将文件指针移回文件并开始写入,但这会覆盖而不是插入。操作系统允许您插入字节的唯一方法是,如果它能将所有被移位的字节移到文件末尾,但事实证明,操作系统没有合理的方法允许您这样做,至少不是以高效或通用的方式。(某些操作系统支持面向记录的文件类型,这可能允许您插入记录,但在这种情况下,您将仅限于插入等于记录大小整数倍的字节数。)
答案确实是“您大概不能”。如果可以,C 的 stdio 库中会有一个名为“finsert”的函数调用,操作系统文件系统接口中会有一个名为“insert”的系统调用。但这两个调用都不存在,所以无论我们多么希望有插入的方法,它就是不存在;操作系统和 C 运行时库根本不支持此操作。(在某种程度上,写入文件只有一种方式,如果您在文件中间进行写入,其解释是“覆盖”,而不是“插入”。)
> 有没有其他方法
如果您想在文件中间插入文本,您确实必须重写整个文件。这其实并不难(尽管我承认有时这会很麻烦)。
您可能想知道为什么不能在文件中间插入字符,因为文本编辑器似乎一直在这样做。但文本编辑器从不直接处理磁盘文件;它们总是处理更复杂的结构,这些结构存在于内存或临时文件中,这使得插入、删除和重新排列文本相对容易。每当您编辑文件时,文本编辑器会将文件读入其内部数据结构,然后让您编辑,然后将修改后的数据结构写回文件(覆盖整个文件)。