【问题标题】:Strange stdout behavior奇怪的标准输出行为
【发布时间】:2011-11-24 11:00:10
【问题描述】:

我目前正在用 C++ 编写一个套接字程序,但由于某种原因,我在尝试写入控制台(一项必需的任务)时偶然发现了非常奇怪的行为。

cout << themsg[0] << themsg[1] << endl;
cout << "Phase 3: Supernode sent the message " << themsg[0] << " on dynamic port number " << themsg[1] << endl;

themsg[0] 是字符串“User#2:What's up Dick?”

themsg[1] 是字符串“39416”

第一行应该写“用户#2:迪克怎么了?”到控制台,然后是“39416”。

第二行应打印“第 3 阶段:超级节点在动态端口号 39416 上发送消息 User#2:What's up Dick?”

控制台输出如下:

394162:What's up Dick?
on dynamic port number 39416essage User#2:What's up Dick?

我知道themsg[0] 和themsg[1] 是正确的,因为我将它们的值写入文件以进行验证。这肯定是一些奇怪的标准输出问题。

对于第一行,themsg[1] 的 5 个字符似乎覆盖了 themsg[0] 的前五个字符。对于第二行,似乎忽略了 cout 的前两个参数,然后附加了一个消息片段。

如果有人可以提供帮助,我将不胜感激。我尝试使用 flush() 但无济于事。我不太确定输出缓冲区是如何工作的,所以我真的很迷茫。

【问题讨论】:

  • 显示一些代码,包括themsg数组的初始化。
  • 问题已解决。该字符串附加了 /r 虚拟回车符。哎呀!

标签: c++ buffer stdout std cout


【解决方案1】:

themsg[0] 的末尾可能有一个回车符号\r。我可以在 Linux 上使用以下程序重现该行为:

int main()
{
    std::cout << "User#2: what's up?\r" << "39416" << std::endl;
}

\r,如果后面没有\n,则具有将终端的虚拟“carriage”返回到行首的效果,因此下一次打印将覆盖已经存在的内容。但是,您不会在文件中看到此内容,因为该文件将只包含包括 CR 在内的两个字符串。

打印前去掉\r

【讨论】:

  • 哇!太感谢了。不仅解决了问题。我也学到了一些东西:-)。如何将 \r 附加到我的字符串中?这有时是串联的结果吗?
  • @aaronmar:它们通常是在从互联网连接或二进制模式下的 Windows 文件中读取的字符串中仅剥离 \n 时出现的。 Windows 和所有基于文本的 Internet 协议使用 \r\n 表示行尾。 C++ 文本模式流可能会对您隐藏这一点,但二进制流不会,并且在 Unix 平台上,文本和二进制是相同的。
【解决方案2】:

我怀疑问题出在您的 themes 变量中。我测试了您的确切设置 - 并且使用正确的值,它可以正常工作。但是,我随后测试了相同的设置,但将\r 附加到themsg[1]themsg[2] 的末尾 - 并得到了你的行为。由于您的字符串 themsg[1] 来自网络,它可能包含行尾 - 并且来自不同的操作系统(例如 UNIX 与 Windows) - 这将转换为没有换行符的回车 - 导致您的行为再看。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2016-10-02
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    相关资源
    最近更新 更多