文件
文件概念
凡是使用过文件的人对文件都不会感到陌生,文件是用来存放程序、文档、音频、视频数据、图片等数据的。文件就是存放在磁盘上的一些数据的集合。
程序文件
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj)可执行程序(windows环境后缀为exe)。
数据文件
文件的内容不一定是程序,而是程序运行时读写的数据。比如程序运行需要从中读取数据的文件,或者输出内容的文件。
文件名
一个文件要有一个唯一的文件标识便于用户识别和引用。文件名包含3部分:文件路径+文件名+文件后缀
例如:C:\code\test.txt
文件类型
根据数据的组织形式,数据文件被称为文本文件或二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是进制文件。如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符形式存储的文件就是文本文件。
一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据可以用ASCII形式存储,也可以使用二进制形式存储。
例如整数10000,如果以ASCII码形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出则磁盘只占4个字节。
文本文件
基于字符编码,常见的编码有ASCII、UNICODE等。一般可用文本编辑器打开
二进制码文件
基于值编码,自己根据具体应用,指定某个值是什么意思,把内存中的数据按其在内存中的存储形式原样输出到磁盘上,一般需要自己判断或使用特定软件分析数据格式。
文件的三种缓存方式
行缓冲
标准io库函数,往标准输出(屏幕)输出东西的时候是行缓冲的,所谓的行缓冲就是缓冲区碰到换行符的时候才刷新缓冲区,如果不刷新缓冲区,将无法对文件执行读写操作
全缓冲
标准io库函数,往普通文件读写数据的时候,是全缓冲的。碰到换行符也不刷新缓冲区,即缓冲区满了,才刷新。
三种刷新缓冲区的情况:1. 缓冲区满了 、 2.人为的刷新缓冲区flush(文件指针)、3.程序正常结束会刷新缓冲区
无缓冲
在读写文件的时候通过系统调用io,对文件进行读写数据这个时候是无缓冲的,即数据会立马进入文件,读数据也会立马进入内存。
设置缓冲区作用
通过缓冲可以减少进出内核的次数,可以提高效率。
文件指针形式
定义文件指针的一般形式为:
FILE * 指针变量标识符;
体质上文件指针是一个结构体指针,结构体中包含了当前文件的很多信息,但是在实际编程时,不需要
关系结构体中的成员,只需要使用文件指针即可
FILE为大写,需要包含<stdio.h>
FILE是系统使用typedef定义出来的有关文件信息的一种结构体类型,结构中含有文件名、文件状态和文
件当前位置等信息一般情况下,我们操作文件前必须定义-一个文件指针标示我们将要操作的文件
实际编程中使用库函数操作文件,无需关心FILE结构体的细节,只需要将文件指针传给io库函数,库函
数再通过FILE结构体里的信息对文件进行操作
FILE在stdio.h文件中的文件类型声明:
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
注:在缓冲文件系统中,每个被使用的文件都要在内存中开辟一块FILE类型的区域,存放与操作文件相关的信息
对文件操作的步骤
1、对文件进行读写等操作之前要打开文件得到文件指针
2、可以通过文件指针对文件进行读写等操作
3、读写等操作完毕后,要关闭文件,关闭文件后,就不能再通过此文件指针操作文件了
三个特殊的文件指针
c语言中有三个特殊的文件指针无需定义,在程序中可以直接使用
stdin: 标准输入 默认为当前终端 (键盘)
我们使用的scanf、getchar 函数默认从此终端获得数据
stdout: 标准输出默认为当前终端 (屏幕)
我们使用的printf、puts 函数默认输出信息到此终端
stderr: 标准错误输出设备文件默认为当前终端 (屏幕)
当我们程序出错使用:perror函数时信息打印在此终端