c++从文件读取结构体整体

目标:仅仅从某一文件读取一次,就能对结构体的整体完成赋值。而不是每次提取一个数据,再赋值给结构体的某一元素,然后循环,显得麻烦

原理:无论是结构体还是结构体数组在内存都是连续地址的内容,只是中间会有填充内容,以达到对齐的效果。但如果我们将数据连同填充一起写入文件,这样相当于把地址空间copy了一份到文件中,读的时候再copy回来,不就完成了整个结构体的读取了吗。这样就不用考虑常规方法中解析文件内容等问题。

#include 
#include 
#include 
#include 
using namespace std;
struct MyStruct
{
    int id;
    char name[20];
    float score;
};
int main()
{
    MyStruct myList[3];
    myList[0].id = 1;
    strcpy_s(myList[0].name, "zhang");
    myList[0].score = 60.0;
    myList[1].id = 2;
    strcpy_s(myList[1].name, "wang");
    myList[1].score = 70.0;
    fstream myFile("test.txt", ios::out | ios::binary);
    myFile.write((char*)myList, sizeof(MyStruct) * 3);//将结构体数组整体写入
    myFile.close();
    fstream myFileReader("test.txt", ios::binary | ios::in);
    memset(myList, '\0', sizeof(MyStruct) * 3);
    myFileReader.read((char*)myList, sizeof(MyStruct) * 3);
    for (int i=0;i < 3;i++) {
        printf("id:%d\n", myList[i].id);
        printf("name:%s\n", myList[i].name);
        printf("score:%f\n", myList[i].score);
    }
}

使用write函数从内存整体写入到文件中,使用read函数从文件整体读取到内存中。

运行结果:

c++从文件读取结构体整体_第1张图片

可以看到,从文件中读取数据没有问题。

 代码中我只对结构体数组中的前两个进行了赋值,因此最后一个没有数据。但这里也有问题,我明明使用了memset(myList, '\0', sizeof(MyStruct) * 3);将这块内存区域全部赋值为0,怎么会是乱码呢。(感觉烫烫烫对应了空,奇怪奇怪)

注意:对文件内容进行修改,必须通过write()方法,而不能直接打开文件里改,不然会乱码,如下图。

c++从文件读取结构体整体_第2张图片

 

思考原因,我猜想是因为数据流并不是以字节的形式传输的,而是二进制,在字节码层面修改会导致无法对齐格式。

你可能感兴趣的:(c++)