3

ファイルを反復処理して、すべての文字列を出力したいと考えています。たとえば、ファイルには次が含まれます。

a
1
2
10
a1
1
b

出力します:

a
a1
b

私は次のようにコードを書きます:

int main(){
  ifstream stream;
  stream.open("example.txt");
  string temp;
  while (getline(stream, temp)){
    cout<<temp<<endl;
    int n;
    while(stream>>n){}
  }
}

このプログラムはオンラインで "a" と "a1" を出力します。と提案?

4

3 に答える 3

3

何が起こるかは次のとおりです。プログラムがこの行に到達すると、

while(stream>>n){}

次のトークンをファイルからintegers として読み取ろうとします。1成功します。 2成功します。 10成功します。 a1失敗します。

stream現在、失敗状態になっています ( stream.fail() == true)。コードが実行する次のステートメントは

while (getline(stream, temp)){

これは次のトークン ( )読み取りますが、 は失敗状態であるため、 の結果はと解釈され、ループが中断されます。a1streamgetlinefalse

そのため、プログラムは途中で終了します。ただし、印刷するべきではありませんa1。実際、それaは私のマシンでのみ印刷されます。

ループ内で整数トークンを食べた後、失敗状態をクリアする必要があります。最後に次のステートメントを追加します。

stream.clear();

これにより、失敗状態がリセットされ ( stream.fail() == false)、外側のループが引き続き実行されます。

于 2013-03-14T22:54:35.460 に答える
1

これはどうですか?

std::copy_if(std::istream_iterator<string>(stream), std::istream_iterator<string>(),
             std::ostream_iterator<string>(std::cout),
             [](std::string const& rhs) { return !std::isdigit(rhs[0]); })
于 2013-03-14T22:37:39.120 に答える
0

文字列が空ではなく、文字で始まる場合はどうなりますか?

if (temp.size() > 0 && isalpha(temp[0]))
{
    cout << temp;
}
于 2013-03-14T22:47:36.680 に答える