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

时间:2014-07-13 10:13:56

标签: c++ string standards std 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!

1 个答案:

答案 0 :(得分:2)

好的,很清楚。

您的输入文件必须是:one six\r\ntwo seven\r\n,且Windows EOL正常。

当您在cygwin下阅读时,您会先阅读one six\r\n仅被getline吃掉,而one seven\r会被one six\r one seven\r吃掉。< / p>

所以你写:\r(结尾为空白)。但std::eol单独将光标放回同一行的第一列,第二行首先删除。

通常,如果您将结束空白替换为将光标放在新行上的\t,则问题不可见。标签(\n)如果真的是一个特殊情况:它将光标放在第八列的确切位置,但纯粹的机会。如果你反转这两行,那就更明显了,因为你会在第二行结束时看到第一行的剩余部分。

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

我可以使用Windows EOL在Linux下重现它。原因是Cygwin非常模仿Unix-Linux并使用仅仅{{1}}的Unix EOL约定。