我遇到的问题是程序第一次运行良好,但第二次出现段错误。一个区别是第一次创建二进制文件,第二次将数据附加到二进制文件。
#include <iostream>
#include <vector>
#include <fstream>
//count of the number of car classes written to bin file
int num_of_cars_written;
// This will be the class written to binary
class Car{
public:
std::string model;
int num_of_wheels;
std::vector<std::string> list_of_features;
Car(std::string model, int num_of_wheels){
this->model = model;
this->num_of_wheels = num_of_wheels;
}
Car(){
this->model = "";
this->num_of_wheels = 0;
}
};
void write_to_binary_file(Car& car){
std::fstream ofile("cars.bin", std::ios::binary | std::ios::app | std::ios::out);
ofile.write(reinterpret_cast<char*>(&car), sizeof(Car));
ofile.close();
++num_of_cars_written;
}
std::vector<Car> read_bin_of_cars(std::string bin_file_path){
std::vector<Car> car_list;
std::fstream file(bin_file_path, std::ios::binary | std::ios::in);
int size_of_file = sizeof(file);
int number_of_cars_read_so_far = 0;
Car* car;
while(!file.eof()){
file.read (reinterpret_cast<char*>(car), sizeof(Car));
car_list.push_back(*car);
number_of_cars_read_so_far += size_of_file / num_of_cars_written;
if(number_of_cars_read_so_far >= size_of_file) break;
}
file.close();
return car_list;
}
int main(){
Car car_one("mazda", 4);
car_one.list_of_features.push_back("cup holder");
car_one.list_of_features.push_back("gps");
Car car_two("honda", 4);
Car car_three("sazuki", 2);
car_three.list_of_features.push_back("leather seat");
write_to_binary_file(car_one);
write_to_binary_file(car_two);
write_to_binary_file(car_three);
std::vector<Car> list = read_bin_of_cars("cars.bin");
for(auto car : list){
std::cout << "**************Car Object**************\n";
std::cout << car.model << std::endl;
std::cout << car.num_of_wheels << std::endl;
for (auto feature : car.list_of_features) {
std::cout << feature << std::endl;
};
}
return 0;
}
这是第一次运行的结果
**************Car Object**************
mazda
4
cup holder
gps
**************Car Object**************
honda
4
**************Car Object**************
sazuki
2
leather seat
这是第二次运行的结果
Segmentation fault (core dumped) (obviously)
编辑: 第一次尝试的工作方式是不确定的行为,因此不起作用。注释中列出了更好的方法来进行二进制的读写。
答案 0 :(得分:0)
此代码存在多个问题。总结一下:
在write_to_binary_file
中:
write(reinterpret_cast<char*>(&car), sizeof(Car));
这是将对象写入文件的错误方法。它只会写对象car
的内存博客,而不必照顾指向其外部分配的成员(例如string
或vector
等不是静态数组。它们是大多数可能是在对象外部分配内存。请阅读序列化并改用序列化。
在read_bin_of_cars
中:
您正在读指针car
,而没有为其分配内存。同样,即使分配了内存,也要确保使用序列化从文件中读取对象。
reinterpret_cast
提醒您最危险。仅当您知道自己在做什么时才应使用它。将对象直接投射到字符指针是错误的。
代码可能还有其他问题。这些只是我一目了然。