Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果缓冲区大小小于文件大小,如何合并两个文件?_C++_File_Stl_Merge_Mergesort - Fatal编程技术网

C++ 如果缓冲区大小小于文件大小,如何合并两个文件?

C++ 如果缓冲区大小小于文件大小,如何合并两个文件?,c++,file,stl,merge,mergesort,C++,File,Stl,Merge,Mergesort,如果缓冲区大小小于文件大小,如何合并两个文件? 例如,我有两个带有排序整数的文件 1.txt和2.txt 2 1 5 7 6 8 7 9 我必须将它们合并到一个已排序的文件中,但我不能从每个文件中读取两个以上的数字,这就是任务所在。同时我的记忆中不能超过4个数字 这是我的密码 #include <iostream> #include <fstream> #include <vector> #include &l

如果缓冲区大小小于文件大小,如何合并两个文件? 例如,我有两个带有排序整数的文件

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

如注释中所述,每个文件只需要1个数字就可以实现合并,但是您可能需要编写自己的合并逻辑,而不是使用std::merge。示例伪代码,如果1.txt结束,则需要添加eof检查,复制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"
        }
    }

您是否研究过外部排序:?您是否尝试过实现合并?该算法不需要将源代码保存在内存中,事实上它只作用于每个序列中的一个值。。。或者,您可以通过std::istream_迭代器和std::ostream_迭代器直接对输入使用算法。。。只是说输入文件应该已经排序了吗?正如David所说,std::istream_迭代器和std::merge可以很容易地协同工作。