1 文件概述
文件是计算机操作系统中用于存储数据的一种重要构造。在物理层面,文件通常存储在硬盘、闪存或其他持久性存储介质上。在逻辑层面,文件是由一系列记录(如字符、字节、数据块等)组成的,这些记录按一定的格式和顺序排列,用于存储程序或数据。
文件具有以下基本特性:
-
文件名:每个文件都有一个唯一的名称,用于标识和引用该文件。文件名通常由字母、数字、下划线和特定字符组成,并遵循操作系统规定的命名规则。
-
文件类型:文件可以根据其内容或用途进行分类,如文本文件、二进制文件、图像文件、音频文件等。不同的文件类型有不同的存储格式和处理方式。
-
文件大小:文件大小是指文件占用的存储空间大小,通常以字节(Byte)为单位表示。文件大小取决于文件内容的多少和存储格式。
-
文件位置:文件在存储介质上的位置由操作系统管理。每个文件都有一个唯一的地址或路径,用于定位该文件在文件系统中的位置。
-
文件属性:文件通常具有一些属性,如创建时间、修改时间、访问权限等。这些属性描述了文件的元数据,可以帮助用户或操作系统更好地管理文件。
-
文件操作:用户或程序可以通过一系列的文件操作来访问和管理文件,如创建文件、打开文件、读取文件内容、写入数据到文件、关闭文件、删除文件等。这些操作通常由操作系统提供的文件系统接口实现
文件可以根据其内容和用途进行多种分类。以下是几种常见的文件分类方式:
-
按内容分类
-
文本文件:
-
纯文本文件:只包含基本的ASCII或Unicode字符,没有特殊的格式或编码。
-
源代码文件:如C语言的
.c
文件,Python的.py
文件等,包含程序员的源代码。 -
富文本文件:如Markdown、RTF或HTML文件,它们支持格式化的文本,如字体、颜色、列表等。
-
-
二进制文件
-
可执行文件:如Windows下的
.exe
文件或Unix/Linux下的无扩展名可执行文件,它们包含可以直接由计算机执行的机器代码。 -
图像文件:如
.jpg
、.png
、.gif
等,用于存储图像数据。 -
音频和视频文件:如
.mp3
、.wav
、.mp4
等,用于存储音频和视频数据。 -
数据文件:如数据库文件、配置文件等,包含特定格式的二进制数据。
-
-
-
按用途分类
-
系统文件:
-
操作系统文件:用于支持操作系统运行的必要文件,如内核、驱动程序等。
-
配置文件:用于存储程序或系统的配置信息,如Windows的
.ini
文件或Linux的配置文件。
-
-
用户文件:
-
文档文件:如Word文档、PDF文件等,用于存储文本、图像等信息。
-
数据文件:用于存储特定应用程序的数据,如电子表格、数据库文件等。
-
-
-
按访问权限分类
-
只读文件:用户只能读取文件内容,不能修改或删除文件。
-
写入文件:用户可以向文件写入数据,但通常不能读取已存在的数据(除非文件被打开为读写模式)。
-
读写文件:用户既可以读取文件内容,也可以向文件写入数据。
-
-
按存储位置分类
-
本地文件:存储在本地计算机硬盘或其他存储设备上的文件。
-
网络文件:存储在网络服务器或云存储上的文件,可以通过网络访问。
-
2 文件指针
文件指针在C语言中是一个核心概念,用于指向打开的文件,从而实现对文件的读写操作。它实际上是一个指向FILE结构体的指针,这个结构体包含了文件的各种信息,如文件缓冲区、当前读写位置等。
文件指针的主要作用包括:
-
标识文件:通过文件指针,程序可以识别和操作特定的文件。一旦文件被打开,文件指针就被关联到该文件上,后续的所有文件操作(如读取、写入)都将通过这个指针进行。
-
定位文件位置:文件指针还用于跟踪文件中的当前位置。在读取或写入文件时,文件指针会自动移动,指向下一个要读取或写入的位置。如果需要从文件的特定位置开始操作,可以通过移动文件指针来实现。
-
错误检测:通过检查文件指针的状态,程序可以检测文件操作是否出错。例如,如果尝试打开一个不存在的文件,文件指针可能会返回NULL,表示操作失败。
文件指针定义的语法格式:
FILE *文件指针变量;
其中,FILE结构体的具体定义并不直接暴露给程序员,因为是一个由标准库实现的内部类型,它的确切定义可能会因不同的C标准库实现而有所不同。这样做是为了允许标准库实现者根据特定的系统或平台特性进行自定义和优化。
FILE在stdio.h文件中的文件类型声明:
typedef struct
{ short level; // 缓冲区“满”或“空”的程度
unsigned flags; // 文件状态标志
char fd; // 文件描述符
unsigned charhold; // 如无缓冲区不读取字符
short bsize; // 缓冲区的大小
unsigned char *buffer; // 数据缓冲区的位置
unsigned char *curp; // 指针,当前的指向
unsigned istemp; // 临时文件,指示器
short token; // 用于有效性检查
}FILE;
虽然不能直接看到FILE
的定义,但你可以大致了解它通常包含的内容。FILE
结构体通常包含以下信息:
-
一个指向文件缓冲区的指针,用于存储待读取或待写入的数据。
-
文件位置指示器,用于跟踪文件中的当前读写位置。
-
标志位,用于表示文件的状态(如是否出错、是否已到文件末尾等)。
-
可能还有其他与特定实现相关的字段。
扩展,c语言中有三个特殊的文件指针无需定义,在程序中可以直接使用
-
stdin: 标准输入 默认为当前终端(键盘),例如,scanf、getchar函数默认从终端获得数据
-
stdout:标准输出 默认为当前终端(屏幕),例如,printf、puts函数默认输出信息到终端
-
stderr:标准错误输出设备文件 默认为当前终端(屏幕),例如,perror函数默认输出程序错误信息到终端