2016-06-14 17 views
0

ユーザ定義クラス 'Product'のリストをバイナリファイルに保存する必要があるモジュールに問題があります。 私は次のコードを持っています: Product 'は、リストが作成されるユーザー定義クラスです。C++でバイナリモードでファイルにリストコンテナを書き込む方法

class Product 
    { 
     private: 
      long int Product_no; 
      std::string Product_name; 
      double Product_price; 
      int Product_qty; 
      double Product_tax; 
      double Product_dis; 

     public: 

      //Constructor 
      Product(); 
      Product(long int, string, double, int, double, double); 
      Product(long int, double, int, double, double); 
      //All Getter methods 
      //All Setter methods 
    }; 

やリストとして作成されました:

list<Product> product_list; 

と、次のように開かれて書き込むファイル:私は次のことを試してみました

ofstream out("products.dat", ios::out | ios::binary); 

: 1.usingを書き込み機能

output.write((char*)&product_list.begin(),sizeof(Product)); 

と約について読んで:

2.私はこれを行うことなく、私は正しくファイルからデータを取得することはできませんいくつかの構造に変換する製品リストを作成します。

保存と取得に必要な機能を実装する正しい方法はどれですか? 次のように私は、バイナリファイルから読み取るのを考えていたコードは次のとおりです。

Product &p; 
while(in.read((char*)&p,sizeof(Product))) 
    { 
     p->Display_Product(); 
     Productlist.push_back(p); 
    } 

詳細を読んでの正しい方法はありますか?

+0

これらは全く異なるアプローチであり、あなたの質問は次のようである - 私は何をすべき朝食、トースター、またはミキサーを作るために使用しますか? – SergeyA

+0

シリアル化ライブラリを調べる必要があります。これは、ユーザー定義のクラスをバイナリ表現に格納し、後でそれらを取得するのに役立ちます。あなた自身でそれをやろうとするなら、エンディアンやパディングなどを心配する必要があります。 – RyanP

+0

人間が読める形式のファイルを好むべきです。 [The Art of Unix Programming、Chapter 5](http://www.faqs.org/docs/artu/textualitychapter.html) –

答えて

1

最も重要な部分は、Productをファイルに書き込んでファイルから読み込む必要があるかどうかを調べることです。あなたがそれを理解したら、リストを使って作業するのは簡単です。

  1. リストの項目数を書き留めます。
  2. リストを反復し、リストから各項目を書き出します。

これを読み返すのも簡単です。

  1. 項目数を読みます。
  2. 一度に1つのアイテムを読み取り、それらをリストに追加します。

バイナリファイルの書き込みと読み取りのもう1つの側面は、移植性の問題です。

他のユーザーとバイナリファイルを共有する必要がありますか?もしそうなら、それらは同じプラットフォームにありますか?

ファイルが短期間(学校の学期のような)または長期間(会社の年)役に立つと思われますか?

これらの答えは、バイナリデータの書き込み方法と読み取り方法を決定します。

Productだけでなく、リストのサイズの書き込みと読み取りを実装する方法が決定されます。

1

あなたuasageにはエラーがあります。この用法で

copy(Product_list.begin(), Product_list.end(), std::ostream_iterator<Product>(output, " ")); 

を、最初のあなたは、第二のこのような方法であなただけtextモードではなく、binaryにオブジェクトを書き込むことができ、クラスProductためcout operatorを上書きする必要があります。

output.write((char*)&product_list.begin(), product_list.size()*sizeof(Product)); 

この方法はまた、右ではない、読んでください:http://www.eecs.umich.edu/courses/eecs380/HANDOUTS/cppBinaryFileIO-2.html

を正しい方法は次のとおりです。

ifstream infile; 
infile.open("hello.dat", ios::binary | ios::out); 
for(auto iter = Product_list.begin(); iter!=Product_list.end(); iter++) 
{ 
    Product_list& product = *iter; 
    infile.write(static_cast<const char*>(&product), sizeof(product)); 
} 
+0

Product_listとproduct = * iterの正確な行は何ですか?write関数は最初の引数として文字ポインタを必要とするため、実際にどのように動作しているか説明してください。私のリスト(Product_list)は、クラスProductのリストです。 – Omkar

+0

@Omkar私は答えを更新しました。あなたは 'const char *'に隠すことができます。 – BlackMamba

+0

それでも、製品と製品= iterではないはずですか? – Omkar

関連する問題