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

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

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

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <Windows.h>
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函数从文件整体读取到内存中。

运行结果:

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

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

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

 

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

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值