4
std::string s;
std::stringstream ss;
ss << "a=b+c" << std::endl << "d=e+f";

std::getline(ss, s, '=');   // gives me "a"
std::getline(ss, s);        /* gives me "b+c"  <- just want to peek: don't
                                                  want to change state of ss */
std::getline(ss, s, '+');   // BUT still want "b" here, not "d=e"

snow containsでは、行の残りの文字 ( ) を確認する"a"にはどうすればよいですか? つまり、次の操作を次の行から開始させずに?"b+c"

(考案された例、私は知っています。)

4

4 に答える 4

3

次のように istream::seekg() を使用して文字列ストリームを元に戻すことができます。

ss.seekg(ss.beg);

その後、もう一度読み直すことができます。これは、メモリを節約し、わずかに高速であるため、新しいものを作成するよりも優れています。

于 2013-05-15T19:31:14.733 に答える
3

試す:

std::getline(ss, s, '=');                     // gives me "a"
std::getline(ss, s);                          // gives me "b+c"
ss.seekg(-(s.size()+1) ,std::ios_base::cur);  // Roll back
                                              // Need to +1 becuase we throw away a character
                                              // with std::getline() that is not in the string.

std::getline(ss, s, '+');                     // gives me "b"

上記の問題は、std::getline() が eof の前に見つかった場合、'\n' を破棄することです。しかし、最初に eof が見つかった場合は、+1 が間違った場所に置かれるため、問題が発生します。したがって、上記の例では機能しますが、すべての行が「\ n」で終了することを保証しない限り、最後の行では失敗します

したがって、その保証を提供できない場合は、tellg() を使用できます。

std::getline(ss, s, '=');                     // gives me "a"
std::streampos  save = ss.tellg(); 
std::getline(ss, s);                          // gives me "b+c"
ss.seekg(save);                               // Roll back


std::getline(ss, s, '+');                     // gives me "b"
于 2013-05-15T20:12:14.233 に答える