文件IO基础
- 什么是文件I/O
- 文件I/O是对文件的输入、输出操作,铜元素点数哦就是对文件的读/写操作
文件描述符:
- 什么是文件描述符?
- 一个非负整数,与相应文件相互绑定。
- 文件描述符如何分配
- 分配一个没有被使用的最小的非负整数作为文件描述符
- 一般用户打开的文件是从3开始的
- 标准输入、标准输出和标准错误
- 上述三个分别对应:0、1、2
open()函数(系统调用函数)
-
函数原型:
int open(const char *pathname,int flags); // 常用于打开文件 int open(const char *pathname,int flags,mode_t mode); // 常用于创建文件
-
参数描述:
- pathname:文件路径
- flags:标志,控制文件访问模式标志
- mode:给文件赋予权限
flags标志简介
标志 | 用途 | 说明 |
---|---|---|
O_RDONLY | 以只读方式打开文件 | 这三个是文件访问权限标志,传入的flags 参数中必须要包含其中一种标志,而且只能包含一种,打开的文件只能按照这种权限来操作,譬如使用了 O_RDONLY 标志,就只能对文件进行读取操作,不能写操作 |
O_WRONLY | 以只写方式打开文件 | |
O_RDWR | 以可读可写方式打开文件 | |
O_CREAT | 如果 pathname 参数指向的文件不存在则创建此文件 | 使用此标志时,调用 open 函数需要传入第 3 个参数 mode,参数 mode 用于指定新建文件的访问权限 |
O_DIRECTORY | 如果 pathname 参数指向的不是一个目录,则调用 open 失败 | |
O_EXCL | 此标志一般结合 O_CREAT 标志一起使用,用于专门创建文件在 flags 参数同时使用到了 O_CREAT 和O_EXCL 标志的情况下,如果 pathname 参数指向的文件已经存在,则 open 函数返回错误 | 如果文件不存在则创建此文件,如果存在则返回错误 |
O_NOFOLLOW | 如果 pathname 参数指向的是一个符号链接,将不对其进行解引用,直接返回错误 | 不加此标志情况下,如果 pathname参数是一个符号链接,会对其进行解引用 |
O_TRUNC | 若文件存在,则长度被截为0,属性不变 |
- 返回值:成功返回文件描述符,失败返回-1
wirte()函数(系统调用函数)
-
函数原型:
ssize_t write(int fd,const void *buf,size_t count);
-
参数描述:
- fd:文件描述符
- buf:存放要写入的数据
- count:写入的字节数
-
返回值:ssize_t (实际类型:long int),返回实际上写入的字节数。
read()函数(系统调用函数)
-
函数原型:
ssize_t read(itn fd,void *buf,size_t count);
-
参数描述:
- fd:文件描述符
- buf:存放要读取的数据
- count:一次读入的字节数
-
返回值:读取到多少字节,返回对应整数
close()函数(系统调用函数)
-
函数原型:
int close(int fd);
-
参数描述:
- fd:文件描述符
-
返回值:成功返回0,失败返回-1。
练习:
题目1:新建一个test.txt文件,写入"hello World"。对新建文件的要求O、G用户对文件只有可读权限,U用户具有可读、可写权限。读取text.txt内容,并打印出来。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <strings.h>
#include <stdio.h>
int main(){
// 以新建文件方式打开文件
int fd = open("test.txt",O_RDWR | O_CREAT | O_EXCL,0644);
// 调用wirte函数向文件内写入数据
if(write(fd,"Hello World",11) == -1){
printf("写入数据出错");
}
// 更改文件内容偏移量,从文件头开始读
lseek(fd,0,SEEK_SET);
char buf[100];
// 读取文件内容并输出
if(read(fd,buf,100) == -1){
printf("读取失败!");
}
printf("buf:%s\n",buf);
// 关闭文件
close(fd);
return 0;
}
sleek()函数:
-
函数原型:
off_t lseek(int fd,off_t offset,int whence);
-
参数含义:
- fd:文件描述符
- offset:偏移量的大小
- whence:指针偏移的位置
whence参数类型
-
- SEEK_SET:读写偏移量将指向 offset 字节位置处(从文件头部开始算)
- SEEK_CUR:读写偏移量将指向当前位置偏移量 + offset 字节位置处, offset 可以为正、也可以为负,如果是正数表示往后偏移,如果是负数则表示往前偏移
- SEEK_END:读写偏移量将指向文件末尾 + offset 字节位置处,同样 offset 可以为正、也可以为负