【问题标题】:How to merge two files if the buffer size is smaller than the size of the file?如果缓冲区大小小于文件大小,如何合并两个文件?
【发布时间】: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&lt;int&gt;std::merge 可以很容易地与 solve this trivially 协同工作。

标签: c++ file stl merge mergesort


【解决方案1】:

正如评论中提到的,您只需要每个文件中的 1 个数字来实现合并,但您可能需要编写自己的合并逻辑,而不是使用 std::merge。示例伪代码,您需要添加 eof 检查(如果 1.txt 结束,则复制 2.txt 的其余部分,反之亦然)。

    num1 = get number from "1.txt"
    num2 = get number from "2.txt"
    loop(...){
        if(num1 <= num2){
            write num1
            num1 = get number from "1.txt"
        } else {
            write num2
            num2 = get number from "2.txt"
        }
    }

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2015-06-28
    • 2013-08-14
    • 1970-01-01
    相关资源
    最近更新 更多