【发布时间】:2021-12-25 21:13:13
【问题描述】:
我写了两个函数来保存和读取bin文件中的数据:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
// save data in file with name p_file
template <typename T>
void save(string p_file, T data) {
ofstream output(p_file, ios::binary | ios::out);
output.write((char*) &data, sizeof(data));
output.close();
}
// read and return data in file with name p_file
template <typename T>
T read(string p_file) {
ifstream input(p_file, ios::binary | ios::in);
T data;
input.seekg(0, input.end);
int length = input.tellg();
input.seekg(0, input.beg);
input.read((char*) &data, length);
input.close();
return data;
}
int main() {
vector<int> vint;
vint.push_back(1);
save< vector<int> >("test.bin", vint);
vector<int> load_vint = read< vector<int> >("test.bin");
cout << vint[0] << endl;
cout << load_vint[0] << endl;
cout << "done" << endl;
}
预期输出:
1
1
done
实际输出:
1
1990048
done
当我将main 中的大部分代码放入test 并且没有更改save 和read 中的任何内容时,情况变得更糟了:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
// save data in file with name p_file
template <typename T>
void save(string p_file, T data) {
ofstream output(p_file, ios::binary | ios::out);
output.write((char*) &data, sizeof(data));
output.close();
}
// read and return data in file with name p_file
template <typename T>
T read(string p_file) {
ifstream input(p_file, ios::binary | ios::in);
T data;
input.seekg(0, input.end);
int length = input.tellg();
input.seekg(0, input.beg);
input.read((char*) &data, length);
input.close();
return data;
}
// exact same code, just in a function
void testing() {
vector<int> vint;
vint.push_back(1);
save< vector<int> >("test.bin", vint);
vector<int> load_vint = read< vector<int> >("test.bin");
cout << vint[0] << endl;
cout << load_vint[0] << endl;
}
int main() {
testing();
cout << "done" << endl;
}
预期输出:
1
1
done
实际输出:
1
1924512
发生了什么以及如何解决此错误?
【问题讨论】:
-
保存例程将
vector(通常实现为三个指针)写入文件。这意味着该文件包含三个地址,当您重新读取文件时,这些地址可能无效。如果您写入的数据对于write这样的简单函数来说太复杂,则需要序列化。 -
就像@user4581301 指出的那样,
vector并没有真正将数据存储在其中,而是仅包含一些指向数据的指针。作为替代方案,您可以使用std::array,它直接存储数据。 -
检查我更新的答案。解决方案就在那里,它可以按您的预期工作。