文件I/O 函数使用方法
文件I/O
1、文件描述符
对于内核而言,所有打开文件都由文件描述符引用;
文件描述符是一个顺序分配非负整数,当打开一个现存文件或创建一个新文件时,内核向进程返回一个最小的文件描述符;
当读、写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write
文件描述符0,1,2是由shell默认打开的,分别为标准输入(stdin)、标准输出(stdout)和标准出错(stderr);
我们可以通过文件描述符对文件进行相关操作;
2、常用的文件I/O相关的操作函数
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
(1)-----------open()---------------
函数原型: int open( char *pathname , int flags, mode_t mode);
函数功能: 打开或者新建一个文件
参数: pathname -- 被打开的文件名(可包含路径)
flags -- O_RDONLY: 只读方式打开文件
O_WRONLY: 只写方式打开文件
O_RDWR: 读写的方式打开文件 // 前三个参数必须选择一个进行填写
O_CREAT: 如果该文件不存在,就创建一个新的文件,并用第三个参数为其设置权限 //权限一般写0664
O_EXCL: 如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在
//O_NOCTTY: 使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端
O_TRUNC: 如文件已经存在, 那么打开文件时先删除文件中原有数据
O_APPEND: 以添加方式打开文件,所以对文件的写操作都在文件的末尾进行
mode -- 被打开文件的存取权限
0标识这个数是8进制
三个8进制数 1、文件拥有者读写权限 2、拥有着同组用户读写权限 3、其他用户读写权限
返回值: 调用成功返回文件描述符,失败返回-1并设置errno;// perror("open");
(2)-----------close()---------------
函数原型: int close(int fildes);
函数功能: 关闭一个打开的文件
参数: fildes -- 要关闭文件的文件描述符
返回值: 调用成功返回0,出错返回-1,并设置errno;
当一个进程终止时,该进程打开的所有文件都由内核自动关闭;
关闭一个文件的同时,也释放该进程加在该文件上的所有记录锁;
(3)-----------read()---------------
函数原型: ssize_t read(int fd, void *buf, size_t count);
函数功能: 从一个已经打开的可读文件中读取数据
参数: fd -- 文件描述符
buf -- 指定的缓冲区,指向一段内存单元
count -- 请求读取的字节数
返回值: read调用成功返回读取的字节数,如果返回0,表示到达文件末尾,返回-1.表示出错,通过errno设置错误码;
读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读取的字节数;
,
(4)-----------write()---------------
函数原型: ssize_t write(int fd, const void *buf, size_t count);
函数功能: 向一个已经打开的可写文件中写入数据
参数: fd -- 文件描述符
buf -- 指定的缓冲区,指向一段内存单元
count -- 请求写入的字节数
返回值: write调用成功返回写入的字节数,返回-1.表示出错,通过errno设置错误码;
write()的返回值通常与count不同,因此需要循环将全部待写的数据全部写入文件;
(5)-----------lseek()---------------
函数原型: off_t lseek(int fd, off_t offset, int whence);
函数功能: 定位一个已经打开的文件;
参数: fd -- 文件描述符
offset -- 偏移量,每一读写操作所需要移动的距离, 单位是字节的数量,可正可负(向前移,向后移)
whence(当前位置基点) -- SEEK_SET:当前位置为文件的开头,新的位置为偏移量的大小。
SEEK_CUR:当前位置为文件指针的位置, 新位置为当前位置加上偏移量。
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。
返回值:调用成功时,返回当前相对与文件开头的偏移量,以字节为单位
调用失败时返回-1,并修改errno的值;