質問

私はいくつかの比較的単純な文字列操作を行うにはC ++にstringstreamクラスを使用しようとしてきたが、私は、get()メソッドの問題を抱えています。私は文字で出力文字を取り出すたびに、いくつかの理由から、最終文字の2番目のコピーを追加します。

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
   stringstream ss("hello");
   char c;

   while(!ss.eof()) {
      ss.get(c);
      cout << "char: " << c << endl;
   }
   return 0;
}

プログラムから出力されます:

char: h
char: e
char: l
char: l
char: o
char: o

あなたがこの上で私を与えることができます任意の助けいただければ幸います。

役に立ちましたか?

解決

ストリームss.eof()の終わりに、ストリームの終わりがすぐに到達されることをまだ知っているが、文字の次抽出は失敗しません。ストリームの終わりに達したため、抽出に失敗したので、cは変更されません。あなたのプログラムは、そのss.get(c)を認識しない失敗し、再びcの古い値を出力します。

まだストリームから読み込むことができる文字は、このようなループだろうがあるかどうかを確認するためのより良い方法:

while (ss.get(c)) {
   cout << "char: " << c << endl;
}

他のヒント

そのため、ループの順序の。あなたの\ 0とEOFを読みます。

このようなあなたのコードを並べ替える

int main() {
   stringstream ss("hello");
   char c;

   ss.get(c);
   while(!ss.eof()) {
      cout << "char: " << c << endl;
      ss.get(c);
   }
   return 0;
}
あなたは、ファイルの末尾を越えて読み取ろうとすると、

EOFフラグのみが設定されています。次のコードではなく、その前の)(GET後EOFのためにテストすることによって、問題を修正します:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
   stringstream ss("hello");
   char c;

   while(1) {
      ss.get(c);
      if(ss.eof())
          break;

      cout << "char: " << c << endl;
   }
   return 0;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top