大家好!我是保护小周ღ,本期为大家带来的是文件的基本操作,格式化的形式读写文件,二进制的形式读写文件,标准输入、输出流,再认识一下sprintf(),sscanf(),以及文件定位等方面的知识。
上期我们基本了解了文件读写字符数据的基本使用方法以及标准的书写格式,本来带大家学习更深层次文件操作,我们先从格式化读写函数开始;
没有学习文件基本操作(上)的朋友,也可以通过博主的链接访问学习:文件基本操作(上)_保护小周ღ的博客-CSDN博客
四、文件的顺序读写
4.5 格式化写—fprint()
fprintf()函数的功能与printf()函数的功能相似,都是格式化读写函数,两个函数的区别在于:printf(),针对的是标准输出流-stdout(显示器)
fprintf()可以是针对标准输出流,也可以是我们指定的流,文件流
首先我们先来观察一下两个函数的参数:
int printf(const char *format[,argument]...);
int fprintf(FILE *stream,const char *format[,argument]...)
是不是特别像,fprintf()函数的调用格式为:fprintf(文件指针,格式字符串,输出表列);
应该有点懵吧?那我们运用到程序里看看区别:
第一步,我们定义一个结构体变量。
第二步,我们录入信息,这里为方便大家观察,我直接在创建信息录的时候输入数据并调用函数打印信息。
第三步,我们运用printf()打印信息,fprintf()写入信息至文件
这样会不会容易理解一些?当然我们也可以运用循环写入更多的信息。且往下瞧,待会再去实现;
4.6 格式化读—fscanf()
fscanf()函数的功能与scanf()函数的功能相似,都是格式化读写函数,两个函数的区别在于:scanf()针对的是标准输入流stdio(键盘)
fscanf()可以是针对标准输入流,也可以是我们指定的流,文件流
两个函数的参数同样类似,fscanf()函数的调用格式为:fscanf(文件指针,格式化字符串,输入列表);
可能大家还是不容易理解参数是什么,那大家看看这样是不是就能好理解一点:
fscanf(fp,"%d %f %s",&d,&c,str);//这里大家注意,如果参数是变量,我们就一定要加取地址符‘&’,如果是数组就可以不用加;
我们再用代码看看具体是怎么一回事:
第一步,我们定义一个结构体变量。
第二步,我们调用函数把之前的fprintf()函数写入文件的信息读取出来
第三步,实现
成功将数据从文件中读出!
4.7 标准输入、输出流
stdin:标准输入流(键盘)
stdout:标准输出流 (显示器,屏幕)
我们利用格式化输入输出函数简单介绍一下,了解一下即可;
是不是觉得自己离大牛又近了一步?不急不急咱接着来。
先给大家补充一下 文件怎样写入信息或读出信息,当给文件写入数据时,最先应该在输出缓冲区,等缓冲区满了再输出到磁盘保存,当从文件里读取信息时,数据应先到达输入缓冲区,然后再给到程序对应的数据类型变量等。
4.8 以二进制的形式写文件—fwrite()
我们先介绍一下函数的参数:
size_t fwrite(const void *buffer , size_t size, size _t count , FILE* stream);
我们结合代码来看看具体是怎么使用的:
老样子先定义结构
为了方面理解代码,我这里在定义的时候直接录入信息,并调用函数
实现:
可恶让fwrite()装到了*****
4.9 以二进制的形式读文件—fread()
同样是先介绍参数:
size_t fread( void *buffer , size_t size, size _t count , FILE* stream);
是不是在哪里见过?没错!且看fwrite()函数的参数:
size_t fwrite(const void *buffer , size_t size, size _t count , FILE* stream);
用句话来形容,fread从流里读取count个size大小的数据,放到buffer里面去。
先利用fwrite()写入数据,再利用fprintf()读取数据;
我们看看这个两个函数再实际运用中的表现:
这样我们就可以做到程序结束时,我们保存信息到文件,等程序重新运行时我们可以从文件里加载信息。
4.10 sscanf() and sprintf()
我们简单的认识一下这两个函数:
sscanf()函数是从字符串里读取格式化的数据
sprintf()函数是把格式化的数据输出到(存储到)字符串中
sprintf()的使用
我们根据程序一句话介绍参数:信息存放在哪里,以什么样的格式,从哪里读取信息
注意数据类型已经是字符串了!
sscanf()的使用
我们根据程序一句话介绍参数:sscanf(),从buffer字符数组中,读取什么样的格式,放到哪里去。
到这里我们这期也接近了尾声,总结一下输入,出入函数之间的细微差别:
scanf/printf 是针对标准输入流/标准输出流的格式化输入/输出语句;
fscanf/fprintf 是针对所有输入流/输出流的格式化输入/输出语句;
五、文件的随机读写
前面介绍的文件的读写方式都是顺序读写,都是只能从头开始,如果我们只要求读写文件中某一部分信息,就没有办法了,这样我们就要用到可以移动文件指针位置的函数,称之为文件定位,常用的主要有rewind() and fseek()函数
rewind()函数我们前面(文件基本操作上)也使用过,函数调用形式为:rewind(文件指针);
功能是将文件指针位置移动到文件首。
fseek()函数用来移动文件内部的指针位置;函数调用形式为:fseek(文件指针,位移量,起始点);
位移量:如果用常量表示位移量的时候,要求后缀加'L'。
起始点:规定的起始点有3种,文件首,文件当前位置,文件尾。其表达方式如下:
例句的意义为:把文件指针的位置移到离文件首100个字节处。另外,fseek函数一般用于二进制文件。
通过对文件基本操作(下)的学习,我们应该对深层次的文件的基本读写有了一个全面的认识
希望对大家有所帮助。
感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★*
遇见了你,所有的星星都落在了我的头上