【问题标题】:Strange error printing getline() strings in cout在 cout 中打印 getline() 字符串时出现奇怪的错误
【发布时间】:2014-07-13 10:13:55
【问题描述】:

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

#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;

这个错误对我来说很新鲜。这里发生了什么事?谁能解释一下?蒂亚!

【问题讨论】:

  • 尝试:std::cout
  • 这很奇怪。所有std::endl 的不同之处在于刷新输出。您是否尝试将cout.flush() 添加到循环中?
  • 我无法用 g++ 或 msvc2013 重现您的问题。我知道你不需要在那些cout 电话中说std::string(number)。您正在无缘无故地创建临时副本。就做std::cout &lt;&lt; number &lt;&lt; ...
  • 请注意,输入来自文本文件,我在命令行中运行程序:./main
  • @dari 我试过了,结果一样。

标签: c++ string standards std cout


【解决方案1】:

好的,很清楚。

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

当你在 cygwin 下阅读时,你会进入第一次阅读 one six\r,只有 \ngetline 吃掉,第二行的 one seven\r 相同。

所以你写:one six\r one seven\r(结尾是空白)。但是 \r 单独将光标放回同一行的第一列,第二行首先擦除。

如果将结尾空白替换为std::eol,则通常不会出现问题,这会将光标放在新行上。选项卡 (\t) 如果真的是一个特殊情况:它将光标准确地放在您期望的第八列上,但纯属偶然。如果将这两行倒置会更明显,因为您会在第二行末尾看到第一行的剩余部分。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多