关于为什么使用文件:没有文件,我们写的程序的数据储存在电脑内存中,如果程序退出,内存回收,数据就丢失了,再次运行的时候,是看不到上次程序的数据的,如果要将数据持久化的保存,我们可以使用文件。
为什么使用文件:第一次当n=0时,使用scanf函数将n赋值成10,打印为10,当第二次运行的时候n还是0;并没有将n的值进行保存,如果一旦退出程序数据就会丢失,这时候就体现出文件的好处了
那么有这个文件的概念:我们会好奇什么是文件;这就是我们今天的主角
文件:磁盘(硬盘)上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件,数据文件(从文件功能的角度来分类的)
程序文件:程序文件包括源程序文件(后缀为.c),目标文件(Windows环境后缀为.obj),可执行程序(Windows环境后缀为.exe)
数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件;
文件名:一个文件要有一个唯一的文件标识,以便用户识别和引用;
文件名包含三部分:文件路径+文件名主干+文件后缀;
例如: C:\code\test.txt; 为方便文件标识常被称为文件名
以文件内容划分根据数据的组织形式:分为文本文件和二进制文件;
二进制文件:数据在内存中以二进制形式存储,如果不加转化的输出到外存的文件中,就是二进制文件;
文本文件:以ASCII码值存储的文件就是文本文件;
那么数据在文件中怎么存储呢:字符一律以ASCII码值进行存储,数值型数据既可以ASCII形式存储,也可以用二进制存储。
例如10000整数,以ASCII码值存储到磁盘则用到5个字节,而二进制形式输出,则在磁盘中占到4个字节;如下图所示代码,以二进制形式写入10000在text.txt文件中,用记事本打不开,只能选择二进制,虽然也可打开但是乱码,
用二进制编辑器打开,即可看到10000的十六进制表示形式10 27 00 00;
这就是二进制文件的例子;
文件的打开和关闭
流的概念:方便程序员对各种设备进行方便的操作,抽象出流的概念,把流想像成字符的海洋;
一般情况下我们想向流写入数据,或者从流中读取数据,就必须打开流,然后操作。
标准流
当c语言程序启动时,默认打开三个流;
1.stdin-标准输入流,从键盘输入,scanf函数就是从标准输入流中读取数据
2.stdout-标准输出流,输出至显示器界面,printf函数将信息输入到标准输出流
3.srderr-标准错误流,输出到显示器界面;
stdin,stdout,srderr这三个流的类型是文件指针:FILE*,通常称为文件指针;
C语言中就是通过FILE*的文件指针来维护流的各种操作的;
文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息,这些信息存放在结构体变量中,有系统声明取名FILE.
文件的打开和关闭
打开用到的函数FILE* fopen(const char* filename , const char* mode)
从键盘/文件输入数据到内存中称为读 ,从内存中输出数据到屏幕/文件称为写;
打开函数第二个变量:"w"写入如果文件不存在会创建一个新文件,如果文件存在打开则会清空文件内容;
“r”只读,
“a”追加;
.表示当前路径,..表示上一级路径
关闭函数用到FILE* fclose(指针) 要将指针设为空指针;
文件的读写分为两种:顺序读写和随机读写
顺序读写函数介绍
1.字符输入/输出函数:fgetc/fputc ,适用于所有输入流/所有输出流;
2.文本行输入/输出函数:fgets/fputs ,适用于所有输入流/所有输出流;
3.格式化输入/输出函数:fscanf/fprintf ,适用于所有输入流/所有输出流;
4..二进制输入/输出:fread/fwrite ,适用于文件输入流/文件输出流;
二进制序列
文件拷贝代码
对比三组函数scanf/printf fscanf/fprintf sscanf/sprintf
scanf - 针对标准输入(键盘)的格式化输入函数
scanf - 针对标准输入(键盘)的格式化输入函数
fscanf - 针对所有输入流的格式化输入函数
fprintf - 针对所有输出流的格式化输入函数
sprintf的使用把格式化的数据转化成字符串
sscanf的使用从字符串中读取格式化数据
文件随机读写使用的函数fseek:根据文件指针的位置和偏移量来定位文件指针(文件内容的光标);
根据起始位置的不同,光标偏移量不同
与fseek相对的函数是ftell:返回文件指针相对于起始位置的偏移量;
fseek与ftell的结合使用
rewind让函数的指针回到起始位置
文件结束的判定
feof函数的作用:当文件读取结束的时候,判断是否遇到文件末尾而结束;
ferror函数的作用:当文件读取结束的时候,判断是否因为遇到错误而结束;
文本文件:文件读取是否结束,判断返回值是不是EOF(fgetc),或者NULL(fgets)
二进制文件的读取结束判断,判断返回值是否小于实际要读的个数 。
fread判断返回值是否小于实际要读的个数;
文件缓冲区
提高效率
ANSIC标准采用缓存文件系统处理文件;系统自动的为内存中的程序中每一个使用的文件开辟一块文件缓冲区,
程序数据区————>输出缓存区————>硬盘
硬盘————>输入缓存区————>程序数据区
因为缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件;