文件IO
open()/creat()/close()/read()/write()/lseek()
文件IO可以操作普通的磁盘文件,也可以操作设备文件,Linxu专用。
文件操作一般步骤
打开文件
读写文件
关闭文件
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int open(constchar *pathname, int flags);
int creat(constchar *pathname, mode_t mode);
int open(constchar *pathname, int flags, mode_t mode);
功能:
打开或者创建一个文件
参数:
const char*pathname 文件名字 ../test/123.c
int flags 标记
O_RDONLY:只读方式打开文件
O_WRONLY:可写方式打开文件
O_RDWR:读写方式打开文件
O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三的参数为其设置权限
O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在
O_TRUNC:如文件已经存在,那么打开文件时先删除文件中原有数据
O_APPEND:以添加方式打开文件,所以对文件的写操作都在文件的末尾进行
mode 被打开文件的存取权限,为8进制表示法 0666 rw-rw-rw- 文件属性
【创建的文件的权限还收进程的创建文件掩码的影响】
https://wenku.baidu.com/view/fd0297ef0b4e767f5bcfce4c.html
umask 000 创建的文件权限都打开
返回值:
文件描述符,就是进程用来区分打开的文件的
失败 <0
0 1 2 被占用了, 分别stdin, stdout,stderr
#include<unistd.h>
int close(intfd);
功能
关闭文件,缓冲区数据会推送到外部设备。
当一个进程终止时,该进程打开的所有文件都由内核自动关闭。缓冲区的数据会自动推到外部设备或者硬盘中,
关闭一个文件的同时,也释放该进程加在该文件上的所有记录锁。
参数
fd 文件描述符
#include<unistd.h>
ssize_t read(intfd, void *buf, size_t count);
功能
从fd对应的文件中读取数据
参数
int fd 文件描述符
void *buf 读取的数据要存放的位置
size_t count 缓冲区大小
返回值
成功返回实际读取字节的个数
0 文件尾部
<0 出错
#include<unistd.h>
ssize_twrite(int fd, const void *buf, size_t count);
功能
向文件中写入数据
参数
int fd 文件描述符
const void *buf 要写入的数据对应的地址
size_t count 要写入数据的个数
返回值
成功实际写入字节的个数
失败<0
磁盘已满或者超过了一个给定进程的文件长度限制
打开一个文件的时候,默认是从文件头开始写数据,
如果open的时候增加了O_APPEND 这个flag,
就会从文件尾开始读写
#include<sys/types.h>
#include<unistd.h>
off_t lseek(intfd, off_t offset, int whence);
功能
修改文件操作位置
参数
int fd
off_t offset 偏移量,负值:往前移动正值:往后移动
int whence
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小
返回值
成功就返回当前的位移
-1 出错文件头往前移动若干个字节,会报错