ifstream
ファイルからいくつかのデータを読み取るために使用するコードがいくつかあり、すべてが機能します。
今、私は、いくつかのコードを変更せずに、メモリからこのデータを読みたいと思っています。実際にはchar *
、データを含む...
ファイルを効果的に読み取らずにchar *
データをに入れるにはどうすればよいですか?ifstream
の使用std::istringstream
(先頭に を付けずに誤って参照されることもありi
ます。そのようなクラスは存在しますが、出力ストリームも設定するため、構築にコストがかかります) は非常に人気がありますが、これにより、最小 — 実際の文字列の 1 つのコピー (ほとんどの実装では 2 つのコピーが作成されると思います)。単純なストリーム バッファを使用して、コピーの作成を回避できます。
struct membuf: std::streambuf {
membuf(char* base, std::ptrdiff_t n) {
this->setg(base, base, base + n);
}
};
membuf sbuf(base, n);
std::istream in(&sbuf);
メモリの小さな領域の場合、違いは問題にならないかもしれませんが、保存された割り当てもそこで目立つ場合があります。メモリのチャンクが大きい場合、大きな違いが生じます。
標準ライブラリは、書き込み可能なインメモリistream
も提供します: std::stringstream
.
istream
の代わりにジェネリックを受け入れ、ifstream
を構築しstringstream
、データを入力して関数に渡すように、コードを適切に抽象化する必要があります。
例えば:
const char* data = "Hello world";
std::stringstream str((std::string(data))); // all the parens are needed,
// google "most vexing parse"
do_something_with_istream(str); // pass stream to your code
を使用するコードをifstream&
少し変更して を使用できる場合は、とistream&
を簡単に切り替えることができます(メモリからデータを読み取るため)。ifstream
istringstream
void read_data(std::istream& in)
{
}
発信者:
std::istringstream in_stream(std::string("hello"));
read_data(in_stream);
std::ifstream in_file("file.txt");
read_data(in_file);
文字列ストリームを検索している可能性があります。http://www.cplusplus.com/reference/sstream/stringstream/ . 以前に一度だけ使用したことがあり、長い間使用されていましたが、基本的にはメモリ内の場所からストリーミングできます.
私のプロジェクトでは、バイナリ データを文字列ストリームに書き込むため、iostream の write() メソッドと read() メソッドを使用します。申し訳ありませんが、次のコードはテストされておらず、おそらく構文エラーがあります (オフィスからの入力... ;-) が、このようなコードを使用すると、メモリ、ファイル、およびその他の場所 (ネットワーク ソケットなど) に書き込むことができます。
void foo(std::iostream *mystream)
{
mystream.write("Hello", 5);
uint32_t i=5302523;
mystream.write((char*) &i, sizeof i);
}
int main()
{
// Write to memory. stringstream's write() and read() work binary
std::stringstream memstream;
foo(&memstream);
// Write to file
std::fstream f;
try
{
f.open("file.dat");
foo(&f);
}
catch (...)
{
// ...
}
if (f.is_open())
f.close();
return EXIT_SUCCESS;
}