さまざまなソリューションを試すことができます。効率について最も重要なこと - 対策
あなたはここにサンプルの実装を探すことができます: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());
...
}
あなたがこれまでにしようとしているソリューションを提供してください?そして、ホエーが働いていないことを説明してください。 –
std :: copy_nを使用します。 –
最速の方法は多くの詳細に依存します。興味のあるシステムに対していくつかの方法とベンチマークを試みるべきです。 –