2016-03-29 10 views
0

このプログラムでは、スタックとキューを使用しています。私は、スタックまたはキューのいずれかに属する数値の間で処理するファイルを設定しました。私のファイルはこの単純な順序で設定されています。それには数字と1文字のnがそれぞれ1行ずつあります。数が0と50未満のデータが数値でない場合は数が50を超えると、100未満であれば数はキューに行き、その後大きければC++ .ignore()関数が正しく動作しないのはなぜですか?

12 
44 
23 
55 
n 
77 
22 
14 
67 
88 

数字は、スタックに行きます私はそれを捨てて次の読書に行くつもりです。これは私がいくつかの問題を抱えているところです。ここで

は、私がこれを処理するために使用していますwhileループです:

while (infile) 
{ 
    infile >> number; //takes in a number 
    if (0 < number && number < 50) 
    { 
     PushToStack(number); // pushed to stack 
    } 
    else if (50 < number && number < 100) 
    { 
     PushToQueue(number); // pushes to queue 
    } 
    else 
    { 
     // discard and move to next read 
     infile.ignore(1, '\n'); 
    } 
} 

私は今、このコードを数回テストしていると私は、次の出力生産している:やいなや

Pushed To Stack: 12 
Pushed To Stack: 44 
Pushed To Stack: 23 
Pushed To Queue: 55 
Pushed To Queue: 55 

を文字nはセット内に到達し、他の数字の読み取りを継続せず、最後の数字も繰り返す。私はinfile.ignore(1、 '\ n')が次の行にスキップすると考えました。私はcplusplus.comを使って.ignoreがどのように動作するかを理解しました。これは.ignore(1、 '\ n')は行をスキップします。だから私は間違ってigno​​re関数を使用しているか、悪いデータをスキップしてファイルから数値を読み続けるために.ignoreを使わないと良い方法がありますか?

答えて

0

infile.ignore(1, '\n')は、最大で1文字を無視します。

が、この代わりにしてみてください:

infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

これはアーキテクチャは数えることができる限り多くの文字を無視しますが、改行またはファイルの最後に遭遇した後に無視して停止します。残念ながら、これはeither..Iもそれがうまくいくかどうかを確認するためにはcout文を含め動作しません

std::numeric_limits<limits>

+0

で定義されています。まだ良い結果はありません。私はまだ同じ出力を得る。あなたはあなたの答えに他のものが欠けていないと確信していますか? – Nathan

+0

ああ、そうです。演算子>>は後続の改行を使用せず、先頭の改行のみを使用します。これは、改行と別の完全な行を無視する必要がある場合にのみ重要です。 ignore()またはstd :: getline()で文字列として数値を消費するために2回の呼び出しが必要であり、その後にstoi()の呼び出しが続きます。 –

関連する問題