我打印了一串字符串如下:
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更改为flush,但问题仍然存在。 谢谢你的帮助。
答案 0 :(得分:7)
声音就像您的time
字符串中可能包含回车符\r
一样。如果是这种情况,那么使用第一种方法输出仍输出计数和分隔符,但\r
将返回到行的开头并开始覆盖它。
你的第二种方法不会覆盖计数,因为它位于上一行(如果你已经在行的开头,\r
将几乎没有明显效果。)
如果您在类UNIX平台上运行,可以通过类似od -xcb
(十六进制转储过滤器)的方式管道输出,以查看输出中是否有\r
。 / p>
或者,如果您的代码中有一个字符串,您可以看到它是否包含回车符,如下所示:
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
,并让自动刷新自行解决。