1

値を 1 つずつ取得して 2D int 配列に格納する必要があるコードを書いていましたが、ファイルから値を取得して手動で入力するときに違いがありました。次のようになります。

int ar[9][9];
while(!cin.eof()){
  for(int i=0; i<9; i++)
    for(int j=0; j<9; j++)
    {
      cin.get(temp);
      ar[i][j] = temp -48;
    }
}

それを実行している端末からの入力を次のように渡します

./prog.out < inp.txt

ar [0] [1]のようなランダムな値に対して-38の値を取得しますが、入力すると正しい値が取得されます

./prog.out
12345678 ^d

ar[0][1] を出力すると 2 になりますが、これは正しいです。このコードの動作が異なるのはなぜですか? ファイルが完全な 81 文字であり、その後に \n と eof が続くのに対し、2 つの値の後に ^d が続くだけなのでしょうか?

ありがとう。

4

1 に答える 1

2

あなたはeof適切なタイミングでチェックしていません-値を読み取ろうとする試みが事前にではなく、eofにヒットしたときに設定されるため、動作は少しランダムです。そして、eof にいないということは、81 個の値を読み取ることができることを意味すると仮定しています... から改行が 1 つも離れていないことをどのように知ることができますeofか? そして、あなたはcin.get()....の成功をチェックしていません。

シンプルにお勧めです

for(...)
    for(...)
        if (cin.get(temp))
            ar[i][j] = temp - '0';
        else
        {
            std::cerr << "insufficient input\n";
            exit(1);
        }
于 2013-01-28T06:55:37.623 に答える