1

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

这是我写入数据的函数:

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 的基本操作,但实际上我所知道的只是在一个文本文件中读取它,任何比我有点迷茫的更复杂的东西。

有关如何阅读此内容的任何建议?

4

1 回答 1

1

你很亲密。您需要以二进制形式写入读取长度。

您的长度写入的这一部分是错误的:

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() {}
};
于 2012-11-25T09:09:00.293 回答