文件IO管理

文件IO

linux 系统中,文件IO的流程,如下图所示。
在这里插入图片描述
文件IO有5个函数:open() read(),write(),close(),leek()。

open

打开或创建一个文件。
open (char* , flag, mode)在fcnth h文件中声明。
函数的作用:创建或打开某个文件,
参数:最多有三个参数:
第一个参数,char* 包含有文件名和路径。
第二个参数: flag 打开文件的方式。
第三个参数:mode 创建文件的权限。
flag内容如下:

flag选项功能
O_ RDONLY只读
O_ WRONLY只写
O_ RDWRe读写
O_ CREAT创建一个文件
O_EXCL如果使用0 CREAT时文件存在,则可返回错误消息.这一参数可测试文件是否存在
O_ TRUNC打开文件(会把已经存在的内容给删除)。
O_ APPEND追加方式打开文件(不会把已经存在的内容给删除)。

➢返回值:
成功:文件描述符,它是一个非负的正整数,即文件的ID号,相当于人的身份证号;
出错: -1。
Open函数创建文件时的权限是:
= mode & (~umaskb)+
B111 111 111 & ~(B 000 010010) = B111 101 101

什么是文件描述符?
内核的一个重要功能是文件管理,系统有非常多的文件,内核怎样认识每一个文件呢? 内核采用ID号的方式标识这些文件,inode 号,node 号表示不同的文件,比如ls -1ai i,只要文件不一样inode.号就不一样。
那么这些内核的文件的ID号,在每个用户的程序中怎样映射的呢?即是文件描述符。
open函数的返回值就是这个ID号
ID号从0开始累加,
程序进行时(进程),内核会自动打开3个文件描述符,0, 1, 2, 分别对应,标准输入、输出和出错,这样在程序中,每打开一个文件,文件描述符值从3开始累加。

close

关闭一个文件inode
close(int inode)。
例子:touch命令的实现

#include "stdio.h"
#include "unistd.h"
#include "fcntl.h"
int main()
{
	int fd;
	fd = open(argv[1],O_CREAT|O_RDWR,0777);
	if(fd<0)
	{
		printf("creat file %s failure\n",argv[1]);
		return -1;
	}
	printf("create file %s sucess\n",fd = %d\n",argv[1],fd);
	close(fd);
	return 0 ;
}

wirte

向内核写东西。
头文件:#include “fcntl.h”
write(int fd, void *buf. size_t count ):
第一个参数:向哪一个文件中去写;
第二个参数:向这个文件中写什么内容;
第三个参数:向这个文件中写多少个。
函数的返回值:是实际写的字节数。

read

读取一个文件的数据.
read(imt fd void *buf size. size_t count)
第一个参数:从哪一个文件中去读;
第二个参数:读到什么地方去;
第三个参数:读多少个函数的返回值:是实际读的字节数。
返回值:是实际读的字节数。
注意:读写的时候会有读写指针,先写再读后会读不到,得修改指针。

lseek

lseek(int fd, off_t offset, int whence)
该函数的头文件: sys/types.h unistd.h;
功能:调整读写的位置指针.
第一个参数:要调整的文件的文件描述符;
第二个参数:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移);
第三个参数:当前位置的基点,有三个标志,
SEEK_ SET:当前位置为文件的开头,新位置为偏移量的大小;
SEEK_ CUR:当前位置为文件指针的位置,新位 置为当前位置加上偏移量。
SEEK END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。
函数的返回值:
成功:文件当前的位置;
出错: -1。
例子:cp命令的实现

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>	
int  main (int argc, char *argv[])
{
	int  rd_fd,wr_fd;
	char read_buf[128] = {0};
	char write_buf[128] = {0};
	int rd_ret = 0;
	
	if(argc <3)
	{
		printf("please input src file and des file \n");
		return -1;
	}
		
	rd_fd = open(argv[1],O_RDONLY);
	if(rd_fd < 0 )
	{
		printf("open src file %s failure\n",argv[1])
		return -2;
	}
	wr_fd =  open (argv[2],O_WRONLY);
	if(wr_fd <0)
	{
		printf("open des file %s failure\n",argv[2])
		return -3;
	}
	
	while(1)
	{
	 rd_ret = read(rd_fd,read_buf,128);
	 if(rd_ret < 128)
	 	break;
	 write(wr_rd,read_buf,rd_ret);
	 memset(wr_fd,read_buf,re_ret);
	}
	write(wr_rd,read_buf,rd_ret);

	close(rd_fd);	
	close(wr_fd);	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值