Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不带尾端不能部分打印_C++_Cout_Output - Fatal编程技术网

C++ 不带尾端不能部分打印

C++ 不带尾端不能部分打印,c++,cout,output,C++,Cout,Output,我正在打印一组字符串,如下所示: cout<<count<<"|"<<newTime.time<<"|"<<newCat<<"|"<<newCon<<endl; 06:02:11:20:08|DB Mgr|Sending query: “SELECT * FROM users” strB|strC ===== strA| strB|strC ===== CR found at 0 显然,它漏掉

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

cout<<count<<"|"<<newTime.time<<"|"<<newCat<<"|"<<newCon<<endl;
06:02:11:20:08|DB Mgr|Sending query: “SELECT * FROM users” 
strB|strC
=====
strA|
strB|strC
=====
CR found at 0
显然,它漏掉了伯爵和|。但是,如果我将代码更改为

cout<<count<<"|"<<endl;
cout<<newTime.time<<"|"<<newCat<<"|"<<newCon<<endl;
我首先想到的是,这是否是缓冲区的问题。我将endl改为flush,但问题仍然存在。 谢谢您的帮助。

听起来您的时间字符串中可能有回车符。如果是这种情况,那么使用第一个方法输出仍然会输出计数和分隔符,但是\r将返回到行的开头并开始覆盖它

第二个方法不会覆盖计数,因为它位于前一行a\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;
}
但事实上,第一行实际上是:

strA|(\r)strB|strC
其中\r是回车符

请记住,您很少需要endl-它实际上是一个带有冲水的\n,在大多数情况下并不需要。您只需使用\n即可,并让自动刷新自行处理。

听起来您的时间字符串中可能有回车符。如果是这种情况,那么使用第一个方法输出仍然会输出计数和分隔符,但是\r将返回到行的开头并开始覆盖它

第二个方法不会覆盖计数,因为它位于前一行a\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;
}
但事实上,第一行实际上是:

strA|(\r)strB|strC
其中\r是回车符


请记住,您很少需要endl-它实际上是一个带有冲水的\n,在大多数情况下并不需要。您只需使用\n即可,并让自动刷新自行处理。

我已将代码更改为if newTime.time[0]='\r'newTime.time[0]='';cout@ljhljh235,不一定是一开始。很难说,因为06:02:11:20:08是一种非常不寻常的时间格式,我以前从未见过这种格式。最好检查整个字符串。已检查了整个字符串,但问题仍然存在。我的时间字符串严格按照mm:dd:hh:mm:ss格式创建,并且严格位于文件流中一行的开头。我读了getlinefin,oneline;时间戳newTimeoneline.substr0,14;问题解决了。真正的问题是输入文件中有一些奇怪的字符。在我规范化输入文件之后,现在没有问题了。谢谢你这么多时间@ljhljh235,我只能建议您检查程序的实际输出流。我已将代码更改为if newTime.time[0]='\r'newTime.time[0]='';cout@ljhljh235,不一定是一开始。很难说,因为06:02:11:20:08是一种非常不寻常的时间格式,我以前从未见过这种格式。最好检查整个字符串。已检查了整个字符串,但问题仍然存在。我的时间字符串严格按照mm:dd:hh:mm:ss格式创建,并且严格位于文件流中一行的开头。我读了getlinefin,oneline;时间戳newTimeoneline.substr0,14;问题解决了。真正的问题是输入文件中有一些奇怪的字符。在我规范化输入文件之后,现在没有问题了。谢谢你这么多时间@我只能建议你检查一下你程序的实际输出流。你试过了吗