2017-01-12 15 views
1

ソースとしてifstreamを指定し、を宛先として指定すると、ソース内のstreampos(offset)からNバイトをコピーする最も早い方法は何ですか?C++はあるストリームから別のストリームにNバイトをコピーします

編集

私は簡単なバッファ使用していたと思っている最も簡単な方法:私が好きな

char buf[BUF_SIZE]; 
is.seekg(offset); 
while (N > 0) { 
    int n = min(BUF_SIZE, N); 
    is.read(buf, n); 
    os.write(buf, n); 
    N -= n; 
} 

char *buf = new char[N]; 
is.seekg(offset); 
is.read(buf, N); 
os.write(buf, N); 
delete buf; 

以下の固定サイズのバッファをこれより速くて効率的なものがあるかどうかを知ることができます。

+1

あなたがこれまでにしようとしているソリューションを提供してください?そして、ホエーが働いていないことを説明してください。 –

+2

std :: copy_nを使用します。 –

+1

最速の方法は多くの詳細に依存します。興味のあるシステムに対していくつかの方法とベンチマークを試みるべきです。 –

答えて

0

さまざまなソリューションを試すことができます。効率について最も重要なこと - 対策

あなたはここにサンプルの実装を探すことができます:How to read a file into a vector elegantly and efficiently?

ほとんどの場合、大きなは、より高速な読み込み/書き込みが行くバッファ。そのような例えば、単一バイトを渡すために、イテレータのソリューションを使用する:

std::copy(std::istream_iterator<char>(is), 
      std::istream_iterator<char>(), 
      std::ostream_iterator<char>(os)); 

良さそうに見えますが、することは、かなり効率の点で最悪のシナリオである - 少なくとも、セットアップのために私がテストしてみました。

ファイル全体を一度に指定されたオフセットから大きなバッファに読み込むと、最良の結果が得られます。メモリの制限がない限り、これを試すことができます。これを行うには、ファイルサイズを計算し、バッファにデータを読み込み(たとえば、std::vector<char> buff(fileSize, 0)のように初期化)、それを1回の呼び出しで出力ストリームに書き込む必要があります。

Nバイトだけをコピーしたいので、ファイルサイズから開始オフセットを差し引いた値と比較して、1つの大きな読み取り/書き込み可能な値にしてください。例えば

// helper function 
streampos getSizeToEnd(ifstream& is) 
{ 
    auto currentPosition = is.tellg(); 
    is.seekg(0, is.end); 
    auto length = is.tellg() - currentPosition; 
    is.seekg(currentPosition, is.beg); 
    return length; 
} 

int main() 
{ 
    std::ifstream is; 
    std::ofstream os; 
    ... 
    const auto offset = 100; 
    is.seekg(offset); 
    std::vector<char> buff(getSizeToEnd(is), 0); 

    // read the data chunk to buffer and from buffer to output stream 
    is.read(buff.data(), buff.size()); 
    os.write(buff.data(), buff.size()); 
    ... 
} 
関連する問題