我终于想出了如何将一些特定格式的信息写入二进制文件,但现在我的问题是读回它并按照原来的方式构建它。
这是我写入数据的函数:
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() {}
};