当我在测试用例的输入中遇到一个奇怪的问题时,我试图测试我的类。 我试图简化输入,看看出了什么问题,所以我创建了下面的程序。
#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!
答案 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约定。