文字列またはchar *ポインタをistreamに取り込むための最適な方法は何ですか。
次のことをしたい
std::string a = "abc..";
//I know this can be done, not sure if this is most efficient
// and not sure about char* pointers
std::istringstream istr (a);
...
foo (istr);
void foo(std::istream& is) {
}
それからistringstream、null文字までのchar *、またはstd :: string:からのすべてのものを構築したい場合
istringstream str(ptr); // char*
istringstream str(other_str); // std::string
Istreamのバッファに生のポインタが必要だと話している場合、それはできません。ストリームは、ファイルやターミナルなどから必要な場合にオンデマンドでデータを取得し、オプションでデータをバッファリングします(正確には正しくありません。生のポインタを受け入れて読み取り/書き込みを行うstrstream
を使用できます。それから直接ですが、これは非推奨のクラスです-使用しないでください。幸運なことに、これまでに使用したことはありません)。ポインタのように使用できるものだけが必要な場合は、streambufイテレータを使用できます。ただし、これらは実際にはポインタではないため、end
やその他のものからbegin
を引くことはできません。
std::istreambuf_iterator<char> begin(one_istream), end;
while(begin != end)
std::cout << *begin++;
文字列ストリームに書き込まれたものから文字列を取得することについて話す場合は、ostringstream::str
を使用できます。
ostringstream o;
o << "This is a number: " << 42;
std::string str = o.str(); // str == "This is a number: 42"
それ以外の場合は、通常、istream
から読み取りのものしかできません。 ostream
が必要な場合は、次のことができます
stream.write(ptr, N);
stream.write(ptr.c_str(), ptr.c_str() + ptr.size());
strが指すバイトから正確にN文字を書き込みます。 <<
を使用してストリームに書き込むこともできます。 null文字までのすべて、またはstd :: stringからのすべてを書き込みますが、フィールド幅などのフォーマットフラグを尊重します。
stream << ptr; // char*
stream << other_str; // everything from std::string
これは機能します:
std::istringstream is("abc...");
また、istringstreamはistreamであるため、isオブジェクトをistreamとして使用できます。