一、问题
从数据⽂件读结构或者向数据⽂件写结构,都可以很轻松地使⽤⽂件读写函数实现, 如使⽤ fwrite( ) 函数写⼀个结构,使⽤ fread( ) 函数读⼀个结构,但是这样读写出的⽂件却不能移植。怎么从/向数据⽂件读/写结构才能更好呢?
二、解答
使⽤ fread( ) 和 fwite( ) 函数读写数据⽂件很常见,⽤来读写⼀个数据块,它们的⼀般形式为:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
buffer 是⼀个指针,对 fread( ) 函数来说是指向读⼊数据存放的地址,对 fwrite( ) 来说是指向要输出数据的地址;size 为要读写的字节数;count 为多少个 size 字节的数据项:fp为⽂件指针。
说明:
如果⽂件以⼆进制形式打开,⽤以上这两个函数就可以读写任何类型的信息。 举例说明从数据⽂件读结构。
例如,有⼀个⾃定义的结构体类型 student 为:
struct student
{
char name[20];
int age;
int number;
}stu[10];
结构体数组 stu 有 10 个元素,每⼀元素⽤来存放⼀个学⽣的数据(包括姓名、年龄、学号)。10 名学⽣的信息已经存储到指定的磁盘⽂件中,可以使⽤ fread( ) 函数读此结构信息。例如:
for(i = 0;i < 10;i++)fread(&stu[i],sizeof(struct student),1,fp);
说明:
fwrite( ) 函数应⽤同样的⽅法可以向磁盘⽂件写⼊信息。
虽然应⽤上述函数可以向数据⽂件读写结构,但是这样写出的⽂件不能移植。最好的移植⽅法是⽤⽂本⽂件,使⽤ fprintf( ) 函数写⼊,使⽤ fscanf( ) 函数读⼊,或类似的函数。
同时还应注意,如果结构包含任何指针,则只有指针值会被写⼊⽂件,当它们再次读回来的时候,很可能⼰经失效。最后为了⼴泛地移植,必须使⽤ “ b ” 标志打开⽂件。 移植性更好的⽅案是写⼀对函数,⽤可移植的⽅式按域读写结构,不过开始可能⼯作量稍⼤。
三、总结
在从数据⽂件读结构或者向数据⽂件写结构时,都应注意所使⽤的函数是应⽤于⼆进制⽂件还是⽂本⽂件,按照要求以相应的打开⽅式打开⽂件,否则容易出现乱码。