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

ifstream如果读取失败, 'soperator>>不会更改变量,因此type保持 0,因此调用默认分支。您的文件似乎存在格式错误,导致读取失败。

根据您的评论,您可能不会一直在文件中拥有所有值,您可以执行以下操作:

最好的方法是使用getline()读取整行,然后使用stringstream从行中提取值,处理过程中的可选值:

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

如果您为所有这些变量提供默认值,如果行格式错误或不包含所有变量,它们将保持默认值。

在这里使用的好处getline()是,如果当前行有问题,提取viaop>>不会弄乱后续行。

于 2012-05-01T11:45:25.220 回答