4

stringstream に が含まれているとすると、個々の単語を取得するJames is 4ようなものを書くことができますgetline (stream, stringjames, ' ')が、行末に到達したことを知る方法はありますか?

ボーナス質問!ケース 1:James is 4 ケース 2:James is four

文字列ストリーム内の単語を繰り返し処理していて、int val 4 を受け取ることを期待しているのに、代わりに文字列を受け取った場合、これを確認する最善の方法は何でしょうか?

4

2 に答える 2

6

戻り値をチェックして、true または false と評価されるかどうかを確認します。

if (getline(stream, stringjames, ' '))
    // do stuff
else
    // fail

「おまけの質問」については、intストリームから やものを抽出するときにも同じことができます。の戻り値は、読み取りが成功した場合、およびエラーが発生した場合 (数字の代わりに文字があるなど) にoperator>>評価されます。truefalse

int intval;

if (stream >> intval)
    // int read, process
else if (stream.eof())
    // end-of-stream reached
else
    // int failed to read but there is still stuff left in the stream
于 2012-09-25T01:01:43.697 に答える
1

stringstreamにJamesが4であるとすると、getline(stream、stringjames、'')のようなものを記述して個々の単語を取得できますが、行の終わりに到達したことを知る方法はありますか?

通常、std::string変数に読み込むのが最も簡単です。デフォルトでは、とにかくスペースで区切られていると見なされます。

std::string word;
while (some_stream >> word)
{
    // first iteration "James", then "is", then "4", then breaks from while...
}

ボーナス質問!ケース1:ジェームズは4ですケース2:ジェームズは4です

文字列ストリーム内の単語を反復処理していて、int valが4になると予想しているのに、代わりに文字列を受け取った場合、これを確認するための最良の方法は何でしょうか。

最初にそれを読んでから、それを数値にstring変換できるかどうかを確認するのが最善ですstring。試してみてくださいstrtoi strtol。たとえば、「4q」などの値を検出して拒否できるように、値全体が有効な数値であるかどうかを示すのに役立ちます。

別の方法は、最初に整数型へのストリーミングを試行し、失敗した場合にのみ、ストリームのエラーフラグをリセットして、代わりに文字列を取得することです。文字列変数を読み取ることができるようにストリームの位置を変更する必要があるかどうかは思い出せませんが、いくつかのテストケースを記述して、それを理解することはできます。

または、正規表現と部分式の一致を使用して入力を解析することもできます。式がより複雑になるため、より便利になります。

于 2012-09-25T01:21:38.837 に答える