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();
在我的程序中多次调用此类命令以获取许多机场的信息。基本上二进制文件充满了机场。 我需要稍后将所有这些机场读入阵列。如何读取文件以便获得机场阵列。
如果这个问题太基础,请道歉。我在高中学习指针和最短路径图。
答案 0 :(得分:5)
好吧,如果您确定自己的文件有效,那么只需使用read()
,直到您达到EOF为止。
每个read()
- sizeof(airport)
- 都会为您提供有效的airport
对象。
请注意,如果包含指针 - 或引用,则在加载对象时,存储和对象的二进制“值”将导致无效对象。
编辑:myfile.write((char*)&air,sizeof(airport);
将写入文件air
对象的内容。通过这样做,你实际上是在写对象,而不是指针。
答案 1 :(得分: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
答案 2 :(得分: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
进行处理
答案 3 :(得分: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;
}