一、文件的概念
凡是使用过文件的人对文件都不会感到陌生
文件用来存放程序、文档、音频、视频数据、图片等数据的。文件就是存放在磁盘上的,一些数据的集合。
在 windows 下可以通过写字板或记事本打开文本文件对文件进行编辑保存。写字板和记事本是微软程序员 写的程序,对文件进行打开、显示、读写、关闭。
作为一个程序员,必须掌握编程实现创建、写入、读取文件等操作
对文件的操作是经常要用到的知识,比如:写飞秋软件传送文件 等
1.文件的分类:
磁盘文件:(我们通常认识的文件)
指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。
设备文件:
在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、输出等同于 对磁盘文件的读和写。
键盘:标准输入文件 屏幕:标准输出文件
其它设备:打印机、触摸屏、摄像头、音箱等
在 Linux 操作系统中,每一个外部设备都在/dev 目录下对应着一个设备文件,咱们在程序中要想操作设备,就必须对与其对应的/dev 下的设备文件进行操作。
标准 io 库函数对磁盘文件的读取特点
文件缓冲区是库函数申请的一段内存,由库函数对其进行操作,程序员没有必要知道存放在哪里,只需要 知道对文件操作的时候的一些缓冲特点即可。
VS 中对普通文件的读写是全缓冲的。
全缓冲
标准 io 库函数 ,往普通文件读写数据的,是全缓冲的,刷新缓冲区的情况
1.缓冲区满了,刷新缓冲区
2.调用函数刷新缓冲区 fflush(文件指针)
3.程序结束 会刷新缓冲区
2.磁盘文件的分类:
一个文件通常是磁盘上一段命名的存储区
计算机的存储在物理上是二进制的,所以物理上所有的磁盘文件本质上都是一样的:以字节为单位进行顺序存储
从用户或者操作系统使用的角度(逻辑上)
把文件分为:
文本文件:基于字符编码的文件
二进制文件:基于值编码的文件
文本文件:
基于字符编码,常见编码有 ASCII、UNICODE 等
一般可以使用文本编辑器直接打开
例如:5678 的以 ASCII 存储形式为:
ASCII 码:00110101 00110110 00110111 00111000
二进制码文件:
基于值编码,根据具体应用,指定某个值是什么意思
一般需要自己判断或使用特定软件分析数据格式
例如:数 5678 的存储形式为:
二进制码:00010110 00101110
音频文件(mp3):二进制文件
图片文件(bmp)文件,一个像素点由两个字节来描述*****######&&&&&, 5 6 5
*代表红色的值 R
#代表绿色的值 G
&代表蓝色的值 B
二进制文件以位来表示一个意思。
文本文件、二进制文件对比:
译码:
文本文件编码基于字符定长,译码容易些;
二进制文件编码是变长的,译码难一些(不同的二进制文件格式,有不同的译码方式,一般需要特定 软件进行译码)。
空间利用率:
二进制文件用一个比特来代表一个意思(位操作);而文本文件任何一个意思至少是一个字符。
所以二进制文件,空间利用率高。
可读性:
文本文件用通用的记事本工具就几乎可以浏览所有文本文件
二进制文件需要一个具体的文件解码器,比如读 BMP 文件,必须用读图软件。
总结:
1、文件在硬盘上存储的时候,物理上都是用二进制来存储的。
2、咱们的标准 io 库函数,对文件操作的时候,不管文件的编码格式(字符编码、或二进制),而是 按字节对文件进行读写,所以咱们管文件又叫流式文件,即把文件看成一个字节流。
二、文件指针
文件指针在程序中用来标识(代表)一个文件的,在打开文件的时候得到文件指针,文件指针就用来代表咱们打开的文件。
咱们对文件进行读、写、关闭等操作的时候,对文件指针进行操作即可,即咱们将文件指针,传给读、写、关闭等函数,那些函数就知道要对哪个文件进行操作。
定义文件指针的一般形式为:
FILE * 指针变量标识符;
FILE 为大写,需要包含<stdio.h>
FILE 是系统使用 typedef 定义出来的有关文件信息的一种结构体类型,结构中含有文件名、文件 状态和文件当前位置等信息
一般情况下,我们操作文件前必须定义一个文件指针标识 我们将要操作的文件
实际编程中使用库函数操作文件,无需关心 FILE 结构体的细节 ,只需要将文件指针传给 io 库函数,库函数再通过 FILE 结构体里的信息对文件进行操作
FILE 在 stdio.h 文件中的文件类型声明:
在缓冲文件系统中,每个被使用的文件都要在内存中开辟一块 FILE 类型的区域,存放与操作文件相关的信息
对文件操作的步骤:
1、对文件进行读写等操作之前要打开文件得到文件指针
2、可以通过文件指针对文件进行读写等操作
3、读写等操作完毕后,要关闭文件,关闭文件后,就不能再通过此文件指针操作文件了
补充:
c 语言中有三个特殊的文件指针无需定义,在程序中可以直接使用
stdin: 标准输入 默认为当前终端(键盘)
我们使用的 scanf、getchar 函数默认从此终端获得数据
stdout:标准输出 默认为当前终端(屏幕)
我们使用的 printf、puts 函数默认输出信息到此终端
stderr:标准错误输出设备文件 默认为当前终端(屏幕)
当我们程序出错使用:perror 函数时信息打印在此终端
总结:
文件指针是个指针,它是个 FILE 类型结构体指针,用文件指针来标识一个文件。