开发者社区> 问答> 正文

C语言文件读写问题,ab添加数据后rb方式获取时出错:报错

我定义一个文件,文件的开头是一个结构体,包含了文件的一些基本信息。每次获取一次记录之后就用ab文件打开方式往文件添加数据。之后利用rb方式打开文件,顺序读取,读取文件开头的结构体成功,然后读取添加的数据时发现读取的数据前方多了一些无用的数据。所以我猜想是不是使用ab打开文件的时候,新添的数据和问价原有的数据会产生间隔?


展开
收起
kun坤 2020-06-07 20:46:19 824 0
1 条回答
写回答
取消 提交回答
  • 已经找到问题在哪了。

    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]; //科目名称




    ######这个地方没有问题,我需要的就是数组指针
    2020-06-07 20:46:23
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多