目录
文件IO介绍
文件描述符
文件IO的打开使用
umask
文件IO文件的关闭
文件IO的读写定位
文件IO-读
文件IO-写
文件IO又称系统IO,系统调用
是操作系统提供的API接口函数
文件IO:posix(可移植操作系统接口)定义的一组函数
文件IO不提供缓冲机制(与标准IO最大的区别),每次读写操作都引起系统调用
核心概念是文件描述符
访问各种类型文件
Linux下,标准IO基于文件IO实现
文件IO的API函数:
注意:文件IO的函数和标准IO的函数不能混用;
文件IO中每个打开的文件都对应一个文件描述符(类似于文件流指针)
文件描述符是一个非负整数。Linux为程序中每个打开的文件分配一个文件描述符。
文件描述符从0开始时分配,依次递增,范围是0-1023,其中0/1/2具有特殊含义,0表示标准输入,1是标准输出,2是标准错误。
文件IO操作通过文件描述符来完成。
文件IO打开文件使用的函数是open()
open函数用来创建或打开一个文件:
#include
int open(const char *pathname,int flages);(打开文件已存在,不需要新建)
int open(const char *pathname,int flags,mode_t mode);(当需要新建文件时需要用到第三个参数)
成功时返回文件描述符;出错时返回EOF
打开文件时使用两个参数
#include
#include
#include
int main()
{
int fd;
char buf[32];
fd = open("1.txt",O_WRONLY | O_TRUNC | O_CREAT);
if (fd < 0) {
perror("open");
return 0;
}
strcpy(buf,"hello");
write(fd,buf,strlen(buf);
read(fd,buf,32);
printf("%s\n",buf);
close(fd);
return 0;
}
创建文件时,第三个参数指定新文件的权限,(只有在建立新文件时有效)此外真正建文件时的权限会受到umask值影响,实际权限是mode-umaks
open函数可以打开设备文件,但是不能创建设备文件(创建设备文件使用mknode函数,后面驱动部分讲)
pathname 被打开的文件名(可包括路径名)
flags O_RDONLY:只读方式打开文件
O_WRONLY:可写方式打开文件
O_RDWR:读写方式打开文件
这三个函数互斥,不能一起使用
O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三个参数为其设置权限
O_EXCL:如果使用O_CREAT时文件存在,则返回错误信息,这一参数可测试文件时候存在。
O_NOCTTY:使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端
O_TRUNC:如文件已经存在,那么打开文件时先删除原文件中的内容
O_APPEND:以调价方式打开文件,所有对文件的操作都在文件的末尾进行
mode 被打开文件的存取权限,为8进制表示法。
文件IO和标准IO的模式对应关系:
r O_RDONLY
r+ O_RDWR
w O_WRONLY | O_CREAT | O_TRUNC, 0664
w+ O_RDWR | O_CREAT | O_TRUNC, 0664
a O_WRONLY | O_CREAT | O_APPEND, 0664
a+ O_RDWR | O_CREAT | O_APPEND, 0664
umask:用来设定文件或目录的初始权限
文件和目录的真正初始权限
文件或目录的初始权限 = 文件或目录的最大默认权限 - nmask(普通用户最大权限是0666,而nmask = 0002,因此实际权限为0664)
文件关闭函数是close,用来关闭一个打开的文件
#include
int close(int fd);
成功时返回0;出错时返回EOF
程序结束时,自动关闭所有打开的文件
文件关闭后,文件描述符不再代表文件
read函数用来从文件中读取数据:
#include
ssize_t read(int fd,void *buf,size_t count);
成功时返回实际读取的字节数;出错时返回EOF
读到文件末尾是返回0
buf是接收数据的缓冲区
count不应超过buf大小
write函数用来向文件写入数据
#include
ssize_t write(int fd,void *buf,size_t count);
成功时返回实际写入的字节数;出错时返回EOF
buf是发送数据的缓冲区
count不应超过buf大小
lseek函数用来定位文件:
#include
off_t lseek(int fd(文件描述符),off_t offset(偏移量,可正可负,不能超2G),intt whence(偏移坐标))
成功时返回当前的文件读写位置;出错时返回EOF;
参数offsst和参数whence同fseek完全一样
SEEK_CUR当前位置偏移
SEEK_END末尾进行偏移
SEEK_SET头部位置进行偏移