ifstream对象的行为

时间:2013-09-03 23:07:46

标签: c++

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

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

该文件包含一些交易。

Math 3 5
Phys 3 6
Phys 3 7

等。现在,当我打印每行被分配到的数据成员时,object1打印第1行,对象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;
}

1 个答案:

答案 0 :(得分:3)

问题是这一行:

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

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

从流中读取后,如果要重新使用刚刚读取的流,则应使用seekg对其进行回放。调用

is.seekg (0, is.beg);
读取后输入流上的

会将其重置为开头。