目录
一、c语言的文件接口
1.1、fopen
- FILE *fopen(const char *path, const char *mode);
- path :带有路径的文件名称,(如果不带有路径,打开的文件可以是在当前路径下)
- mode:以何种方式打开
- 返回值
- 成功:返回文件流指针
- 失败:返回NULL;
文件的打开方式:
r | 只读 文件流指向文件头部 |
r+ | 读写 文件流指向文件的头部 |
W | 只写方式 如果文件存在,则清空文件开始写 如果文件不存在,则创建文件 |
W+ | 读写 如果文件存在,则清空文件开始写 如果文件不存在,则创建文件 |
a append(追加) | 追加写 文件如果不存在,则创建文件,从文件末尾开始写 |
a+ | 既可追加读也可追加写 文件如果不存在,则创建文件,从文件末尾开始写 |
1.2、fwrite
size_ t fwrite(const void *ptf,size_ t size,size_ t nmemb, FILE *stream) ;
参数:
ptr:想往文件当中写什么内容
size:定义往文件当中写的时候,一个块是多大,单位是字节: (通常定义为一个字节)
nmemb :期望写多少块
stream:文件流指针
返回值:
返回成功写入到文件块的个数
接下来实现一下,先把块的大小设为2,期望写6块
可以发现,返回值为6,即写入了6个块
因为返回值为块的数量,这个看起来不太明了,为了看起来更舒服一点,可以把每个块的大小设置为1个字节,这样返回就能显示写入了多少的字节数
这样就可以清楚的看到写入了11个字节
1.3、fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:
ptr:将从文件 当中读到的内容保存到ptr指向的内存空间当中(空间需程序猿提前准备)
size:定义从文件当中读的时候,一个块是多大,单位字节:(通常定义为一 个字节)
nmemb :期望读多少块
stream : 文件流指针
返回值:
返回成功读入的文件块的个数0
验证一下代码:
这里我们用r_size来接收fread的返回值,并期望写入sizeof(buf)-1个块
需要注意的是:这里写入的块数设置为了sizeof(buf)-1是为了能够预留 \0 的位置
输出结构进行判断:
我们可以看到
成功读了11个块 ,所以测试成功了
刚刚单独进行读和写文件的时候,都是很顺利的完成了
那么要是读写一起进行会怎么样呢?我们可以一起来看一下
先来分析一下,按道理来说,写入了hello world,那么读出来的肯定也是hello world
可以来运行一下:
执行的结果却是只写入了11块,但却没有读出来一块。
这是为什么呢?
这就和文件流指针的位置有着很大的关系
我们在写入内容的时候,光标总是向后的,在写入hello world 之后,文件流指针的后面是没有数据的,
所以这时候就读不到数据的,
解决这个问题就需要使用fseek函数
1.4、fseek
int fseek(FILE *stream, long offset, int whence);
作用:
移动文件 流指针的位置
参数:
stream:文件流指针
offset :偏移量,我们的whence只能让文件流指针偏移到开头或者末尾,或者当前位置,但有了我们的stream。就可以让文件流指针指向文件开头的后offset位置,或者文件末尾后offset位置。当前位置的后offset位置
whence :将文件流指针偏移到什么位置
下面有三个宏定义:
SEEK_ SET:文件头部
SEEK_ CUR:当前文件流指针的位置
SEEK_ END: 文件末尾
- 返回值:
- 成功:0
- 失败:-1
我们现在来使用fseek函数看能不能解决刚刚读不了的问题
运行一下
我们可以发现,确实是能够读出来了
5.fclose
- 作用:关闭文件。在打开文件操作完成后要关闭文件,不然会造成句柄泄露
- 句柄泄漏本质就是内存泄漏
二、系统调用的文件接口
2.1open:
可以来实验一下:
发现fd的值为3,就是一个整数
对文件描述符的拓展
2.2write
- ssize_t write(int fd, const void *buf, size_ t count);
- 参数:
- fd:文件描述符
-
- buf:将buf指向的内容写到文件当中去
- count:期望写多少字节(这里并没有块的概念)
- 返回值:
- 返回写入的字节数量。
2.3read :
- ssize_t read(int fd, void *buf, size_ t count) ;
- 参数:
- fd:文件描述符
- buf:将从文件当中读到的内容写到buf指向的空间当中去
- count:期望读多少字节
- 返回值:
- 返回读到的字节数量。
2.4.lseek:
- off_t lseek(int fd, off_t offset, int whence);
- 参数:
- fd:文件描述符
- offset:.偏移量, 单位字节
-
- whence:偏移的位置
- SEEK_ SET: 文件头部
- SEEK_ CUR:当前文件 流指针的位置
- SEEK_ END: 文件末尾
- whence:偏移的位置
- 返回值:
- 成功:返回偏移的位置,单位字节。
- 失败: -1
-
2.5close:
- 关闭文件描述符
- int close(int fd);
下面来测试一下这些系统调用函数
可以发现,已经成功读取和写入了