[英]cout partially print without endl
我正在打印一堆字符串,如下所示:
cout<<count<<"|"<<newTime.time<<"|"<<newCat<<"|"<<newCon<<endl;
其中count是一个计数器,newTime.time是一个时间字符串,而newCat和newCon都是字符串。 输出如下:
06:02:11:20:08|DB Mgr|Sending query: “SELECT * FROM users”
显然,它省略了计数和“ |”。 但是,如果我将代码更改为
cout<<count<<"|"<<endl;
cout<<newTime.time<<"|"<<newCat<<"|"<<newCon<<endl;
输出刚变成
2|
06:02:11:20:08|DB Mgr|Sending query: “SELECT * FROM users”
我首先想到的是这是否是缓冲区的问题。 我将endl更改为冲洗,但问题仍然存在。 谢谢你的帮助。
听起来您的time
字符串中可能包含回车符\\r
。 如果是这种情况,那么使用您的第一种方法进行输出仍然会输出计数和分隔符,但是\\r
将返回到行的开头并开始覆盖它。
第二种方法不会覆盖计数,因为它位于前一行(如果您已经在该行的开头, \\r
几乎看不到效果)。
如果您在类似UNIX的平台上运行,则可以通过od -xcb
(十六进制转储过滤器)之类的内容通过管道传递输出,以查看输出中是否存在\\r
。
另外,如果您的代码中有一个字符串,则可以查看它是否包含带有以下内容的回车符:
std::string s = "whatever";
size_t pos = s.find ('\r');
if (pos != std::string::npos) {
// carriage return was found.
}
例如,以下程序:
#include <iostream>
int main (void) {
std::string s1 = "strA";
std::string s2 = "\rstrB";
std::string s3 = "strC";
std::cout << s1 << '|' << s2 << '|' << s3 << '\n';
std::cout << "=====\n";
std::cout << s1 << '|' << '\n';
std::cout << s2 << '|' << s3 << '\n';
std::cout << "=====\n";
size_t pos = s2.find ('\r');
if (pos != std::string::npos)
std::cout << "CR found at " << pos << '\n';
return 0;
}
似乎输出以下内容:
strB|strC
=====
strA|
strB|strC
=====
CR found at 0
但实际上第一行实际上是:
strA|(\r)strB|strC
其中(\\r)
是回车符。
并且请记住,您很少需要endl
实际上,它是带有\\n
,在大多数情况下并不是必须的。 您可以使用\\n
摆脱\\n
,让自动冲洗功能自理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.