1.什么是文件?
文件名包含3部分:文件路径+文件名主干+文件后缀
例如:c:\code\test.txt
2.文件的打开和关闭
注:文件读写之前应该先打开文件,使用结束后应该关闭文件
如上图,fopen的参数1是要打开的文件名,参数2是打开方式。fclose的参数是要关闭的文件名。
我们在打开或者新建文件时,要判断是否成功,如果返回了NULL(即失败),则显示错误信息。
在使用完文件后记得关闭文件,并且将指针置为NULL,否则就是野指针。(因为fp指针指向空间已经被释放了)。
3.文件的顺序读写
如下图,是顺序读写函数
该函数就是将字符写到流里面去
如上图,当我们运行后,打开文本会发现,已经将abc放到文件中。注意:FILE指针指向起始位置,每一次写完一个字符,光标的位置就会发生变化,就会往后移。但是pf是不会变的。
而fgetc就是与fputc一一对应的函数
fgetc
返回值:如果成功,返回字符的ASCII码值,失败则返回EOF.
如上图就是读取了刚才通过fputc来输入的值。
fgets:
可以看到与fputc相比就是能一次性打印出多个字符即字符串。
fgets:
他有3个参数,参数1是要存放的字符数组str,参数2是读入一个长度为num-1的字符串,参数3是pf指向的文件。例子如下图:
它只会读取前n-1个字符,然后在最后加一个\0
fprintf:fprintf函数与printf函数的参数区别在于它多了一个指向文件的指针,直接看下图:
fscanf:
如下图,scanf函数就是从键盘读取,fscanf函数就是从文件从读取。他的用法跟fprintf相似,都只是在前面多个一个参数。
fwrite:
他有4个参数,参数1是指向要写入的元素数组的指针,参数2是写入的每个元素的大小(字节为单位),参数3是元素的个数,参数4是指向文件的指针。
运行后,打开文件,发现内容都是看不懂的符号,这是因为这是以二进制的形式输出的。
fread:
他的参数跟fwrite一模一样,只不过和fwrite是相反的作用。
如图,fread把文件中的二进制信息读取后放到了arr数组中,并用printf打印出来
前面两个已经很熟悉了,第二组刚才也介绍了。
就剩下最后一组了
即从一个字符串读一个格式化数据
即把格式化数据转换成字符串
sprintf只是在前面多了一个参数。它把格式化的数据放到了字符串中。
sscanf也类似,不过它是将字符串中的内容放到了后面的地址中
4.文件的随机读写
fseek的参数1是指向文件的指针,参数2是移动的步数,参数3是下方三个之一。如上图,当我们想把光标移到文件的开头时,就可以通过fseek移动。
从上到下分别是文件开头,文件指针的当前位置,文件结束
这是一开始文件的内容,利用fseek函数来对同一内容进行自己想要的内容
rewind函数会让文件指针的位置回到文件的起始位置,它也只有一个参数。
5.⽂件读取结束的判定
被错误使用的feof
牢记:在文件读取过程中,不能用feof函数的返回值直接判断文件的读取是否结束。
feof的作用是:当文件读取结束时,判断读取结束的原因是否是:遇到文件尾结束。
ferror——在文件读取结束后,用来判断文件是否因为读取过程中遇到错误而结束。
feof——在文件读取结束后,用来判断文件是否因为读取过程中遇到文件结束标志而结束。
如上图,当遇到文件结束标志而结束时,则feof为真。
如果ferror返回值为0(假),表示为出错。如果返回一个非零值,表示未出错。
6.文件缓冲区
从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。从磁盘到内存的方式也是这样。大致关系如下图:
刷新缓冲区可以用fflush()函数,参数是指向文件的指针。刷新缓冲区时,才将输出(读入)缓冲区的数据到文件(内存)。