用格式化和二进制方式读写文件
1.用格式化方式读写文本文件
大家已经熟悉的用printf函数和scanf函数向终端进行格式化的输入输出,即用各种不同的格式以终端为对象输入输出数据。其实文件也能进行格式化输入输出。这时就要用到fprintf函数和fscanf函数,他们的一般调用方式为:
fprintf(文件指针,格式字符串,输出列表);
fscanf(文件指针,格式字符串,输入列表);
例如:
fprintf(fp,"%d,%6.2f",i,f);
它的作用是将int型变量i和float变量f的值按%d和%6.2f输出到fp所指向文件中。
fscanf(fp,"%d,%f",&i,&f);
它的作用是磁盘中文件如果有字符“3,4.5”,则从磁盘文件中读取整数3给整型变量i,读取4.5给float型变量f。
用fprintf函数和fscanf函数对磁盘文件读写,使用方便,容易理解,但由于输入时要把文件中的ASCII码转换为二进制形式在保存在内存变量中,在输出时要把内存中的二进制形式转化成字符,要花费较多的时间。因此,在磁盘频繁交换数据的情况下,最好不要用。而用下面介绍的fread函数和fwrite函数进行二进制的读写。
2 用二进制方式向文件读写一组数据
2.1 写文件
fwrite(buffer,size,count,fp);
功能:以数据块的方式给文件写入内容
参数:
buffer:准备写入文件数据的地址
size: size_t 为 unsigned int类型,此参数指定写入文件内容的块数据大小
count:写入文件的块数
fp:已经打开的文件指针
返回值:
成功:实际成功写入文件数据的块数目,此值和 count 相等
失败:0
如果有一个Struct student-type结构体类型
struct Student_type
{
char name[10];
int num;
int age;
char addr[30];
} stud[40];
用for循环把内存中的学生数据输出到磁盘中
for(i=0;i<40;i++)
{
fwrite(&stud[i],sizeof(struct Student_type),1,fp);
}
2.2 读文件
fread(buffer,size,count,fp)
功能:以数据块的方式从文件中读取内容
参数:
buffer:存放读取出来数据的内存空间
size: unsigned int类型,此参数指定读取文件内容的块数据大小
count:读取文件的块数,读取文件数据总大小为:size * count
fp:已经打开的文件指针
返回值:
成功:实际成功读取到内容的块数,如果此值比小count,但大于0,说明读到文件的结尾。
失败:0
同样是上面的结构体用for循环输入学生数据
for(i=0;i<40;i++)
{
fread(&stud[i],sizeof(struct Student_type),1,fp);
}