【问题标题】:getline(cin,input) with multiple lines? (C++)getline(cin,input) 有多行? (C++)
【发布时间】:2013-10-16 08:22:42
【问题描述】:

我在这里遇到了一个问题,这让我很难过。所以,我必须阅读以下格式的内容[请同时阅读正文,以便更好地理解我的问题]:

               TITLE

The text is actually from a file being redirected 
to input stream via piping in linux bash. I cannot
use ifstream or anything other than some form of cin,
of which I believe getline to be the most useful. 

etc.

具体来说,让我感到困难的是 TITLE 和正文之间的空白区域。我似乎想不出一种使用 getline(cin,string) 来解决这个问题的方法。

我想出的最好的:

while(inputString.size() != 0)
    getline(cin,inputString);
    //process string

... 与上述空白行一起被抛出窗口。

有什么想法吗,伙计们?

谢谢!

【问题讨论】:

    标签: c++ getline


    【解决方案1】:

    我认为这里真正的问题是你的逻辑。您的输入包含空行和非空行,因此如果您想读取所有行,则不应依赖行的长度。这可以通过测试std::getline 返回的流来完成,如下所示:

    while (getline(cin, inputString))
    {
        // Do something with inputString...
    }
    

    循环从cin逐行读取,并在到达输入末尾时停止。

    【讨论】:

    • 是的!这就是魅力。但是,您能快速解释一下为什么它会全部读取吗?
    • @assignment_operator std::getline 不仅修改了正在读取的流对象,它还返回它。如here 所述,可以通过将流对象强制转换为void* 指针(或自C++11 起显式的bool)来测试流对象的有效性。当出现读取错误时,您将获得一个零值 (false),例如流中没有更多数据。
    • 啊,好吧,现在更有意义了。谢谢,感谢您的时间和帮助。
    【解决方案2】:

    应该是

    while(inputString.size() == 0)
    

    当字符串大小为 0 时,您继续阅读。

    为了更清楚,试试这个

    while(inputString.empty())
    

    【讨论】:

    • 我为 size() 道歉,缺少的括号是我的 OP 中的一个错字。我已经尝试过了,但它将 TITLE 和正文之间的空白行标识为 0 并退出循环。还是谢谢你!我会在一分钟内尝试 empty()。
    • @assignment_operator 不幸的是,我最初错过了您代码中的主要错误,即您使用了!= 而不是==,请查看编辑后的答案。
    • 不幸的是,代码从 TITLE != size 0 开始在第一行退出。​​再次感谢您!
    • @assignment_operator 然后你错误地放置了你的while循环。似乎我误解了你的问题,它比我意识到的更基本。
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2017-01-24
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多