0

プログラムにファイルをループさせ、毎回大量の情報を取り込もうとしています。ただし、2 行が正しく入力された時点では、ファイルの内容に関係なく、常にデフォルトになります。元々は eof while ループでしたが、for ループに変更して修正しました。これが私のコードです:

ifstream furniture;
furniture.open("h://furniture.txt");


for(int i=0;i<=count;i++)
{
    type=0;
    furniture>>type>>name>>number>>material>>colour>>mattress;

    switch (type)
    {
    case 1:
        {
            Item* item= new Bed(number, name, material, colour, mattress);
            cout<<"working, new bed"<<endl;
            v.push_back(item);
            cout<<"working pushback"<<endl;
            count++;

            break;
        }
    case 2:
        {
            Item* item= new Sofa(number, name, material, colour);
            cout<<"working, new sofa"<<endl;
            v.push_back (item);
            cout<<"working pushback"<<endl;
            count++;

            break;
        }
    case 3:
        {
            Item* item= new Table(number, name, material, colour);
            cout<<"working, new table"<<endl;
            v.push_back(item);
            cout<<"working pushback"<<endl;
            count++;

            break;
        }
    default:
        {
            cout<<"Invalid input"<<endl;
            type=0;
            break;
        }
    }
}

一連のさまざまな解決策を試しましたが、何も問題を解決していないようです。どんな助けでも大歓迎です。

4

1 に答える 1

0

ifstreamoperator>>は、読み取りが失敗した場合、変数を変更しないため、 0のtypeままになり、デフォルト ブランチが呼び出されます。ファイルにフォーマット エラーがあり、読み取りが失敗しているようです。

コメントに基づいて、常にファイルにすべての値が含まれているとは限らないということで、次のことができます。

最適な方法は、 を使用getline()して行全体を読み取り、 を使用しstringstreamて行から値を抽出し、その過程でオプションの値を処理することです。

string line;
getline(furniture, line);
stringstream ss(line);
ss>>type>>name>>number>>material>>colour>>mattress;

これらすべての変数にデフォルト値を指定すると、行の形式が正しくない場合やすべての変数が含まれていない場合でも、デフォルト値が維持されます。

ここで使用する利点は、現在の行に問題がある場合にgetline()抽出ビアop>>が後続の行を台無しにしないことです。

于 2012-05-01T11:45:25.220 に答える