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();

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

この質問が基本的すぎる場合はお詫び申し上げます。私は高校でポインタと最短経路グラフについて学んでいます。

4

4 に答える 4

5

ファイルが有効であると確信している場合は、read()EOF に到達するまで単純に使用できます。それぞれread()- of sizeof(airport)- は有効なairportオブジェクトを提供します。

およびオブジェクトのバイナリ「値」を格納すると、ポインタまたは参照が含まれている場合、ロード時に無効なオブジェクトになることに注意してください。

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

于 2013-08-12T12:18:35.057 に答える
4

あなたがやろうとしているのはシリアライゼーションです。オブジェクトをシリアル化するこの方法は安定しておらず、空港が何であるかに大きく依存します。明示的なシリアル化を使用することをお勧めします。

ここでは、シリアライゼーションとは何か、なぜこのようにするのかについて説明します。

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
于 2013-08-13T11:39:57.840 に答える
0

このようにプログラムできます。

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;
}
于 2013-08-12T12:45:05.933 に答える