ファイルのデータをオーダーのベクトルに読み込むときに問題が発生します。ファイルの終わりまでをistream_iteratorとistreamのオーバーロードで読み取る
コード:
#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include <iterator>
using namespace std;
class Purchase;
class Order {
public:
string name;
string address;
vector<Purchase> items;
};
class Purchase {
public:
string product_name;
double unit_price;
int count;
Purchase() {}
Purchase(string pn, double up, int c) :product_name(pn), unit_price(up), count(c) {}
};
istream& operator>>(istream& in, Order& o)
{
string p_name;
double u_price;
int p_count;
getline(in, o.name);
getline(in, o.address);
getline(in, p_name);
in >> u_price >> p_count;
o.items.push_back(Purchase(p_name, u_price, p_count));
return in;
}
ostream& operator<<(ostream& out, const Purchase& p)
{
out << p.product_name << '\n'
<< p.unit_price << '\n'
<< p.count << '\n';
return out;
}
ostream& operator<<(ostream& out, const Order& o)
{
out << '\n' << o.name << '\n'
<< o.address << '\n'
<< o.item << '\n';
return out;
}
int main()
{
cout << "Enter file to read orders from: \n";
string file;
cin >> file;
ifstream is(file.c_str());
istream_iterator<Order> ii(is);
istream_iterator<Order> eos;
ostream_iterator<Order> oo(cout);
vector<Order> orders(ii, eos);
copy(orders.begin(), orders.end(), oo);
}
私は主に3つの質問があります。
1)出力をテストするためにostreamのオーバーロードでo.itemのバグを取り除くと、ファイルの最初のエントリのみが出力されます。 txtファイルは、ベクトル命令に読み込まれることになっている5行のデータのグループで構成されています。
今のところ、txtファイルには10個の「オーダー」がありますが、最初のものはオーダーベクトルにのみ読み込まれます。おそらく何らかのファイル操作の終わりを実装する必要がありますが、istreamのオーバーロードとイテレータを使ってこれを行う方法がわかりません。これが最大の問題です。これを理解できれば、次の2つの質問で大丈夫だろうと思います。
2)この問題が修正されたとき。 o.item(要素が指定されていないため、現在出力できないオーダーのPurchasesのベクトル)の出力に対処する必要があります。明らかに私は出力する要素を指定する必要があります。静的intを使用してインクリメントすることを検討しましたが、これは3つの質問につながるすべての独立したOrderに対してリセットする必要があります...
3)以前の読書と同じ名前/住所が読み込まれるので、読んでいるのと同じ「注文」であることを理解し、新しい注文を作成するのではなくその注文の購入ベクトルに別のオブジェクトを単に追加するというプログラムが必要です。私はfind()を使ってその名前がすでに存在するかどうかをチェックし、その場合は名前/アドレスの入力を何もしないことを考えていますが、もっと良い方法があるかどうかを知りたいと思っています。
ご迷惑をおかけします。もっと説明が必要な場合は、詳しく説明します。どんな助けもありがとうございます。ありがとう。
P.S. o.itemの出力をo.item [0]に指定した場合の入力出力の例を次に示します。
テキストファイルがあります。
John Smith
117 One Tree Hill
Trampoline
600.00
1
//... 9 more Orders like this
出力は次のとおりです。
John Smith
117 One Tree Hill
Trampoline
600.00
1
//... Nothing after this....
残念ながら、あなたの解決策は明らかな選択肢になりますが、エクササイズ(私は本のルールに固執しようとしています)ではベクトルを使用するように言います。しかし、これは非常に良い投稿でした。私は2つの答えを設定することができれば。 –
私は実際にベクトルに慣れていて、マルチマップをあまり使わないので、これに切り替えることにしました。私は、コンターのために関数オブジェクトを使うことができます。 –