如何使std::getline在字符串流结束时通知我

How do I make std::getline inform me when it has hit the end of a stringstream?

本文关键字:结束 通知 何使 std getline 字符串      更新时间:2023-10-16

假设字符串流包含James is 4,我可以写类似getline (stream, stringjames, ' ')的东西来获得单个单词,但有什么方法可以知道我已经到达了行的末尾吗?

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

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

您检查返回值,看看它的计算结果是true还是false:

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

至于"奖励问题",当从流中提取int和事物时,您也可以做同样的事情。如果读取成功,operator>>的返回值将评估为true,如果出现错误(例如有字母而不是数字),则评估为false

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

假设字符串流包含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岁

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

最好先将其读取为string,然后检查是否可以将该string转换为数字。您可以尝试strtoistrtol等,它们有助于指示整个值是否是合法数字,这样您就可以检测和拒绝像"4q"这样的值。

另一种选择是先尝试流式传输到整型中,只有在失败时才重置流上的错误标志并获取字符串。我不记得你是否需要重新定位流,这样你就可以读取字符串变量,但你可以写几个测试用例并解决它。

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