2

2012/11/13 更新: 私の質問がすでに出されていることがわかりました。さまざまな行末テキスト ファイルを処理するための適切なソリューションを次に示します。 Std :: ifstream を取得して LF、CR、および CRLF を処理しますか?

libstdc++ に貢献できますか? どのように?


2012/11/11

cout に問題があることがわかりました。
getline() から 2 つの文字列が返された場合
、2 番目の文字列が出力の最初の文字列を上書きします。

これはサンプルコードです:

#include<iostream>
#include<fstream>
using namespace std;

int main()
{
    //normal code
    cout << "Normal result:" << endl;
    string str1 = "hello";
    cout << str1;
    str1 = "123";
    cout << str1;

    cout << endl;

    //broken code
    cout << "Bug?" << endl;
    ifstream fin;
    fin.open("test.dat");

    string str;

    getline(fin, str);
    cout << str;

    getline(fin, str);
    cout << str;

    fin.close();
    return 0;
}

入力ファイル (test.dat) は次のとおりです。

hello
123

出力は次のようになります。

Normal result:
hello123
Bug?
123lo

ubuntu 12.10 64 ビットを使用して
おり、コンパイラのバージョンは g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2 です。
何かアドバイス?バグを報告する場所を教えてくれる人はいますか?

4

1 に答える 1

3

libstdc ++のバグ(gccと同様に発生する可能性がありますが、最近ではかなりまれです)よりも、入力ファイルに誤った行末があります-おそらくDOS/WindowsCR+LFの行末を使用しています。 getline()LFを破棄します-最初の文字列の上に2番目の文字列が書き込まれます。プログラムの出力をある種のhex-dumperで実行すると、これを簡単に確認できますxxd

印刷時に、読み取った文字列の最後を確認するか\r(MacOSからバージョン9まではこれをEOLマーカーとして使用)、入力を修正するか、出力に新しい行を適切に追加します。

于 2012-11-11T23:55:46.830 に答える