Linux文件I/O及标准I/O

一、什么是文件I/O与标准I/O

文件I/O:文件I/O的函数通常称之为不带缓存的I/O(unbuffered I/O)
标准I/O:指的是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,其提供三种类型的缓存:
  1.全缓存:当填满标准I/O缓存后才进行实际I/O操作。(磁盘上的文件通常由I/O标准可部署为全缓存)
  2.行缓存:当输入和输出种遇到换行符或填满缓存时,标准I/O才执行I/O操作。(处理终端的输入输出时就是使用的行缓存)
  3.不带缓存:即标准I/O库不对字符进行缓存。(标准出错就是不带缓存的类型)

二、两者的区别

  文件I/O 又称为低级磁盘I/O,标准I/O其内部实际上就是调用文件I/O来进行实际的文件操作,只是其内部多了缓存
操作,这样做的目的在于减少实际的read,write的操作。其只有在缓存满足相应的条件时才进行read,write操作,
减少了实际系统调用的次数。
  文件I/O中使用文件描述符来表示一个打开的文件
  标准I/O中使用的是FILE(流)来表示一个打开的文件
标准I/O文件I/O
打开fopen,freopen, fdopenopen
关闭fcloseclose
getc,fgetc,getchar;fgets,gets; freadread
putc,fputc,putchar;fputs,puts;fwriteswrite
定位fseek,ftelllseek

三、文件I/O函数

1.open函数

/*
 *  1.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);
//成功返回文件描述符,失败返回-1(因此通常用open(...)<0来判断打开文件是否成功)
	pathname自然不用说,flags却有许多可选选项,分别为:
		    O_APPEND 以追加方式打开文件,每次写时都写在文件末尾。
		    O_CREAT    如果文件不存在,则创建一个,存在则打开它。
		    O_EXCL      与O_CREAT一起使用时,如果文件已经存在则返回出错。
		    O_TRUNC   以只写或读写方式打开时,把文件截断为0
		    O_DSYNC   每次write时,等待数据写到磁盘上。
		    O_RSYNC    每次读时,等待相同部分先写到磁盘上。
		    O_SYNC      每次write时,等到数据写到磁盘上并接更新文件属性。

	而mode只有在文件创建才用到,用于指定文件访问权限:
	   S_IRWX[UGO]                 可读 可写 可执行
	   S_IR[USR GRP OTH]        可读
	   S_IW[USR GRP OTH]       可写
	   S_IX[USR GRP OTH]        可执行
	   S_ISUID   设置用户ID
	   S_ISGID   设置组ID
	   也可使用数字表示,如 0777,0644等直接表示相应的权限

2.close函数

/*
 *  2.close函数
 */

#include <unistd.h>

int close(int fd);
//失败返回-1
//用于关闭由close打开的文件

3.creat函数

/*
 *  3.creat函数
 */
 
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int creat(const char *pathname, mode_tmode);
//失败返回-1
其mode与read中使用到mode相同
creat创建文件相当于以只写方式创建一个文件,文件若存在则将文件截断为0

4.lseek函数

/*
 *  4.lseek函数
 */
 
#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);
//失败返回-1,成功返回移动后的偏移量
whence可选选项为:
   SEEK_SET,则offset从文件的开头算起。
   SEEK_CUR,则offset从当前位置算起,既新偏移量为当前偏移量加上offset
   SEEK_END,则offset从文件末尾算起。(可用于生成空洞文件)

offset为偏移量

5.read函数

/*
 *  5.read函数
 */
 
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
//失败返回-1,成功为实际读入的字节数,到达文件尾返回0
    //实际读入的字节数(返回值)可能会 < 要求读入的字节数(count)。比如文件只有所剩的字节数小于
    //你要读入的字节数。

6.write函数

/*
 * 6.write函数
 */
 
#include <unistd.h>

ssize_t write(int fd, const void *buf,size_t count);
//失败返回-1,成功返回实际写入的字节数
    //打开文件时使用O_APPEND是,write将变为原子操作,且始终在文件末尾进行写入。
    //(通常用于多个进程对文件进行写入时)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值