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

Callen 发布于 2013/12/03 16:36
阅读 509
收藏 0

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


加载中
0
Callen
Callen

已经找到问题在哪了。

fread(file->fileName,sizeof(file->fileName),i,inputStream);

应该改成:

fread(file->fileName,sizeof(file->fileName),1,inputStream);


循环一开始的时候i=0,所以读取数据出错。但是我在调试的过程中发现一个很奇怪的问题:

i=0,表示读取字节长度为0,调试可以看见文件指针并没有移动,但是它又能读取与文件有关的信息,为什么呢?

0
明月惊鹊
明月惊鹊
没见过ab会产生间隔,再检查下其他问题呢?
0
水海云
水海云
如果你添加的数据也是类型结构体或者联合体一样的数据单元的话,那考虑到内存对齐是有可能在文件中存在间隔的,添加数组中数据时,如果写死了长度也有可能会有额外的占空间无用数据。
0
Honghe
Honghe
上代码
Callen
Callen
已经上了
0
Callen
Callen

文件结构:

前面是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);
		}



0
Honghe
Honghe
char (*suject)[20]; //科目名称

`suject`定义为数组指针,但引用的方法不对吧,下面的定义(指针数组)应该才是你的原意?

char *suject[20]; //科目名称




Callen
Callen
这个地方没有问题,我需要的就是数组指针
返回顶部
顶部