文件IO之open write read close函数

input & output:站在应用层考虑
Input:内核–>用户,从内核读取数据或从文件读取数据 ————read函数
Output:用户–>内核,写数据到内核或写数据到文件中 ————write函数

open函数
作用:打开和创建文件(open()失败返回值为-1)

#include<fcntl.h>	//需要的头文件
int open(constchar*pathname,int flags);//打开已有的文件
int open(constchar*pathname,int flags,mode_tmode);//创建文件

//例子如下
fd = open("/home/user/app.c", O_RDWR | O_CREAT, 0777) // 不存在则创建app.c文件,权限设置为0777异或umask

参数pathname:待打开/创建文件的POSIX路径名(如/home/user/a.cpp)
参数flags: 用于指定文件的打开/创建模式
参数:mode 创建文件的权限。 //在创建文件时需要有权限的参数;如果打开文件,则不需要这个参数

flsgs参数:
O_RDONLY只读模式
O_WRONLY只写模式
O_RDWR读写模式
打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:
O_APPEND每次写操作都写入文件的末尾
O_CREAT如果指定文件不存在,则创建这个文件
O_EXCL如果要创建的文件已存在,则返回-1,并且修改errno的值
O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)
O_NOCTTY如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继I/O

mode参数:
创建文件时文件权限 == mode 异或 umask

文件描述符概述:
内核的一个重要功能是文件管理,系统有非常多的文件,内核怎样认识每一个文件呢?内核采用ID号的方式标识这些文件,inode号,node号表示不同的文件,比如ls –lai i,只要文件不一样,inode号就不一样。那么这些内核的文件的ID号,在每个用户的程序中怎样映射的呢?即是文件描述符。

ID号有什么规律呢?从0开始累加,程序进行时(进程),内核会自动打开3个文件描述符,0,1,2,分别对应,标准输入、输出和出错,这样在程序中,每打开一个文件,文件描述符值从3开始累加。

close函数

Close(windowname)//函数原型
//例子如下
Close(fd) //关闭文件windowname	

参数windowname:要关闭窗口的名称返回值Integer。函数执行成功时返回1,发生错误时返回-1。如果参数windowname的值为NULL,Close()函数返回NULL。
调用close()函数可以关闭一个打开的文件。
调用成功返回0,出错返回-1,并设置errno;
注:当一个进程终止时,该进程打开的所有文件都由内核自动关闭;

write函数

 write(int fd, void *buf, size_t count ) // 函数原型
//例子如下
cnt = wirte(fd, buff, srtlen(buff)); //从buff里读取数据向fd文件写入strlen(buff)个字节,

参数fd:向哪一个文件中去写
参数buf:向这个文件中写什么内容
参数size:向这个文件中写多少个字节。
返回值:是实际写的字节数。

read函数

read(int fd, void *buf, size_t count)//函数原型

//例子如下
cnt = read(fd,  buff, 10)//向文件fd读取10个字节存入到buff中,cnt返回实际读到的字节个数

参数fd:从哪一个文件中去读
参数buf:读到什么地方去
参数count:读多少个。
返回值:是实际读的字节数

lseek函数

//包含的头文件
#include<sys/types.h>
#include<unistd.h>

//函数原型
off_t lseek(int fd,off_t offset ,int whence);

//例子如下
lseek(fd, 0, SEEK_SET); //指向发文件的开头,偏移量为0,

参数fd:要调整的文件的文件描述符;
参数offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移);
参数whence:当前位置的基点,有三个标志
whence为下列其中一种:(SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2).
SEEK_SET 将读写位置指向文件头后再增加offset个位移量。
SEEK_CUR 以目前的读写位置往后增加offset个位移量。
SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现
返回值:成功:文件当前的位置,出错:-1

函数open() close() write() read()例子

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char *argv[])
{
	int fd;
	char buff[30] = {0};

	sprintf( (char *)buff, "/home/c/C/File/%s", argv[1]);
   	fd = open(buff,O_CREAT | O_RDWR, 0777 );	

	if(fd == -1)
	{
 		fprintf(stderr, "file fail\n");
		return -1;
	}
	printf("file %s_%d is successfully ! \n", argv[1], fd);

	int wt_cnt = 0;

	wt_cnt = write(fd, buff, strlen(buff));
	printf("writed num:%d\n", wt_cnt);

	lseek(fd, 0, SEEK_SET);

	int rd_cnt = 0;
	char c;
	
	memset(buff, 0, sizeof(buff) );
	while(read(fd, &c, 1)>0 )
	{
		printf("%c", c);
	}
	printf("read:ok\n");

	close(fd);

	return 0;
}

参考:https://blog.csdn.net/wenwen111111/article/details/57412477

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值