我知道External merge sort及其运作方式。 但目前我在执行它时遇到困难。我已经编写了代码来排序和合并数组,但是我在读取和写入文件时遇到问题,我想在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
如何实施这两种方法?
答案 0 :(得分: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 );
ifstream
和ofstream
有搜索方法 - 特别是ifstream
有seekg
而ofstream
有seekp
。
ifstream.read( char* , length )
从当前获取位置的文件中读取length
个字节(由seekg
设置,并由read
提前)。如果您不关心文件的内存布局,可以从.data()
获取std::vector<int>
,将其重新解释为char*
,然后继续read( reinterpret_cast<char*>(vec.data()), sizeof(int)*vec.size() )
进行阅读一次在缓冲区中。
ofstream
有一个类似的write
方法,其工作原理大致相同。
虽然将数据原始写入磁盘并返回是危险的,但在大多数(每个?)实现中,您可以安全地在同一个执行会话中编写和读取数据(甚至可能在会话之间)。如果数据要在会话之间持续存在,或者是从代码输出/输入数据,请更加小心。
答案 1 :(得分:0)
没有C ++标准函数可以跳转到文件中的行。因此,您必须逐行读取文件(例如,使用getline。http://www.cplusplus.com/reference/string/string/getline/)。
据我所知,外部合并排序(旧的,为具有少量磁带驱动器的计算机而设计),当与单独的文件一起使用时,不需要像你这样的界面 - 你可以顺序工作。