C语言的文件浅析和二级指针

本文为大一时所写的文章(2017/4/19),文笔还很生疏,在很多问题上认识不深,算是在学校的微信公众号上的一个编程探究模块上的投稿,本人当时也参与了本模块的维护和管理。补档。
今天我们讨论下C语言的文件相关。
一、何为文件
文件,是存储在外部介质的数据的集合。操作系统是以文件为单位进行管理,希望调用外存文件里的内容就得先去从外部存储中找到文件名输入到缓冲区,从缓冲区再调入到内存中,输出则是个逆过程,如图所示。(图片引用自百度)
C语言的文件浅析和二级指针
有了文件,在处理更大数据的场合就有很大的优势,程序调用复数个文件输入输出,让程序的实用性大大增强,需要的数据按格式输出到输出文件中,这样也便于传输。
从用户角度来看,以上的文件叫做普通文件,还有一种叫设备文件,即打印机、显示器、键盘等,他们的输入输出便是我们熟悉的printf和scanf了。
二、文件的指针
文件类型的指针是一个FILE 型的指针变量,他存放在头文件<stdio.h>中,是一个指向了文件相关信息②的指针,上期我们说道,指针就像一个机械臂,可以精确的查找目标地址进行调用,文件指针也是如此,可以精确的与所指向的文件对接,保证对其操作的稳定性和正确性,当然,有对接也应有脱钩,如同申请内存函数malloc()和释放内存函数free()常常一起出现可保证不会发生内存泄漏③一样,在FILE 指针中也有对接函数fopen()和脱钩函数fclose(),对目标文件操作完成后需要让系统断开和文件的链接,防止在之后的操作误修改文件内容,造成损失。所以,在编写的程序的时候fopen()和fclose()缺一不可。
三、文件的函数操作
文件的打开函数fopen调用的一般形式为:
FILE *pointer fopen(const char * path,const char * mode);
其中pointer是文件指针名,pach则包含了文件路径和文件名,mode是文件的使用方式,如下表:(图片引用自百度)
C语言的文件浅析和二级指针
在不同情况下使用不同的文件使用模式,合理运用各个模式的特点,这样代码才会更加优秀让别人看懂。
注意:习惯上在打开一个文件的时候应该加上一个判断函数,因为如果打开一个不存在的文件或者磁盘空间满了,文件就会打开失败,这时候fopen会返回一个NULL传给pointer,建立一个判断函数可以让我们在一开始的时候就知道哪里出错并且安全退出程序。
基本形式为:
C语言的文件浅析和二级指针
文件的格式化输出函数fprintf调用一般形式为:
int fprintf(FILE *pointer, “%X”,outlist);
其中%X是输出的类型格式,outlist是输出列表。
文件的格式化输入函数fscanf调用一般形式为:
int fscanf(FILE *pointer, “%X”,putlist);
其中%X是输入的类型格式,putlist是输入列表。
文件的关闭函数fclose调用一般形式为:
int fclose(FILE * pointer);
此动作会将缓冲区内的数据立刻写入文件中,并释放文件资源,这样就会保证输出文件的完整性④
四、一则实例
接下来我们来看一个和文件相关的实例——Josephu问题问题大意为设编号为1,2,…n,的n个人围坐一圈,k(<14)=2n,从一号开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,前n/2个出列的人正好是一开始后n/2的人数。
C语言的文件浅析和二级指针
C语言的文件浅析和二级指针
也就是说6人多一列,当每次要报到5时,前三次出队的人是4,5,6。
这个算法有点难懂,但大家多看多想多练,定能将他拿下~
①:这也就是为什么同一目录下不允许有同名文件的原因——C语言不是很懂你要调用谁
②:文件相关信息包括文件名,文件路径以及目前状态(可读写/可读/可写/不可读写等)等。
③:内存泄露指的是动态申请内存空间后,使用完未释放,依然占用着程序内存,这样会导致程序运行速度因为这些无用内存而变得更慢。
④:C语言I/O实在缓冲区存满才会输出到磁盘或者输入到内存,如果非正常关闭的话,存在缓冲区的数据就会立刻失去。
说一说上次的“遗留”问题。
指针的指针也称为二级指针,他们的关系为:
C语言的文件浅析和二级指针
其代码实现为:
C语言的文件浅析和二级指针
以此类推还有三级指针(p)等,但在实际生活中并不会用到更高次的指针。
这里明确
取值符号和&取地址符号,想对a取值p1加一个
,对p1取值p2加一个
,取地址则类似取值。
指针数组基本形式是:数据类型 *指针名[常量表达式]
指针数组申请了复数个指针,和数组类似,是连续存储,在结构体上有较多的应用,传递的是地址,这样内存占用就会少的很多。
本人能力有限,程序代码难免出现错误,请各位同学斧正!