0

OK、プログラムはほぼ完了しました。ただし、Windowsで動作している間は、パフォーマンスの違いをテストするためにMacで実行することをお勧めします(Macのハードウェアははるかに高速です)。

テキストファイルの値を格納している順序付けされていないマップがあり、このマップをコピーしてキーと値のペアを逆にしています。

テキストファイルは新しい行を追加し続けます。調査の結果、Windowsが独自のキャリッジリターンを追加し(なぜ?!)、マップの1つおきの要素の最後にあることがわかりました。ファイルは「stringx、stringy」であるため、stringstreamを使用して文字列xとyをキーと値のペアに分割しています。

編集:答えの人に感謝します、御馳走を働きました!

4

4 に答える 4

2

それはどのように機能するかではありません、あなたはそれがどのように機能するかをここstd::string::replaceで読むべきです。

基本的な置換を行うために、それを行うための独自の関数を作成することもできますが、通常、キャリッジリターンは文字列の右側にあるため、トリミングの問題のようです。

次のようにすると、キャリッジリターンと改行を削除できます。

std::string& rtrim(std::string& str) {
    size_t endpos = str.find_last_not_of("\r\n");
    if(endpos != std::string::npos) {
        str.substr(0,endpos+1).swap(str);
    }
    return str;
}
于 2013-01-30T00:10:29.540 に答える
1

Windowsなどの一部の実装では、「r」の読み取りモードまたは「w」の書き込みモードを使用すると、「\n」を通過するときに「\r\n」が読み取り/書き込みされます。「wb」または「rb」を使用します。iostream関数の場合、ios::binaryフラグを渡す必要があると思います。

于 2013-01-30T00:08:57.283 に答える
0

私は今の質問が何であるかを理解していると思います。コードの違いに対処することではありません。実際には、Dos/Windows以外のマシンで「DOS/Windows」ファイルを使用しようとしていdos2unixます。ファイルの行末を修正するために使用する必要があります。

于 2013-01-30T00:21:08.567 に答える
0

Windowsは「\r\n」を使用して行を終了します。通常、さまざまなプラットフォームで実行されることになっているプログラムは、#ifdef同様の違いを処理するためにいくつかを使用します。

于 2013-01-30T00:14:09.717 に答える