2

我有一个具有 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;
}
4

1 回答 1

3

问题是这一行:

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

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

从流中读取后,如果要重用刚刚读取的流,则应使用seekg. 打电话

is.seekg (0, is.beg);

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

于 2013-09-03T23:15:08.317 回答