加载格式化的二进制文件并将信息分配给结构 c++
Load a formatted binary file and assign information to structure c++
我终于想出了如何将一些特定格式的信息写入二进制文件,但现在我的问题是读回它并按照原来的方式构建它。
这是我写入数据的函数:
void save_disk(disk aDisk)
{
ofstream myfile("disk01", ios::out | ios::binary);
int32_t entries;
entries = (int32_t) aDisk.current_file.size();
char buffer[10];
sprintf(buffer, "%d",entries);
myfile.write(buffer, sizeof(int32_t));
std::for_each(aDisk.current_file.begin(), aDisk.current_file.end(), [&] (const file_node& aFile)
{
myfile.write(aFile.name, MAX_FILE_NAME);
myfile.write(aFile.data, BLOCK_SIZE - MAX_FILE_NAME);
});
}
我最初创建它的结构以及我想将其加载回的结构组成如下。
struct file_node
{
char name[MAX_FILE_NAME];
char data[BLOCK_SIZE - MAX_FILE_NAME];
file_node(){};
};
struct disk
{
vector<file_node> current_file;
};
我真的不知道如何读回它,以便它以相同的方式排列,但无论如何这是我可悲的尝试(我只是试图扭转我为保存所做的):
void load_disk(disk aDisk)
{
ifstream myFile("disk01", ios::in | ios::binary);
char buffer[10];
myFile.read(buffer, sizeof(int32_t));
std::for_each(aDisk.current_file.begin(), aDisk.current_file.end(), [&] (file_node& aFile)
{
myFile.read(aFile.name, MAX_FILE_NAME);
myFile.read(aFile.data, BLOCK_SIZE - MAX_FILE_NAME);
});
}
^^ 这是绝对错误的。 ^^
我了解 ifstream 的基本操作,但实际上我所知道如何使用它只是在文本文件中读取,任何比我有点迷路更复杂的东西。
关于如何阅读此内容的任何建议?
你非常接近。您需要以二进制形式写入和读取长度。
你的这部分长度是错误的:
char buffer[10];
sprintf(buffer, "%d",entries);
myfile.write(buffer, sizeof(int32_t));
无论长度如何,它都只写入前四个字节,但长度是来自sprintf()
调用的字符数据。您需要将其编写为 entries
(整数)的二进制值:
// writing your entry count.
uint32_t entries = (uint32_t)aDisk.current_file.size();
entries = htonl(entries);
myfile.write((char*)&entries, sizeof(entries));
然后在阅读时:
// reading the entry count
uint32_t entries = 0;
myFile.read((char*)&entries, sizeof(entries));
entries = ntohl(entries);
// Use this to resize your vector; for_each has places to stuff data now.
aDisk.current_file.resize(entries);
std::for_each(aDisk.current_file.begin(), aDisk.current_file.end(), [&] (file_node& aFile)
{
myFile.read(aFile.name, MAX_FILE_NAME);
myFile.read(aFile.data, BLOCK_SIZE - MAX_FILE_NAME);
});
或类似的东西。
注意 1:这不会进行错误检查,也不会考虑不同主机上可能不同的字节序的可移植性(大端机器写入文件,小字节序机器读取文件)。这可能适合您的需求,但您至少应该意识到这一点。
注意 2:通过引用将输入磁盘参数传递给load_disk()
:
void load_disk(disk& aDisk)
编辑施工清洁file_node
内容
struct file_node
{
char name[MAX_FILE_NAME];
char data[BLOCK_SIZE - MAX_FILE_NAME];
file_node()
{
memset(name, 0, sizeof(name));
memset(data, 0, sizeof(data));
}
};
如果您使用的是兼容的 C++11 编译器:
struct file_node
{
char name[MAX_FILE_NAME];
char data[BLOCK_SIZE - MAX_FILE_NAME];
file_node() : name(), data() {}
};
相关文章:
- 如何在模板类函数中分配结构值?
- 在cuda中分配结构数组后,变量会丢失
- 在 GPU 上分配结构的 OpenCL 会导致垃圾
- 使用C++动态分配结构的多维数组
- 在读取大型 txt 文件时动态分配结构内的向量
- 在C++中更有效地分配结构体的内存
- 分段错误,在动态分配的结构内动态分配结构
- 如何无限制地重新分配结构数组
- 我在动态分配结构时遇到问题
- 为结构的整个向量分配结构的元素
- 在C++中分配结构
- 在c++中编写交换函数以重新分配结构数组中的成员值
- 如何分配结构,然后增加其大小
- 使用 malloc 在C++中动态分配结构
- 分配结构列表的向量
- 如何在方法中返回数组的动态分配结构
- 动态分配结构数组很麻烦
- 堆分配结构的初始值设定项列表
- 已分配结构包含向量的内存泄漏
- 从循环中分配结构成员