如何使std::getline在字符串流结束时通知我
How do I make std::getline inform me when it has hit the end of a stringstream?
假设字符串流包含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
转换为数字。您可以尝试strtoi
、strtol
等,它们有助于指示整个值是否是合法数字,这样您就可以检测和拒绝像"4q"这样的值。
另一种选择是先尝试流式传输到整型中,只有在失败时才重置流上的错误标志并获取字符串。我不记得你是否需要重新定位流,这样你就可以读取字符串变量,但你可以写几个测试用例并解决它。
或者,您可以使用正则表达式和子表达式匹配来解析您的输入:当表达式变得越来越复杂时,这更有用。
- 为什么在这个代码结束循环中没有得到结束
- 试图对缓存进行跨步测试,但程序并没有结束
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 为什么擦除方法会影响结束方法
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 函数如何通知用户它基于函数原型抛出异常?
- 删除映射和分割错误中的一个过去结束元素
- 如何在ECS框架中更新组件数据和通知系统
- 当 I2C 值在C++中发生变化时收到通知
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 如何使用 SFML 在贪吃蛇游戏中定义游戏结束?
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 为什么我的两个 cin 语句没有在程序结束时运行?
- 在函数结束后使用指向变量的指针是否安全?
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- C ++尝试并捕获未结束的程序
- 为什么我的程序在输入某个形状的面积的测量值后没有结束?
- 如何在点击通知时捕获用户的点击操作
- 如何使std::getline在字符串流结束时通知我
- Windows服务启动进程结束通知(20032008)