如何在二进制文件中读取/写入结构?

How to read / write a struct in Binary Files?(如何在二进制文件中读取/写入结构?)
本文介绍了如何在二进制文件中读取/写入结构?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

限时送ChatGPT账号..

我遇到了一个小问题.我有一个结构体,它有一个向量.请注意,向量在每次迭代中都是动态的.现在,在特定的迭代中,如何将包含大小为 n 的向量的结构存储到二进制文件中?

I am facing a small problem. I have a struct, which has a vector. Note that the vector is dynamic per every iteration. Now, in a particular iteration, how do I store the struct which contains a vector of size n to a binary file?

另外,在检索时,假设我知道向量的大小,如何从二进制文件中检索包含所有存储元素的向量的结构变量?

Also, when retrieving, assume that I know how the size of the vector, how to I retrieve from the binary file, the struct variable containing the vector of all the stored elements?

我能够将一些内容存储到二进制文件中(因为我可以看到写入时大小增加),但是当我尝试检索元素时,我将向量的大小设置为零.

I am able to store something to the binary file (as I can see the size increasing when writing), but when I am trying to retrieve back the elements, I am getting size of vector to be zero.

不幸的是,我必须使用标准 STL 来实现这一点,而不是使用任何第三方库.

推荐答案

你应该看看 Boost 序列化.

如果你不能使用第三方库,你必须知道C++不直接支持序列化.这意味着你必须自己做.

If you can't use 3rd party libraries, you must know that C++ doesn't support serialization directly. This means you'll have to do it yourself.

这篇文章 展示了一种将自定义对象序列化到磁盘并取回它的好方法.而本教程向您展示了如何立即开始使用fstream.

This article shows a nice way of serializing a custom object to the disk and retrieving it back. And this tutorial shows you how to get started right now with fstream.

这是我的尝试:

EDIT:由于 OP 询问如何存储/检索比记录更多的内容,因此我决定更新原始代码.

EDIT: since the OP asked how to store/retrieve more than record I decided to updated the original code.

那么,发生了什么变化?现在有一个 array student_t apprentice[3]; 来存储 3 个学生的信息.整个阵列被序列化到磁盘,然后全部加载回 RAM,在那里可以读取/搜索特定记录.请注意,这是一个非常非常小的文件(84 字节).在大文件中搜索记录时,我不建议使用这种方法.

So, what changed? Now there's an array student_t apprentice[3]; to store information of 3 students. The entire array is serialized to the disk and then it's all loaded back to the RAM where reading/searching for specific records is possible. Note that this is a very very small file (84 bytes). I do not suggest this approach when searching records on huge files.

#include <fstream>
#include <iostream>
#include <vector>
#include <string.h>

using namespace std;


typedef struct student
{
    char name[10];
    int age;
    vector<int> grades;
}student_t;

int main()
{
    student_t apprentice[3];  
    strcpy(apprentice[0].name, "john");
    apprentice[0].age = 21;
    apprentice[0].grades.push_back(1);
    apprentice[0].grades.push_back(3);
    apprentice[0].grades.push_back(5);    

    strcpy(apprentice[1].name, "jerry");
    apprentice[1].age = 22;
    apprentice[1].grades.push_back(2);
    apprentice[1].grades.push_back(4);
    apprentice[1].grades.push_back(6);

    strcpy(apprentice[2].name, "jimmy");
    apprentice[2].age = 23;
    apprentice[2].grades.push_back(8);
    apprentice[2].grades.push_back(9);
    apprentice[2].grades.push_back(10);

    // Serializing struct to student.data
    ofstream output_file("students.data", ios::binary);
    output_file.write((char*)&apprentice, sizeof(apprentice));
    output_file.close();

    // Reading from it
    ifstream input_file("students.data", ios::binary);
    student_t master[3];
    input_file.read((char*)&master, sizeof(master));         

    for (size_t idx = 0; idx < 3; idx++)
    {
        // If you wanted to search for specific records, 
        // you should do it here! if (idx == 2) ...

        cout << "Record #" << idx << endl;
        cout << "Name: " << master[idx].name << endl;
        cout << "Age: " << master[idx].age << endl;
        cout << "Grades: " << endl;
        for (size_t i = 0; i < master[idx].grades.size(); i++)
           cout << master[idx].grades[i] << " ";
        cout << endl << endl;
    }

    return 0;
}

输出:

Record #0
Name: john
Age: 21
Grades: 
1 3 5 

Record #1
Name: jerry
Age: 22
Grades: 
2 4 6 

Record #2
Name: jimmy
Age: 23
Grades: 
8 9 10

二进制文件的转储:

$ hexdump -c students.data 
0000000   j   o   h   n   237   {           {    025      
0000010   (           4           8           j   e   r   r
0000020   y                |   026         @        
0000030   L           P           j   i   m   m   y      
0000040      6      027         X           d        
0000050   h                                                        
0000054

这篇关于如何在二进制文件中读取/写入结构?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

OpenGL transforming objects with multiple rotations of Different axis(OpenGL 变换不同轴多次旋转的对象)
GLFW first responder error(GLFW 第一响应者错误)
SOIL not linking correctly(SOIL 连接不正确)
Core profile vs version string? Only getting GLSL 1.3/OGL 3.0 in mesa 10.0.1(核心配置文件与版本字符串?在 mesa 10.0.1 中只获得 GLSL 1.3/OGL 3.0)
What is the range of OpenGL texture ID?(OpenGL 纹理 ID 的范围是多少?)
How taxing are OpenGL glDrawElements() calls compared to basic logic code?(与基本逻辑代码相比,OpenGL glDrawElements() 调用的繁重程度如何?)