【问题标题】:Behavior of ifstream objectifstream 对象的行为
【发布时间】:2013-09-03 23:07:45
【问题描述】:

我有一个具有 istream 构造函数的类。我可以用 ifstream 对象初始化类对象。在程序中,我使用 ifstream 对象打开一个文件,并使用该对象来初始化类对象。

std::ifstream in(test);
object1(in);
object2(in);

该文件包含一些交易。

Math 3 5
Phys 3 6
Phys 3 7

等等。现在,当我打印每行分配给的数据成员时,object1 打印第 1 行,object 2 打印第 2 行。为什么?

我还要提到构造函数接受一个 istream 对象引用,在函数体中,它调用另一个函数,该函数也接受一个 istream 对象引用并使用它来填充一些数据并返回 istream 对象。

但是为什么每次初始化都前进到文件的下一行呢?

构造函数代码:

Sales_data(std::istream &is) : Sales_data() { read(is, *this); }

函数读取代码:

std::istream &read(std::istream &is, Sales_data &item)
{
double price = 0;
is >> item.bookName >> item.books_sold >> price;
item.revenue = price * item.books_sold;
return is;
}

【问题讨论】:

标签: c++


【解决方案1】:

问题是这一行:

is >> item.bookName >> item.books_sold >> price;

当您将 >> 运算符应用于流时,实际上是在消费输入,将流前进到下一个位置并返回流。

从流中读取后,如果要重用刚刚读取的流,则应使用seekg 将其倒回。调用

is.seekg (0, is.beg);

在您的输入流上读取后会将其重置为开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多