[英]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
,只有\\n
被getline
吃掉,而在第二行上读到同样的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.