2011-11-24 40 views
1

我目前正在用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阶段:超级节点发送的邮件用户#2:这是怎么回事迪克动态端口号39416”

控制台输出内容如下:

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

我知道msg [0]和msg [1]是正确的,因为我将它们的值写入文件进行验证。肯定会有一些奇怪的stdout问题。

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

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

+1

代码是多线程的吗? –

+0

显示一些代码,包括'themsg'数组的初始化。 –

+0

问题已解决。该字符串附加了/ r虚拟回车符。哎呀! – aaronmar

回答

6

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

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

\r,不跟时\n,具有返回终端的虚拟“carriage”的行开头的效果,所以下一个打印将覆盖已经存在的内容。但是,您不会在文件中看到该文件,因为该文件只包含两个包含CR的字符串。

打印前剥去\r

+0

哇!非常感谢。它不仅解决了这个问题。我也学到了一些东西:-)。 \ r如何可以附加到我的字符串?这是否有时是串联的结果? – aaronmar

+0

@aaronmar:他们通常会在从二进制模式下从互联网连接或Windows文件读取的字符串中仅剥离“\ n”。 Windows和所有基于文本的互联网协议使用'\ r \ n'来表示行尾。C++文本模式流可能会隐藏你的内容,但二进制流不会,在Unix平台上,文本和二进制文件是相同的。 –

0

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