目录
一.文件
文件,我们平时在磁盘看到的就是文件。
我们通过文件来保留所写程序的数据,不然的话,由于程序的数据是在内存中的,当程序退出后数据就会被回收。
在程序设计中,文件一般分为程序文件和数据文件。
程序文件:
1.源程序⽂件(后缀为.c)
2.目标文件(windows环境后缀为.obj)
3.可执行程序(windows 环境后缀为.exe)
数据文件:
存放程序运行时读写的数据。
数据文件又可分为文本文件和二进制文件。
二进制文件:数据在内存中以二进制的形式存储。
文本文件:以ASCII字符的形式存储的文件。
(字符一律以以ASCII形式存储,,数值型数据既可以用ASCII形式存储,也可以使用⼆进制形式存储。)
文件名:
让用户识别和引用的文件唯一标识就是文件名。
文件名包含3部分:文件路径+文件名主干+文件后缀
如:c:\code.4.20\test.txt
二.文件操作
“ 流 ”
数据可以从外部设备输入,也可输出到外部设备,而不同的外部设备的输入输出操作各不一样。
因此,我们这些不同的输入输出操作统一抽象出来的一种相关概念,“流”。
不同的流就代表着不同设备的输入输出操作。
数据的输入输出都是需要流的。我们常见的操作就是从键盘输入数据,然后输出到屏幕上,但我们并没有主动打开“流”。因为C语言程序启动时会自动打开3个“流”。
• stdin-标准输入流,在大多数的环境下从键盘输⼊,scanf函数就是从标准输入流中读取数据。
• stdout-标准输出流,大多数的环境下输出到显示器界面,printf函数就是将信息输出到标准输出 流中。
• stderr-标准错误流,大多数环境中输出到显示器界⾯。
三个流的类型是:FILE* ,文件指针。
通过文件指针可以维护流的各种操作。
在C语言中,对于某一特定文件,会有一个专门相关联的结构体来存储文件的信息(文件名,文件状态,文件位置等),这个结构体被放在文件信息区,该结构体被系统重命名为FILE。
我们可以通过一个FILE类型的指针,间接访问相关文件,进行文件操作。
文件打开与关闭
无论我们做什么,都得先打开文件,结束后就要关闭文件。
fopen函数和fclose函数就是专门用于打开与关闭文件的。
我们看到fopen函数返回一个文件指针,所以我们打开文件时,要创建一个文件指针来接收,这样我们就可以通过文件指针访问文件。
fopen中的“mode”代表文件打开模式:
“r+”和“w+”虽然都是读写,但两者还是有不同的。
- “r+” 先读后写
- “w+”先写后读
我们再打开文件后,后续的操作顺序不能搞反。
文件打开与关闭的例子:
值得注意的是,我们用fopen打开文件时,文件的后缀名不能省略,但在文件路径下,文件的后缀名被省略了。
就上面的例子而言,fopen("test.txt", "w")中的.txt是不能省略的
文件顺序读写
fputc函数实例:
这个函数每次只会写入一个字符。
我们再使用fgetc函数读取26个字母输出到屏幕上
跟fputc类似,fgetc每次只会读取一个字符。
fscanf与fprintf
fscanf:从流中读取格式化数据
int fscanf ( FILE * stream, const char * format, ... );fprintf:将格式化数据输出到流中
int fprintf ( FILE * stream, const char * format, ... );
我们前面提到过scanf函数从标准输入流中读取数据,printf函数将信息输出到标准输出流中。
与之对应的,fscanf函数从我们所指定的流中读取数据,fprintf函数将信息输出到我们所指定的流中。
两个函数的例子:
要注意,将字符输出到文件中,其实是将字符写进文件里,所以fopen的打开模式要用“w”或者“w+”
总的来说,这两个函数可以让我们的数据输入输出不再局限于标准输入流和标准输出流,更能应对现实的不同需求。
sscanf和sprintf
sscanf 从字符串中读取格式化数据
int sscanf ( const char * s, const char * format, ...);sprintf 将格式化数据写入字符串
int sprintf ( char * str, const char * format, ... );
例子:
这两个函数与文件操作无无直接关系,但容易与fscanf与fprintf函数混淆,所以我们使用时要分清楚。
我们也可以与scanf和printf相比较,加深理解,更好地去记忆。
文件随机读写
有关文件的随机读写涉及3个函数:fseek,ftell,rewind。
fseek
- int fseek ( FILE * stream, long int offset, int origin )
- 根据偏移量让文件指针指向特定位置
origin变量取值有三个
偏移量offset可正可负,正数代表文件指针后移,负数代表文件指针前移
注意,使用一次fseek并读取完数据后,文件指针会自动向后移动一位。
ftell
long int ftell ( FILE * stream );- 返回当前文件指针到起始位置的偏移量。
rewind
void rewind ( FILE * stream );- 让文件指针回到起始位置
文件读取结束判定
feof函数
该函数被很多人错误用于判断文件是否读取结束。
feof的作用:文件读取结束后,判断读取结束的原因:是否是遇到文件末尾。
文件读取判断结束
1.文本文件读取是否结束,判断返回值是否为EOF(fputc),NULL(fputs)。
2.二进制文件读取是否结束,判断返回值是否小于实际读取个数。
有缘再会,拜拜!
摸鱼摸鱼😴✨🎞