[英]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.