如何编辑二进制文件中的特定值
How to edit specific value in binary file?
我有一个飞行结构,它正在写入二进制文件,我想编辑航班目的地,但我不知道该怎么做。这是我用于获取用户输入和写入二进制文件的代码。
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 << "nn";
}
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)//where flight_number is 0..N
.这将计算要查找的文件的字节偏移量。从那里只需从文件中准确读取 sizeof(Flight_Details)
个字节并将该缓冲区转换为Flight_Details
,在这种情况下,这可能意味着您只需手动用字节填充Flight_Details
中的每个缓冲区,或者如果您愿意,您可以将数据char*
reinterpret_cast()
为正确的类型(只有当您的缓冲区正好CC_时,这才是一个不错的主意8 长。通过某种构造函数手动复制字节会更安全。
这是
您将在评论下写的内容// edit file
。这看起来很丑,但工作得很好
cout << "Yeah we are editingn";
char newdestiny[99];
cout << "new dest: ";
cin.getline(newdestiny, 99);
strcpy(flight[i].destination, newdestiny);
file.write((char*)flight, sizeof(Flight_Details[countOfFlights]));
file.close();
return 0;
而且你的程序中有一些错误,比如当你要求出发时,你会得到目的地,当你打开file
来写入数据时,你必须包括ios::app
标志,以便你也可以输入新的航班信息(?
我正在打开的文件只有ios::out
标志
一件事strcmp(flight_d[i].destination, edit) == 0
这条线应该strcmp(flight[i].destination, edit) == 0
相关文章:
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- 如何编辑二进制文件中的特定值
- C++用另一个二进制文件编辑二进制文件
- 编辑大型二进制文件
- 查找和编辑二进制文件中的unicode十六进制字符串