在硬盘上的文件中替换%20的空格

时间:2012-08-19 11:36:47

标签: c file

我已经查看了之前发布的类似问题的所有答案Replacing spaces with %20 in C。但是我无法猜测如果硬盘上有文件,我们怎么能这样做呢?磁盘访问可能很昂贵且文件太长而无法一次加载到内存中。如果可以适应,我们可以简单地加载文件并写入相同的现有文件。 此外,对于内存约束,人们希望替换原始文件而不是创建新文件。

2 个答案:

答案 0 :(得分:4)

可怕的主意。由于“%20”比“”长,你不能只替换文件中的字符,你必须移动后面的任何内容。如果你想在现有的磁盘文件上做这件事,这非常麻烦和昂贵。

您可以尝试在第一次通过时确定文件的总增长,然后从文件的后面进行整个转换,将块大小考虑在内,并在遇到“”时调整移位。但正如我所说 - 凌乱。你真的不想那样做,除非这是必须的。

读取文件,进行替换,写入新文件,然后将旧文件重命名为旧文件。

编辑:作为一个副作用,如果你的程序在做这件事时终止,你将不会得到一个半转换文件。这实际上是许多程序写入新文件的原因,即使他们不需要,也要确保文件“始终”正确,因为新文件只有在成功编写后才替换旧文件。这是一个简单的事务方案,不考虑系统故障,但适用于应用程序故障(包括用户强行终止程序)

答案 1 :(得分:2)

对于替换部件,您可以有两个缓冲区,一个是您读入的缓冲区,另一个是您将已翻译的字符串写入磁盘的缓冲区。根据您的内存限制,即使是小输入缓冲区(比如1KiB)就足够了。但是,为了避免重复重新分配,您可以为输出保留一个固定缓冲区,并使其大小为输入缓冲区大小的三倍(最坏情况下,输入是所有空格)。总计4KiB的内存,以及操作系统使用的缓冲区。我建议使用磁盘块大小的倍数作为输入大小。

问题是您需要读取和写入同一个文件。不幸的是,这是不可能的。如果您阅读char-by-char,请考虑当您到达空间时会发生什么......然后您必须编写三个字符并覆盖文件中的后两个字符。不完全是你想要的。