linux i o函数实例,Linux下的两类I/O操作总结

Linux下的I/O操作

一、分类

Linux下的I/O操作分为两类:一类是基于文件描述符,不带缓存的I/O操作;另一类是符合ANSI C标准的基于缓存的I/O操作。

二、基于文件描述符的,为基本的I/O控制,是不带缓存的。在这一类文件I/O操作中,最重要的是一个文件描述符。对于内核而言,所有打开的文件者通过文件描述符引用,文件描述符是一个非负数,当打开一个现有的文件夹或创建一个新文件时,内核向进程返回一个文件描述符;当读或写一个文件夹时,使用open等函数返回文件描述符来标识该文件,并将其作为参数传递给read和write。

open函数

(1)头文件

#include (2)函数原型

int open(const char *pathname, /*被打开的文件名(可以包括路径名)*/

const char flags, /*文件打开的方式*/

int perms);/*被打开文件的存取权限,为八进制表示法*/

flags值有:O_RDONLY(只读方式打开文件),O_WRONLY(只写方式打开文件),O_RDWR(读写方式打开文件),O_CREAT(如果该文件不存在,就创建一个新的文件,并用第三个参数为其设置权限),O_EXCL(测试文件是否正在),O_NOCTTY(使用本参数,如文件为终端,那么终端不能作为调用open的进程或控制终端),O_TRUNC(如果文件已经存在,那么打开文件时会先删除文件中原有数据),O_APPEND(以添加方式打开文件,所有对文件的写操作都在文件末尾进行)。

对于perns参数,在对文件的权限设置中的值与chmod命令的权限数值是一致的(4-2-1规则)。

close函数

(1)头文件

#include (2)函数原型及返回值

int close(int fd); /*fd为文件描述符*/

成功返回0;出错返回-1。

read,write函数

(1)头文件

#include (2)函数原型及返回值

size_t read/write(int fd, /*文件描述符*/

void *buf, /*指定存储器读出数据或写入数据缓存区*/

size_t count);/*指定读出/写入的字节数*/

成功返回读到/写入的字节数,0已到时达文件尾,-1出错。

lseek函数

(1)头文件

#include #include (2)函数原型及返回值

off_t lseek(int fd,  /*文件描述符*/

off_t offset /*偏移量,每一个读写操作所需要移动的距离,单位是字*/

/*节的数量,可正可负(向前移,向后移)*/

int whence); /*文件当前位置的基点*/

whence的选择方式有:SEEK_SET(当前位置为文件的开头,新位置为偏移量的大小),SEEK_CUR(当前位置为文件指针的位置,新位置为当前位置加上偏移量),SEEK_END(当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小)。

成功返回文件的当前的位置;出错-1。

fcntl函数

fcntl有非常强大的功能,能够复制一个现有的描述符,获得/设置文件描述符标识,获得/设置文件状态标识,获得/设置异步I/O所有权及获得/设置记录锁。

(1)头文件

#include #include #include (2)函数原型及返回值

int fcntl(int fd,  /*文件描述符*/

int cmd,  /*不用的命令*/

struce flock *lock); /*设置记录锁的具体状态*/

cmd有不同的选择,flock结构体如下:

struct flock{

short l_type; /*可为F_RDLCK,F_WRLCK,F_UNLCK*/

off_t l_start;/*相对位移量(字节)*/

short l_whence;/*(SEEK_SET,SEEK_CUR,SEEK_END,参考lseek函数的whence参数选项)*/

off_t l_len; /*加锁域的长度*/

pid_t l_pid;

};

成功返回0;出错-1。

select函数

(1)头文件

#include #include #include (2)函数原型及返回值

int select(int numfds,  /*需要检查的最大文件描述符加1*/

fd_set *readfds, /*由select监视的读文件描述符集合*/

fd_set *writefds, /*由select监视的写文件描述符集合*/

fd_set *exeptfds, /*由select监视的异常处理文件描述符集合*/

struct timeval *timeout);/*等待的时间*/

time值:NULL,永远等待;具体值,struct timeval类型指针,若等待timeout时间文件描述符还没有准备好,就立即返回;0,从不等待。

成功返回准备好的文件描述符;出错-1。

timeout是一个struct timeval类型的指针,timeval结构体如下:

struct timeval {

long tv_sec; /*秒*/

long tv_usec; /*微秒*/

}

实例:

******************

******************

三、基于流缓冲的,符合ANSI C的标准I/O处理,标准I/O库处理了很多细节,如缓存分配、优化长度执行等,包含了我们很多已熟知的函数,像printf、scanf函数等。

标准I/O又称高级磁盘I/O,在文件I/O的基础上进行了封装,提供缓冲流的目的是尽可能减少使用read和write调用的次数,提高I/O效率。它提供了全缓冲、行缓冲和不带缓冲3种缓冲类型。

(1)文件指针

在标准I/O中,流(stream)用“FILE *”来描述,所有的操作都是围绕流来进行的。在标准I/O库中预定义了3个流:标准输入流(stdin),标准输出流(stdout)和标准错误(stderr),当一个程序执行时,系统自动打开这三个流,它们可以在程序中直接使用。

(2)头文件

#include 所有的操作函数都在这个头文件中定义声明。

(3)函数原型及返回值

打开函数

FILE * fopen(const char *path, /*包含要打开的文件夹路径及文件名*/

const char *mode); /*文件的打开方式*/

FILE * fdopen(const char *path, /*包含要打开的文件夹路径及文件名*/

const char *mode); /*文件的打开方式*/

FILE * freopen(const char *path, /*包含要打开的文件夹路径及文件名*/

const char *mode); /*文件的打开方式*/

成功返回指向FILE的指针;失败NULL。

关闭函数

int fclose(FILE * stream); /*已打开的文件指针*/

成功返回0;失败EOF。

按字符读/写文件

在文件打开之后,可对文件进行读写操作,读文件函数有fgetc/getc/getchar,写文件函数有fputc/putc/putchar。

成功读取的字符/写入返回0;失败EOF。

按行读/写文件

读文件的函数为fgets,写文件的函数为fputs/puts,函数原型为:

char *fgets(char *s,int n, FILE *stream);/*从流stream中最多读取n-1个字符到缓冲中*/

int fputs(const char *s,FILE *stream);/*将字符串s输出到流stream*/

int puts(const char *s); /*将字符串s输出到标准输出*/

按指定格式读/写文件

以指定的格式一次从文件中读取或写入若干个对象,常用来处理二进制文件。

size_t fread/fwrite(void *ptr ,/*存放读取/写入记录的缓冲区*/

size_t size,  /*读取/写入的记录大小*/

size_t nmemb,  /*读取/写入的记录数*/

FILE * stream);  /*要读取/写入的文件流*/

成功返回读取/写入的记录数目;失败EOF。

刷新流

强制刷新一个流,使该流所有未军民一致的缓冲区数据写入到实际的流中,函数原型为:

int fflush(FILE *stream);

成功返回0,失败-1。

文件定位

文件中有个位置指针,指向当前读写的位置。fseek/rewind可以改变文件的位置指针,ftell返回流多文件的当前位置,函数原型为:

void rewind(FILE *stream); /*使位置指针重新指向文件的开始*/

int fseek(FILE *stream,

long offset, /*位移量,以起始点为基准移动的字节数*/

int whence); /*起始点,参考前面*/

成功返回0,失败乃成功之母1。

long ftell(FILE *stream);

成功返回当前位置,失败-1L。

实例:

******************

******************

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值