当它到达字符串流的末尾时,如何让std :: getline通知我?

时间:2012-09-25 00:59:55

标签: c++ io stringstream

假设stringstream包含James is 4,我可以编写类似getline (stream, stringjames, ' ')的内容来获取单个单词,但有没有办法知道我已经到达了行尾?

奖金问题! 案例1:James is 4 案例2:James is four

如果我正在迭代字符串流中的单词,并且我希望得到一个4的int值,但我收到了一个字符串,那么检查这个的最佳方法是什么?

2 个答案:

答案 0 :(得分:6)

检查返回值以查看它是否为真或假:

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

至于“奖金问题”,从流中提取int和事物时,你也可以做同样的事情。如果读取成功,operator>>的返回值将评估为true;如果出现错误(例如字母而不是数字),则false的返回值将评估为:{/ p>

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

答案 1 :(得分: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值,但我收到了一个字符串,那么检查这个的最佳方法是什么?

最好先将其读入string,然后检查是否可以将string转换为数字。您可以尝试strtoi strtol等 - 它们有助于指示整个值是否为合法数字,以便您可以检测并拒绝像“4q”这样的值。

另一种方法是首先尝试流式传输到整数类型,并且只有在它失败时才重置流上的错误标志并获取字符串。我不记得你是否需要重新定位流以便你可以读取字符串变量,但是你可以编写几个测试用例并将其搞定。

或者,您可以使用正则表达式和子表达式匹配来解析输入:当表达式变得更复杂时更有用。