一、文件的概念
文件用来存放程序、文档、音频、视频数据、图片等数据的。
文件就是存放在磁盘上的,一些数据的集合。
在windows下可以通过写字板或记事本打开文本文件对文件进行编辑保存。写字板和记事本是微软程序员写的程序,对文件进行打开、显示、读写、关闭。
作为一个程序员,必须掌握编程实现创建、写入、读取文件等操作。
对文件的操作是经常要用到的知识,比如:传送文件等。
1.1 文件的定义
- 磁盘文件:(我们通常认识的文件)
指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。 - 设备文件:
在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、输出等同于对磁盘文件的读和写。
- 键盘:标准输入文件
- 屏幕:标准输出文件
- 其它设备:打印机、触摸屏、摄像头、音箱等
在Linux操作系统中,每一个外部设备都在/dev目录下对应着一个设备文件,咱们在程序中要想操作设备,就必须对与其对应的/dev下的设备文件进行操作。
标准io库函数对磁盘文件的读取特点:
文件缓冲区是库函数申请的一段内存,由库函数对其进行操作,程序员没有必要知道存放在
哪里,只需要知道对文件操作的时候的一些缓冲特点即可。
行缓冲
标准io库函数,往标准输出(屏幕)输出东西的时候是行缓冲的。
所谓的行缓冲就是缓冲区碰到换行符的时候才刷新缓冲区。
如果不刷新缓冲区,无法对文件执行读写操作。
行缓冲的刷新条件:
#include <stdio.h>
int main(int argc, char const *argv[])
{
//由于printf函数是一个标准io,所以只有刷新缓冲区才可以将数据输出到终端
//printf("hello world");
//刷新缓冲区方法1:使用\n
//printf("hello world\n");
//刷新缓冲区方法2:程序正常结束
//printf("hello world");
//return 0;
//刷新缓冲区方法3:使用fflush函数刷新缓冲区
//printf("hello world");
//fflush:刷新函数。可以刷新指定的缓冲区
//stdout:标准输出,就是对终端进行写操作
//fflush(stdout);
//刷新缓冲区方法4:当缓冲区满的时候自动刷新
//默认行缓冲的大小为1024个字节
int i;
for(i = 1; i < 300; i++)
{
printf("%03d ", i);
}
while(1)
{
}
return 0;
}
全缓冲
标准io库函数 ,往普通文件读写数据的,是全缓冲的,碰到换行符也不刷新缓冲区,即缓冲区满了,才刷新缓冲区。
刷新缓冲区的情况:
- 缓冲区满了,刷新缓冲区
- 人为刷新缓冲区 fflush(文件指针)
- 程序正常结束 会刷新缓冲区
无缓冲
在读写文件的时候通过系统调用io (read write),对文件进行读写数据时,是无缓冲的,即写数据会立马进入文件,读数据会立马进入内存。
写文件的流程
应用程序空间 - 内核空间 - 驱动程序 - 硬盘上。
应用程序和内核程序运行在不同的空间里,目的是为了保护内核。
设置缓冲区的目的
通过缓冲可以减少进出内核的次数,以提高效率。
1.2 磁盘文件的分类
一个文件通常是磁盘上一段命名的存储区。
计算机的存储在物理上是二进制的,所以物理上所有的磁盘文件本质上都是一样的:以字节为单位进行顺序存储。
从用户或者操作系统使用的角度(逻辑上)把文件分为:
4. 文本文件:基于字符编码的文件
5. 二进制文件:基于值编码的文件
文本文件
基于字符编码,常见编码有ASCII、UNICODE等。一般可以使用文本编辑器直接打开。
例如:
数5678的以ASCII存储形式为:
ASCII码:00110101 00110110 00110111 00111000
歌词文件(lrc):文本文件
二进制码文件
基于值编码,自己根据具体应用,指定某个值是什么意思。把内存中的数据按其在内存中的存储形式原样输出到磁盘上,一般需要自己判断或使用特定软件分析数据格式。
例如:
数5678的存储形式为:
二进制码:00010110 00101110
音频文件(mp3):二进制文件
图片文件(bmp)文件,一个像素点由两个字节来描述*****######&&&&&
*代表红色的值,#代表绿色的值,&代表蓝色的值,二进制文件以位来表示一个意思。
文本文件、二进制文件对比:
- 译码:
文本文件编码基于字符定长,译码容易些;
二进制文件编码是变长的,译码难一些(不同的二进制文件格式,有不同的译码方式)。 - 空间利用率:
二进制文件用一个比特来代表一个意思(位操作);
而文本文件任何一个意思至少是一个字符。
二进制文件,空间利用率高。 - 可读性:
文本文件用通用的记事本工具就几乎可以浏览所有文本文件。
二进制文件需要一个具体的文件解码器,比如读BMP文件,必须用读图软件。
总结一下:
文件在硬盘上存储的时候,物理上都是用二进制来存储的。
咱们的标准io库函数,对文件操作的时候,不管文件的编码格式(字符编码、或二进制),而是按字节对文件进行读写,所以咱们管文件又叫流式文件,即把文件看成一个字节流。