文件操作及相关函数

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就是流

代码举例:

      

        那么关于文件操作基础就讲解完了,更多的内容各位可以自行去了解,如文件的随机读写,这篇关于文件操作的就讲到这里,各位下一篇见~!

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值