找到文件流的结尾

时间:2013-10-16 10:02:02

标签: c++ fstream istream

我试图通过在自定义类Customer中重载运算符>>()函数,将标记化数据从文本文件读取到指针向量中。我的代码可以通过整个文件读取它们,但是当它完成时我得到一个seg错误

这是我的代码:

int line = 0;
vector<Customer *> customers;
ifstream fin("customers.txt", ios_base::in);

while (fin)
{
    Customer *temp = new Customer();
    line++;
    try
    {
        fin >> *temp;
        customers.push_back(temp);
    }
    catch(boost::bad_lexical_cast&)
    {
         cerr << "Bad data found at line " << line
             << " in file customers.txt" << endl;
    }
}

假设重载运算符&gt;&gt;()函数用getline()读取一行,并将数据插入到Customer的临时指针中,如果找到任何无效数据,则抛出bad_lexical_cast。

我意识到我可以改变:

while (fin)

为:

while (fin >> *temp)

但是我想保留try / catch块,好像发现了坏数据我只想让它跳过那一行并继续下一行。

我能做些什么来测试下一行是否在那里而没有实际拉动它?类似于扫描仪类中的java hasNextLine?

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

您必须检查fin >> *temp的输出。如果读取失败(即文件结束),则返回false

您只需将该行更改为:

即可
if(!(fin >> *temp)) break;

(另请参阅here以获得类似问题/问题的答案。)