QT二进制文件读写中如何通过指针存取自定义结构体


#include <QObject>
#include <QFile>
#include <QDataStream>
#include <iostream>
using namespace std;

#define MAXSIZE 20000

template<class T>
bool bin_save(T* p_s, int num)
{
    QFile file("test.dat");
        file.open(QIODevice::WriteOnly);
        int len = sizeof(T)*num;
        file.write((char*)p_s,len);
        file.close();
        return true;

}

template<class T>
int bin_read(T*& p_r)
{/** 记住函数的参数传递是值复制传递,如果不用&传过来是指针的内容,即指向内存空间的地址,
    而且是复制一份地址,所以只能改变指针的指向内存位置的内容,不能改变指针的指向,
    传地址相当于引用,改变了指针的内容,即他指向的具体位置 */


    QFile tmpfile("test.dat");
    tmpfile.open(QIODevice::ReadOnly);

    p_r = new T[MAXSIZE];
    int len = tmpfile.read((char*)p_r, MAXSIZE);

    int i_len = sizeof(T);
    int num = len/i_len;
    return num;

}



int main()
{
//    short data[5];
//    data[0] = 1;
//    data[1] = 2;
//    data[2] = 3;
//    data[3] = 4;
//    data[4] = 5;
//    short* p_s = &data[0];
//    for(int i =0;i<5;i++)
//    {
//        cout<<*(p_s+i)<<" ";
//    }
//    cout<<endl;
    struct PDWS{
        int a;
        char b;
    };
    PDWS data[3];
    data[0].a = 0;
    data[0].b = 'x';/** 注意"x"和'x'是不一样的,"x"是char[2] */
    data[1].a = 1;
    data[1].b = 'y';
    data[2].a = 2;
    data[2].b = 'z';

    PDWS * p_s_struct = &data[0];
    for(int i =0;i<3;i++)
    {
        cout<<(*(p_s_struct+i)).a<<" "<<(*(p_s_struct+i)).b;
        /** 注意要有括号,否则是直接.a再取地址,会报错 */
        cout<<endl;
    }


    bin_save<PDWS>(p_s_struct,3);
    PDWS * p_r_struct = NULL;
    int num = bin_read<PDWS>(p_r_struct);

    for(int i =0;i<num;i++)
    {
        cout<<(*(p_s_struct+i)).a<<" "<<(*(p_s_struct+i)).b;
        cout<<endl;
    }

//    bin_save<short>(p_s,5);
//    short *p_r = NULL;
//    int num = bin_read<short>(p_r);

//    for(int i =0;i<num;i++)
//    {
//        cout<<*(p_r+i)<<" ";
//    }
//    cout<<endl;




return 0;




}

猜你喜欢

转载自blog.csdn.net/sinat_37269729/article/details/92354407