【发布时间】:2021-01-30 11:19:37
【问题描述】:
我正在尝试将每个字符串的向量写入二进制文件,然后将其读回。我不能再进一步了,因为我的缓冲区有问题。我试着把它当作一个 char * 但我不能。
代码:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
void write_bin() {
vector<string> vec = {"Text1", "Text2", "Text3", "Text4"};
ofstream bin_out("binary.bin", ios::binary | ios::out | ios::trunc);
if (!bin_out.is_open()) {
// Set n size of vec first
bin_out.write((char *) vec.size(), sizeof(int));
for (string s : vec) {
size_t size = s.size();
bin_out.write((char *)size, sizeof(size));
bin_out.write(&s[0], size);
}
bin_out.close();
}
}
void read_bin() {
ifstream bin_in("binary.bin", ios::binary | ios::in);
string s;
char *buffer;
bin_in.read(buffer, sizeof(int));
for (int i = 0; i < atoi(buffer); ++i) {
bin_in.read(buffer, sizeof(int));
size_t size = atoi(buffer);
bin_in.read(&buffer[0], size);
s = buffer;
cout << s << endl;
}
}
int main() {
write_bin();
read_bin();
}
这样做的正确方法是什么?
【问题讨论】:
-
生活准则:如果您在 C++ 代码中进行 C 转换以消除警告/错误,那么您很可能已经做错了。
-
恕我直言,这种方法是错误的。您应该使用经典的反序列化技术并覆盖插入器和提取器运算符。无需存储大小。只需将向量逐行写入文本文件,然后使用
std::getline读回所有内容。这很容易,也更容易理解。