cout部分打印没有endl

ljh*_*235 1 c++ cout output

我正在打印一串字符串如下:

cout<<count<<"|"<<newTime.time<<"|"<<newCat<<"|"<<newCon<<endl;
Run Code Online (Sandbox Code Playgroud)

其中count是计数器,newTime.time是一个时间字符串,newCat和newCon都是字符串.输出如下:

06:02:11:20:08|DB Mgr|Sending query: “SELECT * FROM users” 
Run Code Online (Sandbox Code Playgroud)

显然,它遗漏了计数和"|".但是,如果我将代码更改为

cout<<count<<"|"<<endl;
cout<<newTime.time<<"|"<<newCat<<"|"<<newCon<<endl;
Run Code Online (Sandbox Code Playgroud)

输出刚刚变成了

2|
06:02:11:20:08|DB Mgr|Sending query: “SELECT * FROM users” 
Run Code Online (Sandbox Code Playgroud)

我第一次想到这是否是缓冲问题.我将endl更改为flush,但问题仍然存在.谢谢你的帮助.

pax*_*blo 7

这听起来像你的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.
}
Run Code Online (Sandbox Code Playgroud)

举例来说,以下程序:

#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;
}
Run Code Online (Sandbox Code Playgroud)

似乎输出以下内容:

strB|strC
=====
strA|
strB|strC
=====
CR found at 0
Run Code Online (Sandbox Code Playgroud)

但实际上第一行实际上是:

strA|(\r)strB|strC
Run Code Online (Sandbox Code Playgroud)

(\r)回车在哪里.


请记住,你很少需要endl- 它实际上是\n一个冲洗,这在大多数情况下并不是必需的.您可以\n放心使用,让自动冲洗自行处理.