C语言以结构体读取文件的问题
各位请教个问题:
我想从文件中读取数据,但这个数据是以结构体的方式存储的.
//操作员结构体大小
#define _OperatorID 8
#define _OperateorName 15
#define _Password 6
#define _right 2
#define _T1 15
#define _T2 15
#define _T3 15
typedef struct Meteroperator //操作员
{
char OperatorID[_OperatorID]; //操作员ID
char OeperateorName[_OperateorName];//操作员名
char Password[_Password]; //操作员密码
char right[_right]; //操作员权限
char T1[_T1]; //备用
char T2[_T2]; //备用
char T3[_T3]; //备用
} MeterOp;
我现在想读取文件(user.dat)这样的文件中的信息,各位能不能给个方法啊,要标准C的.用VC以前到是写过,看标准C的stdio.h文件里面的函数,参数完全不知道啊,在线等,谢了!!!
[解决办法]
sscanf();使用这个函数原型
[解决办法]
全部是字符串,那好说
MeterOp x;
FILE* fp=fopen( "filename ", "r ");
//fseek到制定位置后
fscanf(fp, "%s ",x.OperatorID);
fclose(fp);
[解决办法]
void readStruct(FILE* fp, MeterOp** mo)
{
if(mo == NULL)
{
return;
}
if( *mo == NULL)
{
*mo = (MeterOp*)malloc(sizeof(MeterOp));
}
//读一个字段,其余类似。
int lenOfId = readInt(fp);
fread(*mo-> OperatorID,lenOfId,fp);
}
void writeStruct(FILE *fp,MeterOp* mo)
{
if(mo == NULL)
return;
int lenOfId = strlen(mo-> OperatorID);
//写一个字段,其他字段类似
fwrite(&lenOfId,sizeof(int),fp);
fwrite(mo-> OperatorId,lenOfId,fp);
}
[解决办法]
这里有一个问题,在文件中是否个字段字节长度固定。
假设是固定的吧,否则你需要判断\0逐字节读出并分析。
如果你的文件中已开始就是信息,没有其他关于信息结构的描述的话,可以这样写
MeterOp infoblock
int fd=open(filename,_O_RDONLY);//只读方式打开
if(fd==-1) exit(-1);
while(read(fd,&infoblock,sizeof(MeterOp))==sizeof(MeterOp))
{
//do something here
};//
close(fd);
如果文件头部有结构信息,需要在设一个描述文件头信息的结构体,lseek到实际数据开始处再开始读取;
[解决办法]
这个应该用sscanf~
baidu或者google是最快最方便的获得答案的方法
[解决办法]
不用那么麻烦。
MeterOp *GetMeterOp(char *infile)
{
FILE *fi = fopen(infile, "rb ");
fseek(fi,0,2);
int slen = sizeof(MeterOp);
int offset = 0;//或描述字长度
int flen=ftell(fi);
if(flen <=offset){
fclose(fi);
return 0;}
int n = (flen-offset)/slen;
fseek(fi,offset,0);
MeterOp *sp = (MeterOp*)malloc(n*slen);
for(int i=0;i <n;++i) fread(&(sp[i]),slen,1,fi);
//-- fread(&sp,slen,n,fi);
fclose(fi);
return sp;
}
[解决办法]
MeterOp *GetMeterOp(char *infile)
{
FILE *fi = fopen(infile, "rb ");
fseek(fi,0,2);
int slen = sizeof(MeterOp);
int offset = 0;//或描述字长度
int flen=ftell(fi);
if(flen <=offset){
fclose(fi);
return 0;}
int n = (flen-offset)/slen;
fseek(fi,offset,0);
MeterOp *sp = (MeterOp*)malloc(n*slen);
for(int i=0;i <n;++i) fread(&(sp[i]),slen,1,fi);
//-- fread(&sp,slen,n,fi);
fclose(fi);
return sp;
}