从文件循环forream

时间:2012-05-01 11:42:38

标签: c++ loops inputstream

我正在尝试让我的程序遍历文件,每次都会收集大量信息。但是,在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;
        }
    }
}

我尝试了一系列不同的解决方案,但似乎没有解决问题。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果读取失败,

ifstream&#39; s operator>>不会更改变量,因此type保持为0,因此调用默认分支。您的文件似乎有格式错误,导致读取失败。

根据您的评论,您可能始终没有文件中的所有值,您可以执行以下操作:

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

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

如果您为所有这些变量提供默认值,如果该行格式不正确或者不包含所有这些变量,它们将保留默认值。

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