1.为什么使用文件
一般情况下,我们写的程序的数据都是存储在电脑的内存中的,只要程序一退出,内存回收,数据就会丢失。
而当我们把数据放到硬盘中(文件中),会持久化保存。
2.什么是文件?
放在硬盘中的数据集,就叫文件。
文件有两种:程序文件 , 数据文件
2.1程序文件
程序文件中包括:源程序文件(后缀为.c)
目标文件 (windows环境后缀为.obj)
可执行文件(windows环境后缀为.exe)
2.2 数据文件
文件里面的内容不一定是程序,而是程序运行时的数据,比如:程序运行时需要从中读取数据的文件,或者输出内容的文件。、
在以前处理数据的输入输出都是以终端为对象的,即从终端的键盘上输入数据,运行结果显示在显示器中。
有时我们会把信息输入到磁盘当中,需要时再从中读取数据到内存中使用,处理的就是磁盘上的磁盘上的文件。
2.3 文件名
文件名一般由三部分组成:文件路径 + 文件名主干 + 文件后缀
例:c:\code\test.txt
为了方便起见,这些文件标识被称为文件名
3.二进制文件和文本文件
数据文件又分为 文本文件 和 二进制文件
数据在内存中以二进制进行存储,如果不加转换输出到外存的文件中,就是二进制文件。
数据在外存中如果要用ASCII码来存储,就需要在存储前进行转换,以ASCII码值的形式存储的文件就叫做文本文件。
二进制文件 = 后缀为.obj,用文本编译器查看时是一堆乱码
文本文件 = 后缀为.txt,可以用文本编译器查看
那一个数据在内存中是怎么存储的呢?
字符一律用ASCII码值的形式存储,数值性可以用ASCII码值存储,也可以用二进制存储。
如有整数10000.如果以ASCII码值的形式输出到磁盘,则磁盘中占用5个字节,但如果以二进制的形式输出到磁盘,则在磁盘中只占4个字节。
4.流和标准流
4.1 流
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部的输入和输出操作各不相同,为了方便程序员对各种设备进行操作,我们便抽象出了流的概念,在C程序中,针对文件、画面、键盘等数据的输入输出都是通过流进行的。
一般情况下,向流里 写 或者 读取数据 ,都是要打开流,然后操作。
4.2 标准流
那为什么我们从键盘上输入(scanf)数据 ,向屏幕输出 (printf)数据,并没有打开流呢?
那是因为C语言在程序启动时,默认打开了三个流
。stdin : 标准输入流,在大多数环境中从键盘输入,如:scanf
。stdout: 标准输出流,在大多数环境中输出至显示界面,如:printf
。stderr : 标准错误流,大多数环境中输出到显示器界面
这是C语言默认打开的三个流,我们使用scanf,printf便可以直接进行输入输出操作
这三个流(stdin , stdout ,stderr)类型是 FILE* ,通常称为文件指针
文件指针就是用来维护流的各种操作的
4.3文件指针
每个被使用的文件都在内存中有一个相应的文件信息区,用来存放文件的名字,文件的状态和文件的当前位置,这些信息是保存在一个结构体变量中的。该结构体类型由系统声明,取名FILE,而这些FILE都是放在FILE*(文件指针),我们可以通过FILE*去找到FILE,然后找到与其关联的文件
FILE*类型
5.文件的打开和关闭
当我们在读写文件时,第一步就是要打开文件,然后对其操作,最后再关闭文件
ANSI C 规定使用 fopen 来打开文件,fclose 关闭文件。
fopen函数有 两个参数:
1. filename : 就是要打开文件的名字,例如:
2.mode : 就是要打开的方式,我们打开文件就是为了对里面的数据进行操作,那怎么知道我是要读,还是要写呢?让我们看看下面的图片
后面在代码中会提到。
如果文件打开成功,会返回一个指向FILE对象的指针,如果失败就返回NULL。
fclose函数只有一个参数,返回值是int,如果关闭成功就返回0,如果失败就返回EOF.
文件的打开和关闭
6.文件的顺序读写函数
6.1文件的顺序读写函数介绍
。标准输入输出流 : 通过C语言默认的3个流,直接进行输入输出操作
。文件输入输出流 : 需要通过文件来进行输入输出操作
让我们来一一认识一下这些函数
1.fputc函数
参数及返回值
fputc是字符输出函数,函数有两个参数
。第一个参数是要输出的字符,如:‘a’,‘b’,‘c’,那这里有人可能会好奇了,这里的字符不是char吗,为什么第一个参数是int类型,这个是因为字符在输出时会先转化成ASCII值,而ASCII码值是整数,所以用int类型来接收。
。第二个类型是要输出的流,就是把第一个参数的字符输出到你所打开的流中
如果成功输出,就返回所输出的值,如果失败,就返回EOF
代码示例:
这里输出了一个字符a到文件里面,那如果我想从 'a' 输出到 'z' 怎么办,使用循环就可以了。
代码示例:
fputc函数的介绍就这些,那我们往外存中输出字符了,怎么把它又输入到程序中进行打印呢?那就要用到另一个函数 “fgetc”
2.fgetc函数
参数及返回值
fgetc函数只有一个参数,就是输入(读取)你所打开的流中的数据到程序中,返回类型是int,如果读取成功,返回的是读取到的值,如果读取失败就返回EOF.
代码示例:
也可以通过循环全部打印,代码示例:
介绍完字符的输入输出函数之后,我们接着看文本行的输入输出函数
3.fputs函数
与fputc函数基本相同,只不过第一个要传的参数从字符变成了字符串,成功的话,返回输出的值,如果失败就返回EOF
代码示例:
那如果我们同时输出两三个字符串,它是在输出到一行还是多行呢?
如果我们同时输出几个字符串,会默认在同一行内,如果想输出多行,加个 \n 就可以了。
4.fgets函数
fgets函数是用来输入字符串的函数,一共有三个参数:
第一个参数str :指向字符数组的指针,用来存放从流中读取的字符串
第二个参数num : 用来指定要复制到str中最大的字符数
第三个参数stream : 就是流,从中读取数据放到str中
如果成功,函数返回str,如果失败,函数会返回NULL指针
代码示例:
用循环读取:
在文本文件中,我们存放了hello word和hello bit 两个字符串,第一个字符中,如果我想要读取的数据是10个呢?hello word加上空格一共是10个字符刚刚好,那我们运行看看会出现什么现象
这里我们可以看到,不是10个字符吗?怎么只有九个呢?让我们调试看一看
这里我们观察到,这个函数虽然可以规定要读取的大小num个,但我们读取时,只能读取num-1 个, 最后一个字符用来补上\0
那如果我存一个字符串叫做hello,但我要读取10个字符会是什么情况呢?
所以当读取的字符串个数不满足所要求的个数时,会连换行符号(\n)也一并读取
关于这些函数更多的就不细说了,后续可以去了解一下
5.fprintf函数
fprintf是格式化输出函数,什么是格式化呢?通俗点讲其实就是我们平常scanf 输入 和 printf 输出时常用的%形式的就叫做格式化。
第一个参数 stream : 指向流的FILE 对象的指针
第二个参数 format : 把字符串以格式化的形式写入流中
如果成功,函数将返回所写入的字符总数,如果失败,则设置错误指示符
代码举例:
6.fscanf函数
fsacnf函数跟fprintf函数基本相同,只不过fprintf函数是将格式化的数据写入到流中,而fscanf函数是从流里面先读取数据,再以格式化的形式拿出来。
代码举例:
7.fwrite函数
fwrite函数是二进制输出函数,一共有四个参数
第一个参数ptr :所要写入的数据,把他存进任意数组里面,然后给一个指向数组首元素的指 针
第二个参数size :数组一个元素的大小,单位是字节,如:int类型就是4个字节
第三个参数count:数组里面元素的个数
第四个参数就是流
代码示例:
二进制文件是没有办法正常打开的,所以需要用二进制编辑器来打开
如果使用记事本打开,就是一堆乱码
8.fread函数
fread函数是关于文件顺序读写中的字后一个函数 fread函数有四个参数
第一个参数ptr : 指针指向大小至少为(size*count)字节的内存块,用来存放读取出来的数据
第二个参数size : 要读取的每个元素的大小(以字节为单位),size_是一个无符号整数类型
第三个参数count:要读取的元素个数
第四个参数stream就是流
代码举例:
那么关于文件操作基础就讲解完了,更多的内容各位可以自行去了解,如文件的随机读写,这篇关于文件操作的就讲到这里,各位下一篇见~!