IO操作:文件IO

一、系统调用

系统调用实际上是操作系统(内核)提供的供用户使用的接口函数。

二、标准IO函数和文件IO函数的关系

	标准IO是C库内定义的函数,是凌驾于系统之上的,适用于任何的操作系统;文件IO是由Linux系统提供的,
只能在linux系统中使用,而不可以在其它操作系统中使用。标准IO函数可以调用文件IO函数。

三、文件描述符

	文件描述符是Linux内核用来标识一个打开的文件的符号,是一个非负整数;文件流指针是内存用来标识
一个打开的文件的符号。
FILE*文件流指针文件描述符文件描述符符号常量
标准输入stdin0STDIN_FILENO
标准输出stdout1STDOUT_FILENO
标准出错strerr2STDERR_FILENO

四、文件IO函数

1、open函数

函数原型:int open(const char* filename, int flags);
		 int open(const char* filename, int flags, int mode);
函数功能:以flag指定的方式打开文件filename,获得对应文件的文件描述符,该描述符有返回值带回。
参数:filename	目标文件,是一个字符串常量,可以包含文件的路径
	  flags		打开文件的访问权限。
	  			O_RDONLY	只读的方式
	  			O_WRONLY	只写的方式
	  			O_RDWR	读写的方式
	  			O_APPEND	追加
	  			O_CREAT	创建(文件不存在时进行创建)
	  			以上的访问权限还可以使用“|”进行连接,例如:
	  			O_WRONLY | O_CREAT	以只写的方式打开文件,文件不存在则创建
	  			O_RDWR | O_CREAT	以读写的方式打开文件,文件不存在则创建 
	 mode		对“新建”的文件指定权限,只有当文件不存在而且第二个参数中有O_CREAT时,该参数才会
	 			使用。实际创建的权限应该与文件权限掩码umask进行运算得到实际的文件权限,运算规则
	 			如下:
	 			实际文件权限 = 给与的权限&(~umask);
	 			
返回值:文件打开成功,返回当前未使用的最小的文件描述符;失败则返回-1,并设置errno。

用户权限:
读权限	4
写权限	2
执行权限	1

2、close函数

函数原型:int close(int fd);
函数功能:关闭文件描述符fd相对性的文件。

3、read函数

函数原型:size_t read(int fd, void *buf, size_t count);
函数功能:“期望”从文件描述符fd相关联的文件中读取count个字节的数据存放在缓冲区buf中。
参数:fd	文件描述符
	 buf	存放读取到的数据的缓冲区首地址
	 count	“期望”读取的字节数
返回值:> 0	表示成功读到的字节数
	   =0	表示读取到了文件的尾部
	   -1	读取失败,返回-1,并设置errno

1、read函数说明:
(1)读取某个文件的方式
	while(ret > 0){
		读取文件;
	}
	分析:当读取到文件的尾部时ret = 0;当读取文件失败ret == -1;因此读取某个文件的条件是ret > 0

(2)read读取文件至少循环两次:
	首先,把文件中的所有数据全部读取完毕,返回读取到的字节数;其次,从文件尾部开始读取,读到了文件
	末尾,返回0。

在这里插入图片描述
在这里插入图片描述

4、write函数

函数原型:size_t write(int fd, const void *buf, size_t count);
功能:“期望”将缓冲区buf中存放的数据中的count个字节写入到与文件描述符fd相关联的文件中。
参数:fd	文件描述符
	 buf	数据存放的缓冲区
	 count	“期望”向文件中写入的字节数目,一般count = strlen(buf),有效写入。
返回值:成功,返回实际写入到文件中的字节数;失败,返回-1,并设置errno。
	

例:通过文件IO实现文件的拷贝工作。

在这里插入图片描述
在这里插入图片描述

5、lseek函数

	打开一个文件时,除非指定O_APPEND选项,否则该偏移量被默认设置为0。

函数原型:off_t lseek(int fd, off_t offset, int whence);
函数功能:打开fd指定的文件时,设置当前文件的读写位置。
参数:fd	文件描述符
	 offset	相对于基准的相对偏移大小
	 whence	相对偏移量的起点。
	 		SEEK_SET	以文件开头为相对偏移量的起点
	 		SEEK_CUR	以当前文件的读写位置为相对偏移量的起点
	 		SEEK_END	以文件的结尾为相对偏移量的起点
返回值:成功设置,则返回文件的当前读写位置(即文件当前读写位置相对于文件开头的偏移量);设置失败
	   则放回-1。

获取文件的长度:
int length = lseek(fd, 0, SEEK_END);

五、标准IO和文件IO的区别

1、函数的来源不同:标准IO来自于标准C库;文件IO来自于Linux操作系统。
2、标准IO具有缓冲机制,而文件IO没有缓冲机制。
3、标准IO通过流指针来进行文件的操作;而文件IO通过文件描述符来进行文件的操作。

六、标准IO和文件IO的使用场合不同

标准IO主要用于编写应用层程序,适用于Linux上层应用开发;文件IO主要用于进行Linux底层开发,用于编写
内核和驱动程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值