1

我正在解决一个排序问题,该问题涉及对大于主内存的文件进行排序。第一阶段生成一个中间文件,其大小与原始输入文件相同,但包含一些本地排序的子节。

第二阶段将这些子部分合并回一个排序列表。

我不想创建第三个文件来包含单个排序列表,我想覆盖我正在读取的中间文件,因为我正在从中读取

此外,我想为每个输入流维护单独的读取缓冲区(每个都从某个偏移量读取到中间文件中)。

我知道我可以使用 fopen() 和 fseek() 创建多个缓冲的只读输入流。但是,fopen() 的合同规定,如果文件已经存在,则在“w”模式下对文件调用它会将文件的大小设置为零。我需要它来不改变文件的大小,因为我仍在多个地方读取它。

有没有使用 fopen() 和 fseek() 的简单方法来完成此操作?还是我需要使用 open() 并管理我自己的读/写缓冲?

4

3 回答 3

2

您可以只在r+模式下打开文件,这意味着它可以读写,并且不会截断文件。

于 2013-09-10T04:43:58.173 回答
1

我首先建议您通过写入第三个文件来使您的程序正常工作。然后,如果条件要求您就地更新文件,则创建一个可以工作的“简单”程序的副本并对其进行修改。

这样,当您测试您的新程序时,您将能够将其与之前的有效结果进行比较。也就是说,最终简单程序和新程序都应该生成相同的排序文件。

于 2013-09-10T05:00:37.737 回答
0

阅读fopen(3)手册页。您可能想要该"r+"模式。

或者,考虑使用mmap(2)madvise(2)系统调用(不带任何<stdio.h>函数)

于 2013-09-10T04:45:08.510 回答