0x01 文件简介
文件可以分为普通文件和设备文件。
普通文件存储在磁盘等外部设备中,需要时读入内存中。
设备文件,将外部设备也看作一个文件来进行管理,对外部设备的输入输出也等同于对文件的读写。
0x02 文件系统
文件系统是指操作系统中用于组织和管理磁盘上文件的方法和数据结构,其负责文件的读取,修改,存储等等操作。
Windows 上常见的文件系统有 FAT、NTFS;Linux 上常见的文件系统有:Ext2-4;Solaris 上的文件系统是:ZFS(128 bit 的文件系统)
VFS 即 Virtual File System (虚拟文件系统),它定义了所有文件系统都支持的基本接口、数据结构,使得对于用户而言,无论是何种文件系统,都有同一的接口、调用方式。
0x03 文件类型
从编码的角度来看,文件可以分为文本文件和二进制文件。
文本文件是基于字符集的编码,用固定长度的二进制序列,用相应的字符集进行编码、解码。如我们常见的 .txt 文件、.c 文件
二进制文件是基于值编码的文件,其二进制序列的编码长度是变长,由文件格式决定,一般需要专门的软件打开。如图片文件,exe 文件,.md 文件
0x04 文件打开
在 C 语言中可以使用 fopen () 来打开文件,其中的文件路径可以使用绝对路径也可以使用相对路径。打开方式可以根据参数来决定。
- r (read): 读
- w (write): 写
- a (append): 追加
- t (text): 文本文件,可省略不写
- b (banary): 二进制文件
- +: 读和写
r | 为输入操作打开文件,文件必须存在。 |
---|---|
w | 为输出操作创建一个空文件,如果文件已存在,则将已有文件内容舍弃,按照空文件对待。 |
a | 为输出打开文件,输出操作总是再文件末尾追加数据,如果文件不存在,创建新文件。 |
r+ | 为更新打开文件(输入和输出),文件必须存在 |
w+ | 为输入和输出创建一个空文件,如果文件已存在,则将已有文件内容舍弃,按照空文件对待。 |
a+ | 为输出打开文件,输出操作总是再文件末尾追加数据,如果文件不存在,创建新文件。 |
fopen (const char * filename, const char * mode) 也是一个不安全的函数,所以后面推出了新的安全文件打开函数 fopen_s( &pflie , filename , mode) ,pflie ,就是文件打开的指针。当函数返回值为 0 时表示文件成功打开。
0x05 文件读写
文件的读写可以使用以下函数:
fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
//参数依次为:写入内容存储位置、写入元素大小(byte)、元素的个数、文件对象的指针
fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//参数依次为:读取内容存储位置、读取元素大小(byte)、元素的个数、文件对象的指针
fprintf(FILE *stream, const char *format, ...);
//参数依次为:文件对象的指针、格式化的字符串、(...)为格式化内容
fscanf(FILE *stream, const char *format, ...);
//参数依次为:文件对象的指针、格式化的字符串、(...)为读取格式化内容的存储变量
fgetc(FILE *stream);
//一次读取一个字符,且指标向后移一位,移动到结尾返回值为 NULL ,参数为:文件对象指针
fputc(int char, FILE *stream);
//参数依次为:被写入的字符(以 int 值进行传输)、文件对象指针
fgets(char *str, int n, FILE *stream);
//一次读取一行,参数依次为:存储字符的数组、最大字符长度(包括\0)、文件对象指针
fputs(const char *str, FILE *stream);
//一次写入一行,参数依次为:写入的字符串、文件对象指针
0x06 读写指针
对文件进行读写时,有一个指针,是类似于图形化操作页面中光标的存在,叫读写指针,用于对文件进行读写的位置定位。
对于读写指针的位置,我们可以通过一些函数进行操作。
rewind(FILE *stream); //移动到文件的开头
fseek(FILE *stream,long int offset,int whence);
/*
*将读写指针移动到指定位置
*参数依次为:文件对象指针、相对 whence 的偏移量、读写指针的位置
*读写指针位置有以下常量:
*SEEK_SET:文件的开头
*SEEK_CUR:文件指针的当前位置
*SEEK_END:文件的末尾
*/
ftell(FILE *stream) //返回当前读写指针位置