gpt4 book ai didi

c++ - 如何编辑二进制文件中的特定值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:43:31 26 4
gpt4 key购买 nike

我有一个航类结构,正在写入二进制文件,我想编辑航类目的地,但我不知道该怎么做。这是我获取用户输入和写入二进制文件的代码。

struct Flight_Details {
char destination[99];
char departure[99];
char time_depart[80];
char time_arrive[80];
int flight_number;
};

switch (menu)
{
case MENU::NEW_FLIGHT: {
Flight_Details flight_d;
cout << "Enter Departure: ";
cin >> flight_d.destination;
cout << "Enter Destination: ";
cin >> flight_d.departure;
cout << "Enter Departure Time: ";
cin >> flight_d.time_depart;
cout << "Please enter arriving time: ";
cin >> flight_d.time_arrive;
cout << "Flight Number: ";
cin >> flight_d.flight_number;

ofstream file;
file.open("Flgiht_Details.data", ios::binary);

if (!file) cout << "Could create/open file";
else {
file.write((char*)&flight_d, sizeof(flight_d));
file.close();
}
break;
}
case MENU::OUTPUT_FILE: {

ifstream readFile;
readFile.open("Flgiht_Details.data");
if (!readFile) cout << "Couldn't open file";
else {
readFile.seekg(0, ios::end);
int fileSize = readFile.tellg();
int countOfFlights = fileSize / sizeof(Flight_Details);
readFile.seekg(0, ios::beg);

Flight_Details* flight = new Flight_Details[countOfFlights];
readFile.read((char*)flight, countOfFlights *sizeof(Flight_Details));
readFile.close();

for (int i = 0; i < countOfFlights; i++)
{
cout << flight[i].destination << "\n" << flight[i].departure << "\n" << flight[i].time_depart << "\n" << flight[i].time_arrive << "\n" << flight[i].flight_number << "\n\n";
}
break;
}
}

case MENU::EDIT: {
Flight_Details* flight_d;
ifstream readFile;
readFile.open("Flgiht_Details.data");
if (!readFile) cout << "Couldn't open file";
else {
readFile.seekg(0, ios::end);
int fileSize = readFile.tellg();
int countOfFlights = fileSize / sizeof(Flight_Details);
readFile.seekg(0, ios::beg);

Flight_Details* flight = new Flight_Details[countOfFlights];
readFile.read((char*)flight, countOfFlights * sizeof(Flight_Details));
readFile.close();

ofstream file;
char edit[50];
cout << "Edit: ";
cin.getline(edit, 50);

for (int i = 0; i < countOfFlights; i++)
{
if (strcmp(flight_d[i].destination, edit) == 0)
{
//edit file
}
}

}
}
}

最佳答案

由于您的 Flight_Details 在写入时具有固定的字节大小,因此很容易计算每个航类在文件中的位置。一般等式是 flight_number * sizeof(Flight_Details)//其中 flight_number 是 0..N。这将计算要查找的文件中的字节偏移量。从那里开始,只需从文件中准确读取 sizeof(Flight_Details) 字节并将该缓冲区转换为 Flight_Details,在这种情况下,这可能意味着您只需填充每个在 Flight_Details 中手动使用字节缓冲,或者如果您愿意,您可以将 reinterpret_cast() 数据的 char* 转换为正确的类型(只有当您的缓冲区恰好是 sizeof(Flight_Details) 长时,这才是一个不错的主意。通过某种构造函数手动复制字节会更安全。

关于c++ - 如何编辑二进制文件中的特定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44154555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com