とにかくfstream
(ファイル)からstringstream
(メモリ内のストリーム)にデータを転送できますか?
現在、私はバッファを使用していますが、データをバッファにコピーしてからバッファを文字列ストリームにコピーする必要があるため、メモリを2倍にする必要があります。バッファを削除するまで、データはメモリに複製されます。
std::fstream fWrite(fName,std::ios::binary | std::ios::in | std::ios::out);
fWrite.seekg(0,std::ios::end); //Seek to the end
int fLen = fWrite.tellg(); //Get length of file
fWrite.seekg(0,std::ios::beg); //Seek back to beginning
char* fileBuffer = new char[fLen];
fWrite.read(fileBuffer,fLen);
Write(fileBuffer,fLen); //This writes the buffer to the stringstream
delete fileBuffer;`
誰かが中間バッファを使用せずにファイル全体を文字列ストリームに書き込む方法を知っていますか?
// need to include <algorithm> and <iterator>, and of course <fstream> and <sstream>
ifstream fin("input.txt");
ostringstream sout;
copy(istreambuf_iterator<char>(fin),
istreambuf_iterator<char>(),
ostreambuf_iterator<char>(sout));
ifstream f(fName);
stringstream s;
if (f) {
s << f.rdbuf();
f.close();
}
ostream
のドキュメントには、 operator<<
のオーバーロードがいくつかあります。それらの1つはstreambuf*
を受け取り、ストリームバッファのすべてのコンテンツを読み取ります。
以下は使用例です(コンパイルおよびテスト済み)。
#include <exception>
#include <iostream>
#include <fstream>
#include <sstream>
int main ( int, char ** )
try
{
// Will hold file contents.
std::stringstream contents;
// Open the file for the shortest time possible.
{ std::ifstream file("/path/to/file", std::ios::binary);
// Make sure we have something to read.
if ( !file.is_open() ) {
throw (std::exception("Could not open file."));
}
// Copy contents "as efficiently as possible".
contents << file.rdbuf();
}
// Do something "useful" with the file contents.
std::cout << contents.rdbuf();
}
catch ( const std::exception& error )
{
std::cerr << error.what() << std::endl;
return (EXIT_FAILURE);
}
C++標準ライブラリを使用する唯一の方法は、ostrstream
ではなくstringstream
を使用することです。
独自のcharバッファーを使用してostrstream
オブジェクトを構築すると、バッファーの所有権が取得されます(これ以上コピーする必要はありません)。
ただし、strstream
ヘッダーは非推奨であり(ただし、C++ 03の一部であり、ほとんどの標準ライブラリ実装で常に使用可能です)、次の場合に大きな問題が発生します。 ostrstreamに提供されたデータをnullで終了することを忘れます。これは、ストリーム演算子にも適用されます。例:ostrstreamobject << some_data << std::ends;
(std::ends
nullはデータを終了します)。