我正在从事一个涉及二进制文件的项目。 所以我开始研究二进制文件,但我仍然对如何从我之前编写的二进制文件编写和填充 vector 感到困惑
这是用于编写的代码。
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();
}
我不知道我是否正确地写入文件,这只是一个测试,所以我不会弄乱我的主文件,而不是写数字我需要保存存储在 vector 中的对象和每次用户运行程序时加载它们。
最佳答案
不,你有点困惑。您在每次迭代中都写了大小,然后当您尝试写值时,您正在做一些完全未定义的事情。当您使用 vector 时,您实际上可以在没有循环的情况下执行此操作。
fout.write(&size1, sizeof(size1));
fout.write(enteros.data(), size1 * sizeof(int));
读入:
is.read(&list2[0], size2 * sizeof(int));
为了更便携,您可能希望使用不会更改的数据类型(例如,当您从 32 位编译切换到 64 位时)。在这种情况下,使用来自 <cctype>
的东西-- 例如int32_t
大小和值(value)数据。
关于c++ - 写入和读取二进制文件以填充 vector - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42686472/