web-dev-qa-db-ja.com

文字列またはchar *をistreamに取り込む最適な方法は?

文字列または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) {

}
22
kal

それから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として使用できます。

17
Fredrik Jansson