1

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

这是我的代码:

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;
    }
}

假设重载的 operator>>() 函数使用 getline() 读取一行并将数据插入到 Customer 的临时指针中,如果发现任何无效数据则抛出 bad_lexical_cast。

我意识到我可以改变:

while (fin)

至:

while (fin >> *temp)

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

我可以做些什么来测试下一行是否存在而不实际拉动它?类似于扫描仪类中的java hasNextLine?

任何帮助将不胜感激

4

1 回答 1

1

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

您可以将该行更改为:

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

(另请参阅此处以获取类似问题/问题的答案。)

于 2013-10-16T11:00:42.933 回答