奇怪的stdout行为

时间:2011-11-24 11:00:11

标签: c++ buffer stdout std cout

我目前正在用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:Dick是什么?”

themsg [1]是字符串“39416”

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

第二行应该打印“第3阶段:超级节点发送消息用户#2:怎么了Dick?动态端口号39416”

控制台输出如下所示:

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()但无济于事。我不确定输出缓冲区是如何工作的,所以我真的迷失了。

2 个答案:

答案 0 :(得分:6)

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

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

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

打印前剥离\r

答案 1 :(得分:0)

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