1

次のように一連の文字列を出力しています。

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 に変更しましたが、問題はまだ存在します。助けてくれてありがとう。

4

1 に答える 1

7

文字列にtimeキャリッジリターンが含まれている可能性があります\r。その場合、最初の方法を使用して出力すると、カウントと区切り文字が出力され\rますが、は行の先頭に戻り、上書きを開始します。

2番目のメソッドは、前の行にあるため、カウントを上書きしません(\rすでに行の先頭にいる場合は、目に見える効果はほとんどありません)。

UNIXライクなプラットフォームで実行している場合は、出力をod -xcb(16進ダンプフィルター)のようなものにパイプして、出力にが含まれているかどうかを確認でき\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をやめて、自動フラッシングで処理することができます。

于 2012-11-06T07:23:56.043 に答える