【问题标题】:finding the end of a filestream查找文件流的结尾
【发布时间】:2013-10-24 09:23:51
【问题描述】:

我正在尝试通过在自定义类 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 的 temp 指针中,如果发现任何无效数据则抛出 bad_lexical_cast..

我意识到我可以改变:

while (fin)

到:

while (fin >> *temp)

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

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

任何帮助将不胜感激

【问题讨论】:

  • “但是当它完成时我得到一个段错误” - 你到底从哪里得到它?如果它在您的重载运算符中>>,它是如何定义的?
  • 对不起,我看了看,seg 错误发生在重载的 operator>>() 函数中:getline(fin, line);
  • 所以我想找的是一种在调用 operator>>() 之前测试 fin 是否有另一行的方法

标签: c++ fstream istream


【解决方案1】:

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

您可以将该行更改为:

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

(有关类似问题/问题的答案,另请参阅 here。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多