7

私は、C++ プログラミングの復習として持っている C++ の教科書を読んでいます。練習問題の 1 つ (詳しくは説明しませんが) では、ifstream または cin (istream など) を引数として渡すことができる関数を定義する必要があります。そこから、ストリームを読み進める必要があります。問題は、この1 つの関数で cin と ifstream を使用してストリームの末尾を効果的に検出する方法がわからないことです。すなわち、

while(input_stream.peek() != EOF)

シンではうまくいきません。特定のフレーズ (「#End of Stream#」など) を探すように関数を作り直すこともできますが、渡すファイル ストリームにこの正確なフレーズが含まれている場合、これは悪い考えだと思います。

私は関数のオーバーロードを使用することを考えましたが、これまでのところ、本は私がこれを行うことを望む場合について言及しています。私はおそらくこの 1 つの練習問題に力を入れすぎていますが、私は創造的なプロセスを楽しんでおり、オーバーロードせずにこれを行う方法があるかどうかに興味があります.

4

3 に答える 3

6

eof() cinで機能しますあなたは何か間違ったことをしています。コードを投稿してください。一般的な障害の 1 つは、ストリームの末尾を読み込もうとした後にeofフラグが設定されることです。

ここにデモンストレーションがあります:

#include <iostream>
#include <string>

int main( int, char*[] )
{
    std::string s;
    for ( unsigned n = 0; n < 5; ++n )
    {
        bool before = std::cin.eof();
        std::cin >> s;
        bool after = std::cin.eof();
        std::cout << int(before) << " " << int(after) << "  " << s << std::endl;
    }

    return 0;
}

およびその出力:

D:>t
aaaaa
0 0  aaaaa
bbbbb
0 0  bbbbb
^Z
0 1  bbbbb
1 1  bbbbb
1 1  bbbbb

(EOF は、Windows では Ctrl-Z、他の多くの OS では Ctrl-D で生成できます)

于 2010-08-30T18:26:09.490 に答える
2

なぜ機能しないstd::cin.eof()のですか?cinstdinが閉じたときにEOFを通知します。これは、ユーザーがCtrl+d(* nix)またはCtrl+z(Windows)で通知したとき、または(パイプされた入力ストリームの場合)パイプされたファイルが終了したときに発生します。

于 2010-08-30T18:22:17.030 に答える
2

ブール値のコンテキストでストリームを使用する場合、EOF に達していない場合は true に相当する値に変換され、EOF を超えて読み取ろうとした場合は false に変換されます (存在する場合も false ではありません)。ストリームからの以前のエラー読み取りでした)。

ストリームに対するほとんどの IO 操作はストリームを返すため (したがって、チェーンすることができます)。読み取り操作を実行し、結果をテストで使用できます (上記のように)。

したがって、ストリームから数値のストリームを読み取るプログラムは次のとおりです。

int main()
{
   int x;

   // Here we try and read a number from the stream.
   // If this fails (because of EOF or other error) an internal flag is set.
   // The stream is returned as the result of operator>>
   // So the stream is then being used in the boolean context of the while()
   // So it will be converted to true if operator>>  worked correctly.
   //                         or false if operator>> failed because of EOF
   while(std::cin >> x)
   {
       // The loop is only entered if operator>> worked correctly.
       std::cout << "Value: " << x << "\n";
   }

   // Exit when EOF (or other error).
}
于 2010-08-30T18:39:32.347 に答える