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 に答える