10

それぞれ 100 メガバイト以上の std::ofstream テキスト ファイルが 2 つあり、それらを連結したいと考えています。fstreams を使用してデータを保存し、単一のファイルを作成すると、通常、サイズが大きすぎるため、メモリ不足エラーが発生します。

O(n) よりも速くマージする方法はありますか?

ファイル 1 (160MB):

0 1 3 5
7 9 11 13
...
...
9187653 9187655 9187657 9187659 

ファイル 2 (120MB):

a b c d e f g h i j
a b c d e f g h j i
a b c d e f g i h j
a b c d e f g i j h
...
...
j i h g f e d c b a

マージ済み (380MB):

0 1 3 5
7 9 11 13
...
...
9187653 9187655 9187657 9187659 
a b c d e f g h i j
a b c d e f g h j i
a b c d e f g i h j
a b c d e f g i j h
...
...
j i h g f e d c b a

ファイル生成:

std::ofstream a_file ( "file1.txt" );
std::ofstream b_file ( "file2.txt" );

    while(//whatever){
          a_file << num << endl;
    }

    while(//whatever){
          b_file << character << endl;
    }

    // merge them here, doesn't matter if output is one of them or a new file
    a_file.close();
    b_file.close();
4

4 に答える 4

2

Windows の場合:-

system ("copy File1+File2 OutputFile");

Linux の場合:-

system ("cat File1 File2 > OutputFile");

しかし、答えは簡単です。ファイル全体をメモリに読み込まないでください。小さなブロックで入力ファイルを読み取ります:-

void Cat (input_file, output_file)
{
  while ((bytes_read = read_data (input_file, buffer, buffer_size)) != 0)
  { 
    write_data (output_file, buffer, bytes_read);
  }
}

int main ()
{
   output_file = open output file

   input_file = open input file1
   Cat (input_file, output_file)
   close input_file

   input_file = open input file2
   Cat (input_file, output_file)
   close input_file
}
于 2013-10-24T11:58:12.953 に答える
2

これに「純粋な」C++を使用するかどうかは、個人的には移植性を犠牲にして、次のように書きたいと思うかどうかによって異なります。

#include <cstdlib>
#include <sstream>

int main(int argc, char* argv[]) {
    std::ostringstream command;

    command << "cat "; // Linux Only, command for Windows is slightly different

    for (int i = 2; i < argc; ++i) { command << argv[i] << " "; }

    command << "> ";

    command << argv[1];

    return system(command.str().c_str());
}

それは良いC++コードですか?いいえ、そうではありません (移植性がなく、コマンド引数をエスケープしません)。

しかし、それはあなたが今立っている場所よりもずっと先に行くでしょう.

ストリームが管理できるすべての醜さを備えた「本物の」C++ソリューションについては...

#include <fstream>
#include <string>

static size_t const BufferSize = 8192; // 8 KB

void appendFile(std::string const& outFile, std::string const& inFile) {
    std::ofstream out(outFile, std::ios_base::app |
                               std::ios_base::binary |
                               std::ios_base::out);

    std::ifstream in(inFile, std::ios_base::binary |
                             std::ios_base::in);

    std::vector<char> buffer(BufferSize);
    while (in.read(&buffer[0], buffer.size())) {
        out.write(&buffer[0], buffer.size());
    }

    // Fails when "read" encounters EOF,
    // but potentially still writes *some* bytes to buffer!
    out.write(&buffer[0], in.gcount());
}
于 2013-10-24T11:59:47.523 に答える