我目前正在用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()但无济于事。我不确定输出缓冲区是如何工作的,所以我真的迷失了。
答案 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) - 这将转换为不带换行符的回车符 - 从而导致行为你看到了。