C语言文件读写结构体里面的数据怎样存到磁盘文件上
C语言,要将结构体中的数据存到磁盘上需要使用与文件操作相关的库函数。
首先要使用文件打开函数fopen()。
fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式) 其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件名”是被打开文件的文件名。 “使用文件方式”是指文件的类型和操作要求。“文件名”是字符串常量或字符串数组。
其次,使用文件读写函数读取文件。
在C语言中提供了多种文件读写的函数:
·字符读写函数 :fgetc和fputc
·字符串读写函数:fgets和fputs
·数据块读写函数:freed和fwrite
·格式化读写函数:fscanf和fprinf
最后,在文件读取结束要使用文件关闭函数fclose()关闭文件。
下面使用格式化读写函数fscanf和fprintf实现对文件A.txt(各项信息以空格分割)的读取,并存入结构体数组a中,并将它的信息以新的格式(用制表符分割各项信息)写入B.txt,实现对A.txt的处理。
C语言源程序如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct student{
char name[32];
int no;
char sex[16];
float score;
} stu;
int main(int argc, char* argv[])
{
//打开文件
FILE * r=fopen("A.txt","r");
assert(r!=NULL);
FILE * w=fopen("B.txt","w");
assert(w!=NULL);
//读写文件
stu a[128];
int i=0;
while(fscanf(r,"%s%d%s%f",a[i].name,&a[i].no,a[i].sex,&a[i].score)!=EOF)
{
printf("%s\t%d\t%s\t%g\n",a[i].name,a[i].no,a[i].sex,a[i].score);//输出到显示器屏幕
fprintf(w,"%s\t%d\t%s\t%g\n",a[i].name,a[i].no,a[i].sex,a[i].score);//输出到文件B.txt
i++;
}
//关闭文件
fclose(r);
fclose(w);
system("pause");
return 0;
}
编译运行后的结果如下:
结构体存储到磁盘文件,一般有两种方法,各有优劣,需要依照实际需求来选择。
假定结构体格式为
struct test
{
int a;
float b;
};
1 以二进制方式存储。
直接以二进制方式存储,参考代码如下:
#include <stdio.h>
int main()
{
struct test v = {1, 2.3};
FILE *fp;
fp = fopen("save.bin", "wb"); //存储于save.bin中,注意要以二进制模式打开。
if(fp == NULL)return -1; // 打开文件失败。
fwrite(&v, sizeof(v), 1, fp); //写入文件。
fclose(fp);//关闭文件。
return 0;
}
当需要读取的时候,按照类似的流程,通过fread读取即可。
该操作优势为:
a 代码简单。
b 存储的数据文件大小固定,就是结构体占用内存空间的整数倍。这样在读的时候就可以根据文件的大小直接判断出一共存储了多少个数据。
缺点为:
a 存储的是二进制方式,打开后不可读(大部分时候会是乱码)。
需要注意一点,当结构体中有指针类型时,所有指针不可以直接写入,而是要依照每个指针展开写入,即写入指针指向的地址内容,而不是写入指针本身的值。这种情况下,读取的时候也需要重新分配指针,并读取对应的数据。
2 以文本方式写入。
通过fprintf函数,对每个值以可读的方式,格式化输出到文本文件中。类似于printf的操作,只不过目标由标准输出转向文件。
参考代码如下:
#include <stdio.h>
int main()
{
struct test v = {1, 2.3};
FILE *fp;
fp = fopen("save.txt", "w"); //存储于save.txt中,注意要以文本模式打开,也就是不带b的模式。
if(fp == NULL)return -1; // 打开文件失败。
fprintf(fp, "%d %f", v.a, v.b); //写入文件。
fclose(fp);//关闭文件。
return 0;
}
读取的时候用fscanf依次读取即可。
这种方法的好处是:
a 获得的文件是可读的,打开后可以很清楚的看到每个结构体的值。比如例子中的文件最终存储的是
1 2.300000
缺点为:
a 代码量偏大,如果结构体中有数量较多的元素,那么需要逐个写输出的格式和语句,可见工作量会相当大。
b 存储的文件大小不确定,可能比二进制存储时大,也可能更小,不同结构体数值占用也不同。比如例子中的结构体,二进制存储的时候是8个字节,文本存储的时候是10个字节。而如果赋值v={-1234567,1234.1};那么文件中会存储
-1234567 1234.100000
这样文件就会占用20个字节。
2013-09-13
fread
fwrite
2013-09-13