【发布时间】:2015-04-01 19:43:10
【问题描述】:
如果缓冲区大小小于文件大小,如何合并两个文件? 例如,我有两个带有排序整数的文件
1.txt 和 2.txt
2 1
5 7
6 8
7 9
我必须将它们合并到一个排序的文件中,但我不能从每个文件中读取两个以上的数字(这就是任务)。而且我不能同时在内存中存储超过 4 个数字。
这是我的代码
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
const int bufferSize = 2;
bool readSortFile(ifstream &file, vector<int> &data) {
int tmp;
for (int i = 0; (i < bufferSize && file >> tmp); i++)
data.push_back(tmp);
return file.good();
}
int main() {
ifstream file1("1.txt");
ifstream file2("2.txt");
ofstream out;
vector<int> data1, data2;
bool fileGood1, fileGood2;
fileGood1 = true;
fileGood2 = true;
while(fileGood1 || fileGood2) {
if(data1.size() == 0)
fileGood1 = readSortFile(file1, data1);
if (data2.size() == 0)
fileGood2 = readSortFile(file2, data2);
out.open("temp", ios::app);
merge(data1.begin(),
data1.end(),
data2.begin(),
data2.end(),
ostream_iterator<int>(out, "\n"));
data1.clear();
data2.clear();
out.close();
}
rename("temp", "result.txt");
file1.close();
file2.close();
return 0;
}
输出为1 2 5 7 6 7 8 9
【问题讨论】:
-
你看过外部排序吗:en.wikipedia.org/wiki/External_sorting?
-
你试过实现
merge吗?该算法不需要您将源保存在内存中,事实上它仅作用于每个序列中的一个值...或者您可以通过std::istream_iterator和@987654328 直接在您的输入上使用该算法@...只是说 -
输入文件是否应该已经排序?
-
就像大卫说的那样,
std::istream_iterator<int>和std::merge可以很容易地与 solve this trivially 协同工作。
标签: c++ file stl merge mergesort