目录
一、什么是文件
1、概念
磁盘上的文件是文件。
2、分类
1.程序文件
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境 后缀为.exe)。
2.数据文件
文件的内容不一定是程序,而是程序运行时读写的数据。
3.文件名
举例:
c:\code\test.txt
二、文件的打开和关闭
1、文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE。
该结构体变量中的内容是自动填充的,使用者不用关心细节。
创建一个文件指针变量:
FILE* pf;
通过文件指针变量能够找到与它关联的文件。
2、打开文件
命令:fopen
文件打开失败会返回一个空指针。
3、关闭文件
命令:fclose
如果打开文件之后不关闭,之后能打开文件的数量用完之后,就不能再打开文件了。
4、顺序读写
1.补充
流:
C语言程序,只要运行起来,就默认打开了3个流:
stdin - 标准输入流 - 键盘
stdout- 标准输出流 - 屏幕
stderr- 标准错误流 - 屏幕
2.函数
FILE* pf = fopen("test.bat","w");或者FILE* pf = fopen("test.bat","r");
都可以直接使用stdin或者stdout。
fgetc
int ret = fgetc(fp);或者int ret = fgetc(stdin);
fputc
int ret = fputc("a",fp);或者int ret = fputc("a",stdout);
fgets
fgets("abcd",4,fp); --- 4是指读取的个数,包含\0
fputs
fputs("abcd",fp); --- 如果需要换行,需要加上\n
fscanf
fscanf(fp,"%s %d %f,s.arr,&(s.num);
fprintf
以上形式都是以文本的形式进行操作。
fread
int ret = fread(&s,sizeof(struct S),1,pf);
fwrite
fwrite(&s,sizeof(struct S),1,pf); --- &s是指要写的那个地址;sizeof是指数据的大小,单位是字节;1是指数据个数;pf是指文件流。
以上形式是以二进制来读写。
3.区分
scanf --- 针对标准输入的格式化的输入语句 - stdin
fscanf --- 针对所有输入流的格式化的输入语句
sscanf --- 从一个字符串中读取一个格式化的数据
printf --- 针对标准输出的格式化输出语句 - stdout
fprintf --- 针对所有输出流的格式化输出语句 - stdiout/文件
sprintf --- 把一个格式化的数据转换成字符串
5、随机读写
1.fseek函数
fseek(pf,2,SEEK_CUR); ----- 2是指偏移量;SEEK_CUR是指指针当前位置
SEEK_END是指文件末尾;SEEK_SET是指文件开始。
2.ftell函数
返回文件指针相相对于起始位置的偏移量。
int ret = ftell(pf);
3.rewind函数
让文件指针的位置回到文件的起始位置。
int ret = rewind(pf);
三、文本文件和二进制文件
1、一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而 二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。
四、文件读取结束的判定
1、注意
牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。(找原因)
2、文本文件
判断返回值是否为EOF(fgetc),或者NULL(fgets)。
fgetc函数在读取结束的时候,会返回EOF;正常读取的时候,返回的是读取到的字符的ASCII码值。
fgets函数在读取结束的时候,会返回NULL;正常读取的时候,返回存放字符串的空间起始地址。
3、二进制文件
判断返回值是否小于实际要读的个数(fread)。
fread函数在读取的时候,返回的是实际到的完整元素的个数;
如果发现读取到的完整元素的个数小于,指定的元素个数,这就是最后一次读取。
五、文件缓冲区
ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序 中每一个正在使用的文件开辟一块“文件缓冲区”。
从内存向磁盘输出数据会先送到内存中的缓冲区,装 满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓 冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。
缓冲区的大小根 据C编译系统决定的。
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文 件。 如果不做,可能导致读写文件的问题。