簡體   English   中英

cout部分打印而沒有endl

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM