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对象。

请注意,如果对象包含指针或引用,则在加载对象时存储对象的二进制“值”将导致对象无效。

编辑: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
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();

现在vec用于处理

于 2013-08-12T12:24:43.510 回答
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 回答