2013-08-12 31 views
5
airport air(1,2,3); //an airport constructor 
ofstream myfile; 
myfile.open("rishab",ios::app||ios::binary); 
myfile.write((char*)air,sizeof(airport); 
myfile.close(); 

このようなコマンドは、多くの空港の情報を取得するために私のプログラムで複数回呼び出されます。基本的にバイナリファイルには空港がいっぱいです。 これらの空港をすべて後でアレイに読み込む必要があります。どのようにファイルを読んで空港の配列を取得するのですか?C++同じクラスの複数のオブジェクトを読み書きする

この質問があまりにも基本的な場合は謝罪してください。私は高等学校でポインタと最短経路グラフについて学習しています。

+0

これは 'airport'クラスの定義に依存します。 – molbdnilo

+0

クラス空港{ int planeCapacity; int acceptPlanesFrom; //その他のいくつかのint public: コンストラクタ.. アクセサメソッド }; それはそうです。 –

+0

あなたの入力ファイルにオブジェクトの有効なバイナリダンプが含まれていると思うのは、私には分かりません。あなたはそれを言わなかった。答えのほとんどがこのIMOを危険な前提にしています。また、 'c'で多少有効で使用されていたが、時代遅れのアプローチを提示しています。もしあなたが 'C++ 'でオブジェクトを扱っているのであれば、それは後でより早く非常にひどく終わるでしょう。 '空港'の最小の変更は互換性を損なうでしょう。入力ファイルの作成方法を教えてください。あなたは本当に記憶方法を知っていなくても読書方法を設計することはできません。彼らは強く結合している。 「空港」の定義も有用であろう。 – luk32

答えて

4

あなたがしようとしているのは、シリアル化です。オブジェクトをシリアライズするこの方法は安定しておらず、空港がどのようなものであるかによって大きく異なります。明示的なシリアライゼーションを使用する方が良いです。

Hereの説明には、どのようなシリアル化があり、なぜこのように作られたのですか。

MessagePackでは、典型的なシリアライズ・デシリアライゼーションのシナリオは次のようになります。

struct airport { 
std::string name; //you can name your airports here 
int planeCapacity; 
int acceptPlanesFrom; 
MSGPACK_DEFINE(name,planeCapacity,acceptPlanesFrom); 
}; 

...

// define your airports 
std::vector<airport> airports; 
airport a={"BLA",1,2}; 
airport b={"BLB",3,4}; 
airports.push_back(a); 
airports.push_back(b); 

// create a platform-independent byte sequence from your data 
msgpack::sbuffer sbuf; 
msgpack::pack(sbuf, airports) ; 
std::string data=sbuf.data();//you can write that into a file 

msgpack::unpacked msg; 
// get your data safely back 
msgpack::unpack(&msg, sbuf.data(), sbuf.size()); 
msgpack::object obj = msg.get(); 

std::cout<<obj<<std::endl; 

// now convert the bytes back to your objects 
std::vector<airport> read_airports; 
obj.convert(&read_airports); 
std::cout<<read_airports.size()<<std::endl; 

をコンソール出力で:

[["BLA", 1, 2], ["BLB", 3, 4]] 
2 
5

ファイルが有効であることが確かな場合は、EOFに達するまでread()を使用してください。 read() - 〜sizeof(airport)の各 - 有効なairportオブジェクトを提供します。

バイナリの "value"とobjectを格納すると、ポインタ(または参照)が含まれている場合、オブジェクトをロードするときに無効なオブジェクトになります。

編集:myfile.write((char*)&air,sizeof(airport);は、airオブジェクトの内容をファイルに書き込みます。これを行うことで、実際にはポインタではなくオブジェクトを記述しています。

+0

こんにちは、ありがとう回答。私は今、ファイルへのポインタを書いていて、オブジェクトを読み込もうとしていることを理解しています。ポインタではなくファイルにオブジェクトを書き込む方法を教えてください。 –

+0

あなたが必要とするのは、データの構造化されたシリアル化であり、C++メモリ構造ではありません。 –

+0

@DmitryLedentsovあなたのクラスが基本型(または基本型のオブジェクト)のみを含む場合を除いて、まさにそうです。 – Xaqq

0
ofstream myfile; 

std::vector<airport> vec; 
myfile.open("rishab",ios::app||ios::binary); 
while(myfile.write(reinterpret_cast<char*>(&air),sizeof(airport)) != 0) 
    vec.push_back(air); 

myfile.close(); 

今、あなたはこのようにそれをプログラムすることができ

+0

は '(char *)&air'にする必要があります。 – Xaqq

+0

@Xaqqが更新されました。 – P0W

+0

オブジェクトにではなくファイルへのポインタを送信しているので、これは動作しますか? 申し訳ありませんが混乱しています。そして今、私はベクターを反復する必要がありますか? –

0

を処理するためvecを使用しています。

struct AirPort 
{ 
    int a; 
    int b; 
    int c; 
}; 
int main() 
{ 
    std::vector<AirPort> airportList; 
    FILE* fp = fopen(filename,"rb"); 
    if(NULL != fp) 
    { 
     while(!feof(fp)) 
     { 
      AirPort ap; 
      if (fread(&ap,sizeof(ap),1,fp)==1) 
      { 
       airportList.push_back(ap); 
      } 
     } 
    } 
    fclose(fp); 
    return 0; 
} 
+0

こんにちはありがとうございます。しかし、私はベクトルとリストの多くをしなかったので、私は少し混乱しています。しかし、空港はクラスであり、今私の理解から、私はポインタ値を書いていて、明らかに重要ではないオブジェクトを読み込もうとしています。 問題を手伝ってもらえますか? –

+0

ベクトルやリストを使用しない場合のプログラミング方法を教えてください。私は分かりません。私の英語はあまりよくありません。あなたが望むものを正確に話すことができますか?それはあなたのC + +のコードをここに入れて良いです。 – Keen

関連する問題