【发布时间】:2020-08-20 18:11:50
【问题描述】:
我试图理解指针和二进制文件,但我被卡住了。我想将包含 5 个水果的列表写入二进制文件。所以首先我尝试写 (size_t) 5,然后为每个水果片写它的大小,然后是字符串本身。 这是我到目前为止得到的:
// Write
vector<string> fruit_list = {"Apple", "Pear", "Banana", "Cherry", "Melon"};
ofstream fruits_out;
fruits_out.open("fruits.bin", std::ios::binary | std::ios::out);
size_t fruit_total = fruit_list.size();
fruits_out.write((char*)&fruit_total, sizeof(fruit_total));
for (const string& fruit : fruit_list){
size_t fruit_size = fruit.size();
fruits_out.write((char*)&fruit_size, sizeof(fruit_size));
fruits_out.write(&fruit.c_str()[0], fruit_size);
}
fruits_out.close();
// Read
ifstream fruits_in;
fruits_in.open ("fruits.bin", std::ios::binary | std::ios::in);
char *buffer = new char;
fruits_in.read((char*)&buffer, sizeof(size_t));
cout << *buffer << endl;
我什至无法读取第一个值。 请帮帮我,没关系,我坚持了很久。
【问题讨论】:
-
您只为单个字符分配了空间。
-
文件是字节流。在将数据写入文件或从文件读取数据之前,您应该记录要写入和读取的精确字节流。您将写入多少字节来存储大小?每个字节的值是多少?我强烈建议你在编写代码之前这样做——它会让你的生活变得更轻松。
-
但是我必须先缓冲到 char 类型对吧?
-
您似乎认为传递给
read()的指针必须使用new创建。这不是真的。附言对,一个“char 类型的缓冲区”。但是“1 个字符的缓冲区”和“10 亿个字符的缓冲区”之间存在很大差异。它们都是“char 类型的缓冲区”,但只有一个可以用于read()size_t的字符,而不会导致内存损坏。 -
请将代码放在您的帖子中,而不是在评论部分。
标签: c++ pointers binary buffer fstream