#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;
}
QT二进制文件读写中如何通过指针存取自定义结构体
猜你喜欢
转载自blog.csdn.net/sinat_37269729/article/details/92354407
今日推荐
周排行