【问题标题】:How do I make std::getline inform me when it has hit the end of a stringstream?当 std::getline 到达字符串流的末尾时,如何让我通知我?
【发布时间】:2012-09-25 00:59:55
【问题描述】:

假设 stringstream 包含 James is 4 ,我可以写 getline (stream, stringjames, ' ') 之类的东西来获取单个单词,但是有什么方法可以知道我已经到了行尾吗?

奖金问题! 案例一:James is 4 案例二:James is four

如果我正在遍历字符串流中的单词,并且我希望收到一个 4 的 int val,但我收到的是一个字符串,那么最好的检查方法是什么?

【问题讨论】:

    标签: c++ io stringstream


    【解决方案1】:

    你检查返回值,看看它是真还是假:

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

    至于“奖励问题”,您也可以在从流中提取ints 和其他内容时执行相同的操作。如果读取成功,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
    

    【讨论】:

    • +1,这就是我会做的,虽然要准确回答这个问题,你不仅应该测试流是否有效,而且失败是由于到达文件结尾(而不是任何其他错误)
    • @DavidRodríguez-dribeas 谢谢,我修改了答案以反映这一点。我认为您不需要使用 getline 这样做,因为它不会因任何其他原因而失败(我认为)。
    【解决方案2】:

    假设 stringstream 包含 James is 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”之类的值。

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 2018-04-05
      相关资源
      最近更新 更多