2015-04-01 72 views
0

如果緩衝區大小小於文件大小,如何合併兩個文件? 例如,我有兩個文件與排序整數如果緩衝區大小小於文件大小,如何合併兩個文件?

的1.txt和2.txt

​​

我有一個排序的文件進行合併他們,但我無法讀取從每超過兩個號碼文件(這是任務)。我無法同時在內存中存儲超過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

+0

你看過外部排序:http://en.wikipedia.org/wiki/External_sorting? – NathanOliver 2015-04-01 19:47:46

+1

你是否嘗試過實施'合併'?該算法不要求將源保存在內存中,事實上它只能對每個序列的一個值進行操作......或者,您可以直接在輸入中使用算法,方法是使用'std :: istream_iterator'和'std :: ostream_iterator' ...只是說 – 2015-04-01 19:53:48

+0

輸入文件是否應該已經排序? – Christophe 2015-04-01 19:54:19

回答

0

正如在註釋中,你只需要從每個文件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" 
     } 
    }