写完「C语言」单链表/双向链表的建立/遍历/插入/删除 后,如何将内存中的链表信息及时的保存到文件中,又能够及时的从文件中读取出来进行处理,便需要用到”文件“的相关知识点进行文件的输入、输出。
其实,就算不懂得链表,也完全可以学习”文件“相关知识点,但在此之前最好有”指针“基础。
本篇文章整理自《C语言程序设计教程--人民邮电出版社》第十二章——文件,以作文件探讨。
一、数据流与文件概念
二、文件的打开与关闭
三、文件的顺序读写
四、文件的随机读写
一、数据流与文件概念
1.数据流
数据的输入与输出都必须通过计算机的外围设备,不同的外围设备对于数据输入与输出的格式和方法有不同的处理方式,这就增加了编写文件访问程序的困难程度,而且很容易产生外围设备彼此不兼容的问题。数据流(Data Stream)用来解决这个问题。
数据流将整个文件内的数据看作一串连续的字符(字节),而没有记录的限制。
数据流借助文件指针的移动来访问数据,文件指针目前所指的位置即是要处理的数据,经过访问后文件指针会自动向后移动。
每个数据文件后面都有一个文件结束符号(EOF),用来告知该数据文件到此结束,若文件指针指到EOF便表示数据已访问完毕。
2.文件
“文件”是指存放在外部存储介质(可以是磁盘、光盘、磁带等)上的数据集合。操作系统对外部介质上的数据是以文件形式进行管理的。当打开一个文件或者创建一个新文件时,一个数据流和一个外部文件(可能是一个物理设备)相关联。
C语言支持的是流式文件,即前面提到的数据流,它把文件看作一个字节序列,以字节为单位进行访问,没有记录界限,即数据的输入和输出的开始和结束仅受程序控制,而不受物理符号(如回车换行符)控制。
可以从不同角度对文件进行分类
(1)根据文件依附的性质——普通文件和设备文件。
(2)根据文件的组织形式——顺序读写文件和随机读写文件。
(3)根据文件的存储形式——ASCII码文件和二进制文件。
ASCII码文件和二进制文件的主要区别:
(1)存储形式:ASCII文件将该数据类型转换为可在屏幕上显示的形式存储,二进制文件是按该数据类型在内存中的存储形式存储的。
(2)存储空间:ASCII所占空间较多,而且所占空间大小与数值大小有关。
(3)读写时间:二进制文件读写时需要转换,造成存取速度较慢。ASCII码文件则不需要。
(4)作用:ASCII码文件通常用于存放输入数据及程序的最终结果。二进制文件则不能显示出来,用于暂存程序的中间结果。
在C语言中,标准输入设备和标准输出设备是作为ASCII码文件处理的,它们分别称为标准输入文件和标准输出文件。
文件和内存的交互处理
二、文件的打开与关闭
要打开指定的文件可使用fopen()函数
FILE *fopen(char *filename,char *mode);
其中第二个参数mode用来设定要打开的文件类型和指定文件的访问模式。
文件中的访问模式:
判断文件是否正确打开
FILE *fp; fp=fopen("文件目录","文件中的访问模式"); if(fp==NULL) { printf("\n不能打开该文件!"); getch(); exit(1); }
关闭文件使用fclose()
int fclose(FILE *fp);
返回值为0则表示关闭成功,若返回非0值则表示有错误发生。
由系统打开的标准设备文件,系统会自行关闭。
获取文件的属性:
获取文件描述字:int fileno(FILE *fp);
根据文件描述字获取对应文件大小:long filelength(int handle_no);
三、文件的顺序读写
顺序读写是指将文件从头到尾逐个数据读出或写入。
单字符读写函数:fgetc()和fputc():
int fgetc(FILE *fp);
功能为:读取文件指针fp目前所指文件位置中的字符,读取完毕,文件指针自动往下移一个字符位置,若文件指针已经到文件结尾,返回-1。
返回值:成功则返回读取到的字符,失败返回-1.
fgetc()函数调用中,读取的文件必须是以读或读写的方式打开的。
int fputc(char ch,FILE *fp);
功能为:把字符ch写入文件指针fp所指向文件的位置。
返回值:成功时返回字符的ASCII码,失败时返回EOF(在stdio.h中,符号常量EOF的值等于-1)。
被写入的字符可以用写、读写、追加方式打开。
字符串读写函数:fgets()和fputs():
char *fgets(char *str,int n,FILE *fp);
功能为:在文件指针fp所指文件位置读取n个字符并放入str字符数组。
返回值:如果读不到字符串时返回NULL。
int fputs(char *str,FILE *fp);
功能为:将字符串str写入文件指针fp所指文件的位置。
返回值:写入数据成功时返回非0值,写入失败时返回EOF。
格式化字符串读写函数:fscanf()和fprintf():
int fscanf(FILE *fp,"格式化字符串",【输入项地址表】);
功能为:从文件指针fp所指向的文件中按照格式字符串指定的格式将文件中的数据送到输入项地址表中。
返回值:读取数据成功返回所读取数据的个数,并将数据按照指定格式存入内存中的变量或数组中,文件指针自动向下移动。读取失败返回EOF。
int fprintf(FILE *fp,"格式化字符串",【输入项地址表】);
功能为:将输出项表中的变量值按照格式字符串制定的格式输出到文件指针fp所指向的文件位置。
返回值:成功返回输出字符数,失败则返回负值。
数据块读写函数:fread()和fwrite:
int fread(void *buffer,int size,int count,FILE *fp);
功能为:从文件指针fp所指向的文件的当前位置开始,一次读入size个字节,重复count次,并将读取到的数据存到buffer开始的内存区中,同时将读写位置指针后移size*count次。
返回值:该函数的返回值是实际读取的count值。
int fwrite(void *buffer,int size,int count,FILE *fp);
功能为:从buffer所指向的内存区开始,一次输出size个字节,重复count次,并将输出的数据放入fp所指向的文件中,同时将读写位置指针后移size*count次。
返回值:返回实际写入的数据项个数count。
四、文件的随机读写