0

我知道外部合并排序及其工作原理。但目前我在实施它时遇到了困难。我已经编写了对数组进行排序和合并的代码,但是在从文件中读取数据和将数据写入文件时遇到了问题,我想在 C++ 中实现以下方法:

1. int * read(int s, int e) : This method should read from file all the number 
starting from 's' till 'e' and return the array
2. write(int a[], int s, int e) : This method should write to file the input 
array by replacing the numbers from s to e.

例如。

Given file has the following numbers:

1
2
3
4
5
6

read(0, 2) should return [1,2,3]
write([4,5,6], 0, 2) should update the file to :
4
5
6
4
5
6

如何实现这两种方法?

4

2 回答 2

1

您应该做的第一件事是停止使用原始指针。

std::vector<int>将同样有效,而且更不容易出错。

其次,文件格式很重要。我将假设一个包含 32 位有符号整数的二进制文件。

读写的签名现在是:

std::vector<int> read( std::ifstream const& f, int offset );
void write( std::ofstream& f, int offset, std::vector<int> const& data );

ifstreamofstreamhave seek 方法——特别是ifstreamhasseekgofstreamhas seekp

ifstream.read( char* , length )length从当前获取位置的文件中读取字节(由 设置,由seekg高级read)。如果您不关心文件的内存布局,您可以.data()从获取std::vector<int>,将其重新解释为 a char*,然后继续read( reinterpret_cast<char*>(vec.data()), sizeof(int)*vec.size() )读取缓冲区。

ofstream有一个类似的write方法,其工作方式大致相同。

虽然将数据原始地写入磁盘并返回是危险的,但在大多数(每个?)实现中,在同一个执行会话(甚至可能在会话之间)写入和读取数据是安全的。如果数据要在会话之间持久存在,或者它是代码的输出/输入,请多加注意。

于 2013-02-27T20:25:24.283 回答
0

没有 C++ 标准函数可以跳转到文件中的行。因此,您必须逐行读取文件(例如,使用 getline。http://www.cplusplus.com/reference/string/string/getline/

据我记得,外部合并排序(旧的,专为带有几个磁带驱动器的计算机而设计)在与单独的文件一起使用时,不需要像您这样的界面 - 您可以按顺序工作。

于 2013-02-27T20:23:31.067 回答