Linux上一切皆文件,我们现在来学习如何处理文件,处理文件有两种方式,一种是利用库函数,一种是系统调用,那我们首先来学习一下库函数。
文章目录:
一、库函数基础概念
1. 库函数:库函数(Library function)是把函数放到库里,供别人使用的一种方式。方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。调用的时候把它所在的文件名用#include<>加到里面就可以了。一般是放到lib文件里的。不受平台限制。
2. 流:对于标准的C函数库,文件操作都是围绕着流来进行的,流是一个抽象的概念,当程序需要读取数据的时候,开启一个通向数据源的流,数据源可以是文件,内存,网络连接等;当程序需要写入数据时,开启一个通向目的地的流,如下图:
3. 缓冲区: 库函数对文件处理时设置缓冲区,即在程序执行时,会提供额外的内存,来暂时存放文件中的数据,避免多次和内核交互。注意,在实际编程中,这个缓冲区是隐式的,并不会被编程人员显示获取。
那么当我们使用标准I/O函数,即在#include<stdio.h>中的C库函数时,系统会自动设置缓冲区:
- 通过数据流来读写文件,那么当对文件进行读取时,不会直接操作作为源头的物理空间(如磁盘),而是打开数据流,将源头上的文件信息拷贝到缓冲区中,然后程序再从缓冲区中读取所需数据。
- 当写入文件时,也并不会马上就写入终点物理空间(如磁盘等),而是先写入缓冲区,只有在缓冲区满或者关闭文件时,才会将缓冲区的数据写入终点,如下图:
4. 文件指针: 用库函数的方式访问文件,用FILE类型表示一个打开的文件,这个类型中包含管理文件流的信息,我们将指向该类型的指针FILE*称为文件指针。借用该指针可以对它指向的文件进行操作。
5. 文件类型: 文本类型和二进制,b就表示二进制文件。
二、基础文件操作函数
那下面我们介绍基础的文件操作:
(一)fopen
fopen()表示打开一个文件,这是文件操作的第一步。函数原型如下:
FILE fopen(const char path,const char* mode)**
参数说明:
- const char* path:表示打开文件路径和文件名,如果在同一目录下,那么只写文件名即可,不在同一目录下需要写绝对路径加文件名。
- const char* mode:表示打开文件的方式,可以取值如下:
参数 | 含义 |
---|---|
r | 只读方式打开,文件必须存在,否则出错 |
r+ | 可读写,文件必须存在 |
rb+ | 以读写方式打开二进制文件 |
rt+ | 以读写方式打开文本文件 |
w | 只写,文件存在则覆盖,不存在建立该文件 |
w+ | 可读写,文件存在则覆盖,不存在建立该文件 |
wb | 只写方式打开二进制文件 |
w+ | 可读写,文件存在覆盖,不存在建立 |
a | 只写,存在写入的数据追加到文件尾,EOF符保留,不存在建立文件 |
a+ | 读写,存在写入的数据追加到文件尾,EOF符不保留,不存在建立文件 |
- 返回值:打开成功返回文件指针,失败返回NULL。
(二)fread
fread()函数表示从文件流读取数据,函数原型为:
size_t fread(void* buff,size_t size,size_t count,FILE* stream)
参数说明:
- void* buff :接受数据的数据块指针。
- size_t size :每次读取数据的大小。一般用sizeof(数据类型)获取。
- size_t count :读取数据个数。一般用strlen(存储数据变量名)获取。
- stream:指向要读取的文件。
- 返回值:读取成功则返回读取到的字节,失败返回0.
(三)fwrite
fwrite()表示向文件中写入数据,函数原型:
size_t fwrite(const void* buffer,size_t size,size_t count,FILF* stream)
参数说明:
- const void* buffer:保存数据的数据块指针。
- size_t size:数据块的大小。一般用sizeof(数据类型)获取。
- size_t size:数据个数。为存储数据的数据块定义的大小。
- stream:要写入数据的文件指针。
- 返回值:成功返回写入的数据量,失败返回0。
(四)fseek
fseek()表示重新定位文件内部指针,即指向文件数据上的指针,函数原型为:
int fseek(FILE* stream,long offest,int framwhere)
参数说明:
- stream:文件指针。
- long offest:指针偏移量。
- int fram where:指针偏移位置,可取值:
参数 | 含义 |
---|---|
SEEK_SET | 距离文件开头offest,宏值为0 |
SEEK_CUR | 距离当前位置offset,宏值为1 |
SEEK_END | 距离文件结尾offset,宏值为2 |
例如:fseek(file,20L,2)把file指针退回到离文件结尾20字节处。
- 返回值:重定位成功返回0,失败则返回-1
(五)fclose
fclose()关闭文件,关闭口缓冲区会把文件缓冲区的数据输出到磁盘文件,并释放文件有关的缓冲区和文件指针。函数原型:
int fclose(FILE* stream)
参数说明:
- stream:文件指针
- 返回值:成功0&#x