一、文件类型指针
二、文件操作函数
1、fopen:打开文件
2、fclose:关闭文件
3、fwrite:写数据,把内存的数据往文件中写数据(类似于输出)
4、fread:读数据,从文件中读数据到内存(类似于输入)
5、fseek:随机读写函数
一、文件类型指针
例如fopen打开
因为如上图,这些操作函数的返回值就是返回指向该文件的指针,所以叫文件类型指针
文件类型指针——就是FILE*,且下面的所有的文件操作函数都要用到FILE*
文件类型指针——对于文件的作用,就相当于学号——对于一个学生的作用,身份证号——对于一个公民(在一个国家进行所有生活行动的唯一凭证)的作用
是一个学生在学校里面的唯一凭证,一个学号唯一确定一个学生,找学号就是找学生
第一次打开一个新文件,它返回一个文件类型指针给你,之后你再要对这个文件进行所有的文件操作时,都必须通过这个文件类型指针来进行操作(例如:FILE*fp,之后要进行文件操作只写fp就好了)就好了
二、文件操作函数
1、fopen:打开文件
打开文件函数需要2个参数,一个是文件名,一个模式名
我们可以看到在文件操作函数里面并没有创建新文件函数fcreate什么之类的,
因为fopen兼职做了这项工作,fopen就有创建新文件的功能
易错注意点:
注意文件路径
因为如果是直接将我们在电脑打开的D盘,上面显示的路径,这里路径只有一个\
而我们创建新文件是写2个\
因为在C语言里面,一个\是转义字符的意思
可以打开看看如果是一个\,它显示的是什么
显示的并不是我们的文件,所以一个\是错误的写法
而2个\输出显示的就是我们正确的文件名,在电脑里面打开该文件显示的也是这样的文件名
所以当文件路径中本身就有一个反斜线时,此时我们就要写2个反斜线,
一个\是转义字符的意思,2个\表示‘\’反斜线这个字符本身
输出显示的文件路径还是只有一个\,
而fopen创建(用w)一个新文件除了上面的文件名,还有第二个参数,模式名
我们打开D盘,可以看到1.txt创建成功了
而上面fopen的返回值,一定要接收,后面的文件操作用到的就是接收的名字(例如fw)代替这个文件
所以创建文件的固定写法如下图
2、fclose:关闭文件
当文件用完时,必须要关闭文件(有些没有关闭,但程序结束了代码为0也会自动关闭)
不关闭文件,后面再打开使用文件可能就会打不开出错
fclose的参数只有一个,就是文件类型指针,也就是只用告诉它文件名
还有一点是,如下图这2句代码,前面用w创建一个新文件名为1.txt的文件,
打开1.txt文件,在里面编辑写入内容后,保存,fclose关闭该文件
但当我们再次执行第一句fopen命令时,此时打开的文件1.txt里面是空的,之前编辑保存的内容都没有了
这是因为“w”打开一个已经存在的文件时,那么该文件里面原先的数据内容则会被销毁掉
所以“w”每次打开的文件的内容都是空的,即w总是创建一个新文件
所以用w就是创建一个新文件
如果要继续往文件里面写入内容且不删除原先的内容,用a
3、fwrite:写数据:把内存的数据往文件中写数据(类似于输出)
其有4个参数,以下图为例
第一个指向要写入数据的指针就是:str
第二个每一次输入的字节大小,这里一次输入一个字节即一个字符的大小:sizeof(char)
第三个是总共写多少次,一次写一个字符,那么字符串的总长度就是写入项的最大数量:
strlen(str),这里strlen不包含\0
第四个是往哪个文件里面写,这里是文件类型指针:fw
打开1.txt文件,可以看到刚才写入的内容
这个是总共写入次数即项的最大数量是加上'\0'的
打开文件就变成了这样
上面NUL就是'\0',它显示的并不是'\0',因为'\0'是字符串的结尾标记,但在文件里面并不需要'\0'(因为'\0'是一个不可打印,在文件里面没有显示,不可见的字符),
如果你非要把它打印显示出来,一般也会是一个很丑的小黑块,这个NUL是一个字符,删除它只用点一下删除键就NUL全删了
'\0'——只对字符串重要有用,其他如文件都不重要
4、fread:读数据,从文件中读数据到内存(类似于输入)
读写字符的函数除了write,还可以用这2个
每次fopen打开一个文件,都要判断一下文件是否打开失败,看文件打开失败都有哪些原因
写打开失败——文件路径写错了
读打开正常
读打开失败——文件不存在,或文件路径错误
路径错误读打开失败
//从键盘输入一些字符,并逐个把它们送到磁盘上去,直到用户输入一个“#”为止
打开文件结果(中文有可能出现乱码显示的结果)
上面fwrite函数可以用fputc函数代替,但fputc仅仅只能用来输出字符
4、fread:读数据,从文件中读数据到内存(类似于输入)
从文件中读取字符串(读到内存来)
(所以第一个参数就是数据的存储位置,即读出来的数据要存放到哪个位置
可以定义一个字符串的数组buf来存放),
剩下3个参数跟fwrite写很像
(读和写参数类似,只是数据流向的方向是相反的)
读:外——内;写:内——外
将下图文件里的内容以读r的方式打开,然后将其读到屏幕上
执行完所有操作最后都是固定的fclose关闭文件
可以看到这个buf打印出来有问题
这里一路烫是因为我们前面说过的,在文件中,字符串的结尾并没有‘\0’
而buf是一个字符串数组,所以一个简单的办法就是把它写成——char buf[100]="";