加载格式化的二进制文件并将信息分配给结构 c++

Load a formatted binary file and assign information to structure c++

本文关键字:分配 结构 c++ 信息 格式化 二进制文件 加载      更新时间:2023-10-16

我终于想出了如何将一些特定格式的信息写入二进制文件,但现在我的问题是读回它并按照原来的方式构建它。

这是我写入数据的函数:

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() {}
};