6

私はこのコードを持っています:

    std::string s = "\n\n\n\n+\n\n\n+";
    std::stringstream serializedDataStream(s);

    std::string plusCharacter, plusCharacter2;
    serializedDataStream >> plusCharacter ;
    cout << "plusCharacter "<<plusCharacter << "\n";
    serializedDataStream >> plusCharacter2 ;
    cout << "plusCharacter "<<plusCharacter2;

    //OUTPUT:
    //    plusCharacter +
    //    plusCharacter +

これは、stringsteam >>オペレーターが新しい行をスキップしたことを意味します。ドキュメントを調べましたstd::stringstreamが、なぜこれが発生しているのかについての説明が見つかりませんでした。これはコンパイラ固有の動作ですか、それともこれに依存できますか?

4

2 に答える 2

8

これは、フォーマットさoperator>>れた入力関数として動作するために発生します。フォーマットされた入力関数のプロセスの一部は次のとおりです。

noskipwsフォーマットされた各入力関数は、 (2番目の)引数がfalseのクラスsentryのオブジェクトを作成することによって実行を開始します。

noskipwsがfalseに設定されている場合(およびストリームのフラグskipwsがtrueである場合、これはデフォルトです)、オブジェクトは「次に使用可能な入力文字が空白文字であるsentry限り、各文字を抽出して破棄します」。c

一度に各行を読みたい場合は、を使用してstd::getlineください。この関数は、trueに設定され、テキスト行を読み取るフォーマットされていない入力関数として動作しますnoskipws行ターミネーター(std :: getline()のパラメーター3(デフォルトは'\ n'))で定義されます)。

于 2012-12-21T16:49:03.737 に答える
2

ここを読んでください。

FormattedInputFunctionとして動作します。先頭の空白をスキップする可能性のある歩哨オブジェクトを作成してチェックした後、連続する文字を抽出し、最初の要素がsで示される文字配列の連続する場所に格納します。

したがって、標準に従って、実際に何か面白いものが見つかるまで、ストリーム内にあるものすべてに沿って動き、それを読み返してから停止します。その後、次回も同じことを行います。

std::getline一方、次の改行文字まですべてを読み取り(これはストリームから削除されますが、返されることはありません)、すべてをで返しますstd::string。次に、そこから必要なもの(たとえば数値)を取得するのはあなた次第ですstring

編集:デフォルトのロケールで空白と見なされる文字を正確見つけるのに苦労しています。(cから継承された)で定義されたものと同じになると思いますが、この場合も100%同じであると自分自身に納得させることはできませんでした。ロケールが苦手です。isspacespace (0x20), form feed (0x0c), line feed (0x0a), carriage return (0x0d), horizontal tab (0x09) and vertical tab (0x0b).

于 2012-12-21T16:48:00.177 に答える