1

我已经阅读了之前发布的类似问题的所有答案,用 C 中的 %20 替换空格。但是,我无法猜测在硬盘上的文件的情况下我们如何做到这一点,其中磁盘访问可能很昂贵并且文件太长而无法立即加载到内存中。如果可以安装,我们可以简单地加载文件并写入相同的现有文件。此外,对于内存限制,人们希望替换原始文件而不是创建新文件。

4

2 回答 2

4

可怕的想法。由于 "%20" 比 " " 长,你不能只替换文件中的字符,你必须将后面的任何内容移到后面。如果您想在现有磁盘文件上执行此操作,这将非常混乱且昂贵。

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

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

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

于 2012-08-19T11:55:17.137 回答
2

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

问题是您需要读取和写入同一个文件。不幸的是,这是不可能的。如果你逐个字符地阅读,想想当你到达一个空格时会发生什么......然后你必须写三个字符并覆盖文件中接下来的两个字符。不完全是你想要的。

于 2012-08-19T12:00:06.437 回答