レコードモデリングの概念から始めて、次にプリミティブを取得しましょう。
あなたはモデルにしたい記録としてテキスト行:次のステップはRecord
ためoperator>>
をオーバーロードすることです
struct Record
{
unsigned int number;
std::string description;
double price;
};
:上記のコードを使用して
struct Record
{
unsigned int number;
std::string description;
double price;
friend std::istream& operator>>(std::istream& input, Record& r);
};
std::istream& operator>>(std::istream& input, Record& r)
{
input >> r.number >> r.description >> r.price;
return input;
}
、ファイルで読むことができます:
std::vector<Record> database;
Record r;
while (my_text_file >> r)
{
database.push_back(r);
}
編集1:struct
なしあなたがclass
やstruct
を使用する方法を知らないとしましょう。
各フィールドを個別に読み取ることができます:
unsigned int number;
std::string description;
double price;
while (my_text_file >> number >> description >> price)
{
// Do something with number, description, price
}
編集2:配列対ベクトル
多くの割り当ては、平均値や検索のような、データで何かをする必要が。これには、通常、データを保存する必要があります。
2つの一般的なコンテナ(学生の視点から)が配列で、std::vector
です。
ファイルI/Oでは、何レコードあるのか、容量が静的である(変化しない)ような配列なので決して良い配列ではありません。だから、自分のサイズを変更する実行する必要があります。std::vector
の
static const unsigned int initial_capacity = 16U;
Record database[initial_capacity];
unsigned int capacity = initial_capacity;
Record r;
unsigned int items_read = 0;
while (my_text_file >> r)
{
if (items_read < capacity)
{
database[items_read] = r;
++items_read;
}
else
{
// Allocate new, larger array
// Copy items from old array to larger array.
// Update capacity variable.
// Delete old array
// Change database pointer to new array
}
}
便利な機能を使用すると、配列のようにアクセスすることができ、必要に応じて、自動的に容量が増加することです。
ストリーム演算子を 'std :: string'に使うと必ずしも入力行全体が得られるわけではありません。それがあなたが望むなら、['std :: getline'](http://en.cppreference.com/w/cpp/string/basic_string/getline)を調べることをお勧めします。 –
_i私はそれがすべて間違っていると思います._あなたは思いますか?なぜあなたはそのように思いますか?直面している問題に関する詳細を共有できますか?問題は現在の形の質問からは不明なので、 –
.txtファイルからデータを読み込んで配列に保存する関数を作成する必要があります。その後、上記で作成した配列の製品コードを検索する2番目の関数を作成する必要があります。また、各クライアントが選択して最終的に印刷する製品の価格を追加するクラスを作成する必要があります。 (これはクラスプロジェクト用です)。 –