2011-07-11 6 views
4

私は、入力としてファイルを取得し、私は(引用符は始まりと終わりが、ファイルに含まれていないマーク)このような最初の行を読む:C++でremoveコマンドを使って文中の空白を削除する方法はありますか?

"  1,  2.0,  3.0,  4.0       " 

私はこのようにremoveコマンドを使用します。

astring = line; 
    cout << endl << "Before trim: " << line << endl; 
    remove(astring.begin(), astring.end(), ' '); 
    cout << endl << "After trim: " << astring << endl; 

ように私は出力を得た:私は1,2.0,3.0,4.0として出力を必要とする

1,2.0,3.0,4.02.0, 3.0,  4.0 

。ここでの問題は何ですか?

+0

タブ文字のように見えます。 –

答えて

7

std::removeは、削除されていない要素のすべてをシーケンス内で前方に移動するだけです。

s.erase(std::remove(s.begin(), s.end(), ' '), s.end()); 

これは消去削除イディオムと呼ばれて:あなたは、eraseを使用して、基盤となるコンテナを切り捨てる必要があります。 removeは、コンテナへの参照を持たないため、基になるコンテナ自体を切り捨てることはできません。コンテナ内の要素に対するイテレータのみを持ちます。

+0

私はこれがC++の標準ライブラリコンテナに関する最も奇妙なことの一つだと言わざるを得ません。 –

+0

@Greg:ええ、名前は 'remove'は本当に直感的ではありません。ただし、コンテナ内の要素の操作は一般的に非メンバーアルゴリズムですが、コンテナ自体の操作は一般的にコンテナクラスのメンバ関数です。 –

+0

感謝のジェイムズ......... ITS WORKS ............ – ebe

0

ジェームスは彼の答えで正しいと私に多くの仕事を助けました。 td :: removeは、削除されていない要素のすべてをシーケンス内で前方に移動するだけです。次に、消去を使用して、基になるコンテナを切り捨てる必要があります。

std.erase(std :: remove(s.begin()、s.end()、 '')、s.end()); これはイレーズ・イディオムと呼ばれます。 removeはコンテナへの参照を持たないため、基になるコンテナ自体を切り捨てることはできません。コンテナ内の要素に対するイテレータのみを持ちます。

関連する問題