【问题标题】:cout partially print without endlcout 部分打印没有 endl
【发布时间】:2012-11-06 07:18:17
【问题描述】:

我正在打印一堆字符串,如下所示:

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,但问题仍然存在。 感谢您的帮助。

【问题讨论】:

  • 你试过cout&lt;&lt;count&lt;&lt;"|"&lt;&lt;newTime.time吗?

标签: c++ cout output


【解决方案1】:

听起来就像你的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 并让自动刷新自行处理。

【讨论】:

  • 我已将代码更改为if (newTime.time[0] == '\r') newTime.time[0] = ' '; cout&lt;&lt;count&lt;&lt;"|"&lt;&lt;newTime.time.c_str()&lt;&lt;"|"&lt;&lt;newCat&lt;&lt;"|"&lt;&lt;newCon&lt;&lt;endl;,但似乎仍然无法正常工作。
  • @ljhljh235,一开始并不是必要。很难说,因为06:02:11:20:08 是一种相当不寻常的时间格式,我以前从未见过。你最好检查整个字符串。
  • 已经检查了整个字符串,但问题仍然存在。我的时间字符串严格以 mm:dd:hh:mm:ss 格式创建,并且严格位于文件流中一行的开头。我通过getline(fin, oneline); Timestamp newTime(oneline.substr(0, 14));阅读它
  • 问题已解决。真正的问题是输入文件中有一些奇怪的字符。在我规范化输入文件后,现在没有问题了。感谢您抽出这么多时间!
  • @ljhljh235,我只能建议您检查程序中的实际输出流。
猜你喜欢
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多