繁体   English   中英

在cout中奇怪的错误打印getline()字符串

[英]Strange error printing getline() strings in cout

当我在测试用例的输入中遇到一个奇怪的问题时,我正在尝试测试我的类。 我试图简化输入以查看问题所在,因此在下面创建了该程序。

#include <iostream>
#include <string>

int main()
{
    std::string number;
    while (std::getline(std::cin, number))
    {
        std::cout << std::string(number) << " ";
    }
}

基本上,我要获取文本的每一行,并使用getline()将其存储在字符串变量中。 然后,我使用std :: cout显示每个字符串,并附加一个空格字符。

我的输入文件包含以下内容:

one six
one seven

预期的输出应如下所示:

one six one seven

但是,我得到的是:

 one seven

这是空格字符,后跟输入的第二行。 它忽略输入的第一行。 我知道事实是每一行都可以正确读取,因为当我用以下代码替换代码时,它们可以正确显示:

std::cout << std::string(number) << std::endl;

这个错误对我来说是很新的。 这里发生了什么事? 有人可以解释吗? TIA!

好的,很清楚。

输入文件必须为:具有正常Windows EOL的one six\\r\\ntwo seven\\r\\n

当您在cygwin下阅读时,首先读到one six\\r ,只有\\ngetline吃掉,而在第二行上读到同样的one seven\\r

因此,您这样写: one six\\r one seven\\r (以空格结尾)。 但是,仅\\r会将Curson放回同一行的第一列,然后第二行首先擦除。

通常,如果用将光标移到新行上的std::eol替换结尾的空格,则该问题是不可见的。 选项卡( \\t )确实是一种特殊情况:将光标完全放在期望的位置的第八列上,但这只是偶然。 如果将两行反转,则将更加明显,因为您会在第二行的末尾看到第一行的其余部分。

您可以通过将输出写入文件并进行编辑来确认。

我可以在带有Windows EOL的Linux下重现它。 这样做的原因是Cygwin紧密模仿Unix-Linux并仅使用\\n Unix EOL约定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM