系统IO
系统IO是由linux内核定义的一些文件IO操作函数,系统IO有如下特点:
1.由操作系统提供的接口函数,特点是特别简洁,功能单一;
2.没有提供缓冲区,因此对于处理海量数据时效率比较低;
3.套接字、设备文件只能使用系统IO来访问。
系统IO接口
open (打开、创建文件)
头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
参数分析:
pathname --> 需要打开文件的路径 + 名字
flags -->
· O_RDONLY 以只读方式打开文件
· O_WRONLY 以只写方式打开文件
· O_RDWR 以可读写方式打开文件. 上述三种标志是互斥的, 也就是不可同时使用, 但可与下列的旗标利用 OR(|)运算符组合.
· O_CREAT 若欲打开的文件不存在则自动建立该文件.
· O_TRUNC (清空文件)若文件存在并且以可写的方式打开时, 此旗标会令文件长度清为 0, 而原来存于该文件的资料也会消失.
· O_APPEND (追加文件)当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面.
· O_NONBLOCK 以不可阻断的方式打开文件, 也就是无论有无数据读取或等待, 都会立即返回进程之中.
· O_SYNC 以同步的方式打开文件.
· mode --> 设置文件的初始权限(只有创建文件时生效)
0654 -->拥有者可读可写
同组用户 可读 可执行
其他用户 只读
返回值:
成功 返回文件描述符(new file descriptor),为在当前进程中表示该文件的编号。
失败 返回-1 , 并且会设置errno
write (将数据写入已打开的文件内)
头文件:
#include <unistd.h>
定义函数:
ssize_t write (int fd, const void * buf, size_t count);
ssize_t read (int fd, void * buf, size_t count);
参数分析:
fd --> 需要写入信息的文件的文件描述符(open的返回值)
buf --> 需要写入信息的内存地址
count --> 需要写入的字节数
返回值:
成功 返回实际写入的字节数
失败 有错误发生时返回-1, 并将错误代码存入 errno 中.
lseek (移动文件的读写位置)
头文件:
#include <sys/types.h>
#include <unistd.h>
定义函数:
off_t lseek(int fildes, off_t offset, int whence);
参数分析:
fildes --> 需要偏移读写位置的文件件描述符
offset --> 偏移量, 根据whence 有不同偏移方式
whence --> 为下列其中一种:
· SEEK_SET 参数 offset 即为新的读写位置.
· SEEK_CUR 以目前的读写位置往后增加 offset 个位移量.
· SEEK_END 将读写位置指向文件尾后再增加 offset 个位移量.
当 whence 值为 SEEK_CUR 或SEEK_END 时, 参数 offet 允许负值的出现.
返回值:
成功时则返回目前的读写位置, 也就是距离文件开头多少个字节.
若有错误则返回-1, errno 会存放错误代码.
close (关闭文件)
头文件:
#include <unistd.h>
定义函数:
int close(int fd);
参数分析:
fd --> 需要关闭的文件的文件描述符
返回值:
若文件顺利关闭则返回 0
发生错误时返回-1.
注意
1.打开 open可以用来打开所有的文件(除了目录、套接字),但是只能创建普通文件;
2.读取 read既可以处理二进制数据,也可以处理文本数据, 对于处理海量数据时效率较低;
3.写入 write既可以处理二进制数据,也可以处理文本数据, 对于处理海量数据时效率较低;
4.读写文件使会改变文件读写指针的位置,使用函数lseek可以调整文件的读写位置,成功时则返回目前的读写位置, 也就是距离文件开头多少个字节;
5.文件操作完毕后需要关闭文件。
测试代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
char *name = "./open.h";
int fd = open(name, O_RDWR);
if (fd<0)
{
printf("open %s error , msg: %s
" , name, strerror(errno));
return -1;
}
else
{
printf("file open/creat succeed:%d
", fd);
}
char w_buf1[32] = "Hello Arno";
int ret = write(fd, w_buf1, strlen(w_buf1));
if(-1 == ret)
{
printf("write %s error , msg: %s
" , name, strerror(errno));
return -1;
}
ret = lseek(fd, SEEK_SET, 0);
if(-1 == ret)
{
printf("lseek %s error , msg: %s
" , name, strerror(errno));
return -1;
}
char r_buf[32] = {' '};
ret = read(fd, r_buf, sizeof(r_buf));
if(-1 == ret)
{
printf("read %s error , msg: %s
" , name, strerror(errno));
return -1;
}
printf("r_buf:%s
", r_buf);
close(fd);
return 0;
}