7

std::stringstream を使用して、固定形式の文字列を値に解析しています。ただし、解析される最後の値は固定長ではありません。

そのような文字列を解析するには、次のようにします。

std::stringstream ss("123ABCDEF1And then the rest of the string");
ss >> std::setw(3) >> nId
   >> std::setw(6) >> sLabel
   >> std::setw(1) >> bFlag
   >> sLeftovers;

しかし、文字列の残りの部分が出力されるように幅を設定するにはどうすればよいでしょうか?

試行錯誤の結果、これが機能することがわかりました。

   >> std::setw(-1) >> sLeftovers;

しかし、正しいアプローチは何ですか?

4

4 に答える 4

3

入力演算子>>は空白で読み取りを停止することに注意してください。

egstd::getlineを使用して、文字列の残りを取得します。

std::stringstream ss("123ABCDEF1And then the rest of the string");
ss >> std::setw(3) >> nId
   >> std::setw(6) >> sLabel
   >> std::setw(1) >> bFlag;
std::getline(ss, sLeftovers);
于 2012-11-21T15:29:15.687 に答える
2

std::setwつまり>> bFlag、デフォルトにリセットされるため、リセットするために何もする必要はありません。

つまり、あなたのコードはうまくいくはずです

std::stringstream ss("123ABCDEF1And then the rest of the string");
ss >> std::setw(3) >> nId
   >> std::setw(6) >> sLabel
   >> std::setw(1) >> bFlag
   >> sLeftovers;
于 2012-11-21T15:30:39.323 に答える
1

これを試して:

std::stringstream ss("123ABCDEF1And then the rest of the string");
std::stringstream::streamsize initial = ss.width(); // backup
ss >> std::setw(3) >> nId
   >> std::setw(6) >> sLabel
   >> std::setw(1) >> bFlag
   >> sLeftovers;

ss.width(initial); // restore
于 2012-11-21T15:30:57.837 に答える
0

これが文書化されているのを見たことがないので、実際に機能することに驚いてsetw(-1)います。VC10でコードを試したところ、「And」しか表示されませんでしたsLeftovers。おそらくstd::getline( ss, sLeftovers )、VC10で機能した文字列の残りの部分に使用します。

于 2012-11-21T16:16:30.103 に答える