博客
关于我
基于Linux中io操作详解,open()、write()、read()、close()
阅读量:608 次
发布时间:2019-03-13

本文共 2530 字,大约阅读时间需要 8 分钟。

基于Linux中io操作详解

文件操作主要过程就是open、write、read、close

open()

头文件:#include 
#include
#include
功能:打开和创建文件(建立一个文件描述符,其他的函数可以通过文 件描述符对指定文件进行读取与写入的操作。)

函数原型

int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);

参数详解

1、pathname:打开或创建文件的路径2、flags:打开文件时,可以传入多个参数选项,用于指定怎么打开文件,构成falgs参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR: 读,写打开这三个常量,必须制定一个且只能指定一个O_CREAT: 若文件不存在,则创建它,需要使用mode选项。来指明新文件的访问权限O_APPEND: 追加写,如果文件已经有内容,这次打开文件所写的数据附加到文件的末尾而不覆盖原来的内容O_TRUNC:若文件存在,则长度被截为0,属性不变 3、mode:前两个参数与上相同,第三个参数是设定该文件的权限,具体参数如下S_IRUSR    : 文件所有者有读(r)权限S_IWUSR   : 文件所有者有写(w)权限S_IRGRP   : 文件所属组有读(r)权限S_IWGRP  : 文件所属组有写(w)权限S_IROTH   : 文件所属other有读(r)权限S_IWOTH  : 文件所属other有写(w)权限

返回值

成功:新打开的文件描述符失败:-1open返回的文件描述符一定是最小的而且没有被使用的

例子

if((filefd = open("./file.txt", O_CREAT|O_RDWR|O_TRUNC, 0666))) == -1)此处0666是代表文件权限,跟第三个参数其他英文意思一样

write()

头文件:#include

函数原型

ssize_t write(int fd,const void*buf,size_t count);参数说明:  fd:是文件描述符(write所对应的是写,即就是1)  buf:通常是一个字符串,需要写入的字符串  count:是每次写入的字节数

返回值

成功:返回写入的字节数 失败:返回-1并设置errno  ps: 写常规文件时,write的返回值通常等于请求写的字节       数count, 而向终端设备或者网络写时则不一定

案例

if( (rv=write(fd, MSG_STR, strlen(MSG_STR))) < 0 )

read()

头文件:#include
功能:用于从文件描述符对应的文件读取数据(从打开的设备或文件中读取数据)

函数原型

ssize_t read(int fd,void*buf,size_t count)参数说明:fd:      是文件描述符buf:     为读出数据的缓冲区;count:   为每次读取的字节数(是请求读取的字节数,读上来的数据保         存在缓冲区buf中,同时文件的当前读写位置向后移)

返回值

成功:返回读出的字节数失败:返回-1,并设置errno,如果在调用read      之前到达文件末尾,则这次read返回0

案例

if( (rv=read(fd, buf, sizeof(buf))) < 0 )注意此处 buf需要清空内存memset(buf, 0, sizeof(buf));

close()

头文件:#include
功能:关闭一个已经打开的文件

函数原型

int close(int fd)参数说明:fd:是需要关闭的文件描述符

返回值

成功:返回0;失败:返回-1,并设置errno

代码

#include 
#include
#include
#include
#include
#include
#include
#include
#define buf_size 128#define conten "hello word\n"int main(int argc, char **argv[]){ int fd; int rv; char buf[buf_size]; if((fd = open("test.txt", O_RDWR|O_CREAT|O_TRUNC, 0666))<0) { printf("the file open faild is %s\n",strerror(errno)); return -1; } printf("Open file returned file descriptor [%d]\n", fd); if((rv = write(fd, conten, strlen(conten)))<0) { printf("write is faild:%s\n", strerror(errno)); return -1; } printf("write %d bytes into file successful\n", rv); memset(buf , 0, sizeof(buf)); lseek(fd, 0, SEEK_SET); if((rv = read(fd, buf, sizeof(buf)))<0) { printf("read faild is : %s\n", strerror(errno)); return -1; } printf("read byte[%d] successful is: %s\n",rv, buf); close(fd); return 0;}

转载地址:http://idkaz.baihongyu.com/

你可能感兴趣的文章
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>
MySQL与Informix数据库中的同义表创建:深入解析与比较
查看>>
mysql与mem_细说 MySQL 之 MEM_ROOT
查看>>
MySQL与Oracle的数据迁移注意事项,另附转换工具链接
查看>>
mysql丢失更新问题
查看>>
MySQL两千万数据优化&迁移
查看>>
MySql中 delimiter 详解
查看>>
MYSQL中 find_in_set() 函数用法详解
查看>>