1. 为什么使⽤⽂件?
2. 什么是⽂件?
3. ⼆进制⽂件和⽂本⽂件?
4. ⽂件的打开和关闭
5. ⽂件的顺序读写
6. ⽂件的随机读写
7. ⽂件读取结束的判定
8. ⽂件缓冲区
1.为什么使用文件
如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤ ⽂件
2.什么是文件?
磁盘(硬盘)上的⽂件是⽂件。 但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类 的)。
1.程序文件
程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)。
2.数据文件
⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件。 简单的来说,数据文件不就是存放数据的文件吗?
在以前各章所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显⽰到 显⽰器上。 其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处 理的就是磁盘上⽂件。
以前我们学习的都是直接是终端和终端,就是键盘输入后,直接在显示器上出现,但是有的时候我们需要先把数据输入到磁盘里面,等到需要的时候再拿出来,当需要到的时候就会把磁盘上的数据拿出读取到内存上使用
3.文件名
⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀 //例如: c:\code\test.txt。
为了⽅便起⻅,⽂件标识常被称为⽂件名。
3.二进制文件和文本文件
根据数据的组织形式,数据⽂件被称为⽂本⽂件和⼆进制⽂件。
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
10000存在磁盘的话,可能占据5个字节,也有可能占据四个字节如果把10000看成一个字符串的话,他就占据5个字节,但是如果你把10000当作一个整数来存储,他就占据4个字节。
4.文件的打开和关闭
1.流和标准流
2.标准流
读写文件的操作:
1.打开和文件相关的流
2.读或写文件
3.关闭流
这里面就涉及到了一个文件指针:FILE*pf,文件指针是用来访问文件的工具,他是一个直指向文件相关信息的指针。
⽂件指针
缓冲⽂件系统中,关键的概念是“⽂件类型指针”,简称“⽂件指针”。 每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名 字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系 统声明的,取名FILE.
这就是一个文件的文件信息区,我们可以通过指针变量能够间接的找到和他相关联的文件
当我们打开这个文件的时候,我们就可以获得一个指向这个文件的文件信息区的指针
文件的打开和关闭
文件在进行读写之前,我们先要打开文件,使用完后要关闭文件。
打开文件需要的函数fopen,这个很好理解,file open--文件打开,这个函数有两个参数
第一个参数指的是要打开的文件的文件名,第二个参数的含义是打开这个文件的方式
它的返回值是一个指针,文件指针。如果我们使用这个函数的话,如果他成功的打开了这个文件,那么他就会返回这个文件指针,这个指针便于后续的操作,但是如果打开文件失败了,他就会返回一个空指针,
要注意,这里的输入和输出,他都是站在程序的角度来进行的。
从文件到程序,从程序的角度来看,读r,他就是输入,写w,他就是输出
关闭文件要用到另外一个函数
这个函数的原型比较简单,他的参数就是一个指针,你要关闭那个指针,你就把那个指针传过来就可以。
这个fclose函数和free函数还是比较相似的,因为你把这个文件给他关闭了,但是我们要知道,他的这个文件指针指向的文件的文件信息区被关闭了,所以这个指针指向的东西没有了,他于是就变成立一个野指针,那么我们就可以把他置为一个NULL空指针。
这里我还要说的一点就是,当我们使用fopen函数的时候,这个函数会创建一个和被打开文件相关的文件信息区。然后pf文件指针会指向这个文件信息区。后续我们可以通过这个指针来操作文件。
5.文件的顺序读写
我们在这里还是要先明白一个概念,那就是他所说的r输入,和w输出,他们都是以程序为根本来说的,
这个函数应用于输出流,它有两个参数,第一个参数是我们要输出的(我们要往文件里面进行输出的字符),他是一个字符,对的,这个函数,一次只能输入一个字符,第二个参数,它指的是要输入的流,也即是要输入的文件,但是他是一个指针类型,就是说,他的输入是一个文件指针。
首先还是先判断我们的这个文件是否打开成功了,看看他是不是空指针。然后用fputc来写文件。
这个函数是用来读文件的,它的作用是把文件里面的数据读取到程序中来。输入r,他的参数只有一个,那就是文件指针。
这个函数和fputc函数一样,他们都是只能读取一个字符。
有人可能会说,这个函数的返回值能不能使用char类型来进行接受。
答案是不行的,因为他虽然读取的是字符,但是在进行读取的时候,总会有读取结束的时候,这时候读取到的就是EOF,EOF的值为-1,这时候使用char是不能区分的。
接下来我们再来说一个输出的函数,fputs,他和fputc函数是非常类似的,但是,fputc函数一次性只能输入一个字符,但是fputs函数一次性可以输出一个字符串。
这个函数的参数有两个,第一个参数是一个字符串,第二个参数是文件指针,第一个参数是指针类型的,我们只需要把一个字符函数的首元素地址传过来就可以,这个指针虽然里面存储的是字符串的首元素的地址,但是这个指针可以代表这个字符串。
接下来,我们再来介绍一个函数,这个函数表示的是读取函数,它可以一次性读取一行的字符。
他的第一个参数是一个字符数组,是用来存储我们读取到的字符串,num-1表示的是读取到的字符的个数,因为你还要留出来一个位置来存放\0;,最后一个参数是指一个指针,这个指针应给是被fopen打开的文件。
你这里写10个,他只会读取9个字符,最后一个字符用来存储\0.
这个函数的返回指向str指针。
下来我们讲一个函数fprintf,其实他和printf函数是非常相似的,但是fprintf主要的作用是往文件里面输入数据,他的参数只比printf函数多了一个参数,那就是文件指针,他的主要作用还是输出,把程序里面的数据输出到文件里面。只是前面多了一个文件指针的参数。
有fprintf就一定有fscanf。fscanf函数和scanf函数也是非常相似的,他的参数也是只比scanf函数多了一个参数,那就是文件指针,它的作用和fprintf函数的作用相反,他是输入,把数据从文件向程序里面进行输入。
看这个图片。我们在一开始的时候,给这几个变量设置的就是0,但是我们之前已经从程序输出数据到文件里面了,现在我们要把数据输入到程序里面。fscanf。
接下来我们再将两个函数,fwrite和fread。这两个函数也是用来进行输入和输出的,而且对象也还是文件,我们先来看第一个函数的参数,第一个函数是写,它有四个参数,第一个参数是我们要写的数据,第二个参数是我们要写的数据中元素的大小,单位是字节,第三个参数是元素的个数,size_t类型的参数。
我们来看这个函数,因为已经明确的强调了,它是以二进制的形式来进行书写的,所以当他写入文件的时候,在文件里面的形式是二进制,我们是看不懂的。但是我们可以把他从文件里面输入到程序里面,这样我们就可以看得懂了。这两个函数的参数都是一样的,但是fread函数得的第一个参数表示的是读取到的数据存放的位置。但是还是一样的,参数都是一样的。
但是,我们的这个函数他只能读取二进制信息,我们的这个函数才能读取,你必须放进去的就是二进制的信息,我们才能读出来。如果你放进去的是文本信息,那我们的·这个函数是不能读取的。
另外再解释一组函数:
sprintf函数它的作用是把格式化的数据转换成字符串,他的第一个参数是一个指针,我们把格式化的数据转换成字符串之后,储存在这个数组里。
sscanf函数的作用和sprintf函数的作用是刚好相反的,sscanf函数他会把字符串按照格式提取到变量中。
总结一下就是:sprintf函数就是把格式化的数据转化为字符串储存起来,而sscanf函数就是从字符串中把数据提取到变量中去。
我们来看这张图,我们就是先把数据转换成字符串储存到buff里面,我们最后再把buff里面的数据又重新转换为格式化变量输出。
6.文件的随机读写
第一个函数fseek函数,这个函数可以调动文件指针的位置,使得程序在文件内部灵活的读取或者写入文件。这个函数有三个参数,第一个参数是我们操作的对象,也就是文件指针,第二个参数是偏移量,这个参数的值要和第三个参数结合起来使用,他是相对于第三个参数的位置的偏移量,第三个参数:
他可能是在文件的开始,也可能是在文件的指针当前的位置,也可能是文件的末尾。
我们可以使用这个函数来改变我们的指针的位置让我们可以自由的读取或者写入程序
7.文件读取结束的判定
feof函数这个函数是用来文件指针是否达到了文件末尾,如果文件指针达到了文件末尾,feof函数就返回一个非0值1,但是如果指针没有到达文件末尾,他就会返回0值。
我们来看看这个代码,他在开始的时候还是先常规的打开文件,r读文件,把文件中的数据输入到程序中,我们要写入一段数据,但是我们不知道是么时候这段数据是什么时候结束的,因为我们使用的是getc函数,这个函数一次只能读入一个字符,所以我们想要读取数据,我们是要使用一个循环来进行的,我们把feof函数放到while函数的判断,因为这个函数在数据结束的时候会返回非0的数字,
其实最常用的还是使用fgetc函数来进行判断
标签:文件,读取,函数,参数,操作,我们,指针 From: https://blog.csdn.net/daiwoliyunshang/article/details/143990196