我正在开发一个涉及二进制文件的项目。 所以我开始研究二进制文件,但我仍然对如何编写和填充我之前写的二进制文件中的向量感到困惑
这是代码:写作。
void binario(){
ofstream fout("./Binario/Data.AFe", ios::out | ios::binary);
vector<int> enteros;
enteros.push_back(1);
enteros.push_back(2);
enteros.push_back(3);
enteros.push_back(4);
enteros.push_back(5);
//fout.open()
//if (fout.is_open()) {
std::cout << "Entre al if" << '\n';
//while (!fout.eof()) {
std::cout << "Entre al while" << '\n';
std::cout << "Enteros size: "<< enteros.size() << '\n';
int size1 = enteros.size();
for (int i = 0; i < enteros.size(); i++) {
std::cout << "for " << i << '\n';
fout.write((char*)&size1, 4);
fout.write((char*)&enteros[i], size1 * sizeof(enteros));
//cout<< fout.get(entero[i])<<endl;
}
//fout.close();
//}
fout.close();
cout<<"copiado con exito"<<endl;
//}
}
以下是阅读代码:
oid leerBinario(){
vector<int> list2;
ifstream is("./Binario/Data.AFe", ios::binary);
int size2;
is.read((char*)&size2, 4);
list2.resize(size2);
is.read((char*)&list2[0], size2 * sizeof(list2));
std::cout << "Size del vector: " << list2.size() <<endl;
for (int i = 0; i < list2.size(); i++) {
std::cout << i << ". " << list2[i] << '\n';
}
std::cout << "Antes de cerrar" << '\n';
is.close();
}
我不知道我是否正确写入文件,这只是一个测试,所以我不会搞砸我的主文件,而不是写数字我需要保存存储在矢量中的对象和每次用户运行程序时加载它们。
答案 0 :(得分:0)
不,你有点困惑。您在每次迭代中都会编写大小,然后在尝试编写值时执行完全未定义的操作。当你使用矢量时,你可以在没有循环的情况下实现这一点。
fout.write(&size1, sizeof(size1));
fout.write(enteros.data(), size1 * sizeof(int));
阅读:
is.read(&list2[0], size2 * sizeof(int));
为了更加可移植,您可能希望使用不会更改的数据类型(例如,当您从32位编译切换到64位时)。在这种情况下,请使用<cctype>
中的内容 - 例如int32_t
用于尺寸和价值数据。