我定义一个文件,文件的开头是一个结构体,包含了文件的一些基本信息。每次获取一次记录之后就用ab文件打开方式往文件添加数据。之后利用rb方式打开文件,顺序读取,读取文件开头的结构体成功,然后读取添加的数据时发现读取的数据前方多了一些无用的数据。所以我猜想是不是使用ab打开文件的时候,新添的数据和问价原有的数据会产生间隔?
已经找到问题在哪了。
fread(file->fileName,sizeof(file->fileName),i,inputStream);
应该改成:
fread(file->fileName,sizeof(file->fileName),1,inputStream);
循环一开始的时候i=0,所以读取数据出错。但是我在调试的过程中发现一个很奇怪的问题:
i=0,表示读取字节长度为0,调试可以看见文件指针并没有移动,但是它又能读取与文件有关的信息,为什么呢?
######没见过ab会产生间隔,再检查下其他问题呢?######如果你添加的数据也是类型结构体或者联合体一样的数据单元的话,那考虑到内存对齐是有可能在文件中存在间隔的,添加数组中数据时,如果写死了长度也有可能会有额外的占空间无用数据。######上代码######已经上了######文件结构:
前面是FileState结构体,后面是添加的Record结构体数组
struct FileState{ char fileName[30]; //文件名 int subjectNum; //科目总数 int recordSum; //记录总数 char (*suject)[20]; //科目名称 float *weight; //科目的加权学分 }; struct Record{ char name[10]; //学生名字 char sex[5]; //性别 char stuNum[20]; //学号 int raking; //排名 float weightScore; //加权成绩 float *score; //成绩 指向float[20]的指针,也就意味着科目最多为20个 };FileState首先写入文件:
fwrite(file->fileName,sizeof(file->fileName),1,outputStream); //写入文件名 fwrite(&(file->subjectNum),sizeof(file->subjectNum),1,outputStream); //写入科目总数 fwrite(&file->recordSum,sizeof(file->recordSum),1,outputStream); //写入记录的总数,值为0 for (i=0;i<file->subjectNum;i++) //逐个写入科目名称 { fwrite(*(file->suject+i),sizeof(char[20]),1,outputStream); } for (i=0;i<file->subjectNum;i++) //写入科目加权学分 { fwrite(file->weight+i,sizeof(float),1,outputStream); }接着写入Record结构体:
if ((outputStream=fopen(file->fileName,"rb+"))==NULL) { de_catcheErro("addRecordsToFile:...打开记录文件出错啦"); exit(0); } fseek(outputStream,0,SEEK_END); for (i=0;i<recordSum;i++) { fwrite(records[i].name,sizeof(records[i].name),1,outputStream); fwrite(records[i].sex,sizeof(records[i].sex),1,outputStream); fwrite(records[i].stuNum,sizeof(records[i].stuNum),1,outputStream); fwrite(&(records[i].raking),sizeof(records[i].raking),1,outputStream); fwrite(&(records[i].weightScore),sizeof(records[i].weightScore),1,outputStream); for(j=0;j<file->subjectNum;j++) { fwrite(records[i].score+i,sizeof(float),1,outputStream); }
char (*suject)[20]; //科目名称
`suject`定义为数组指针,但引用的方法不对吧,下面的定义(指针数组)应该才是你的原意?
char *suject[20]; //科目名称
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。