C/C++文件IO常用函数总结

1. 文件描述符

  • 文件描述符的本质是一个大于等于0的整数,在使用open函数打开文件时,就会产生一个用于操作文件的句柄,这就是文件描述符。
  • 在一个进程中,能够打开的文件描述符是有限制的,一般是1024个,[0,1023],可以通过指令 ulimit -a进行查看,如果要更改这个限制,可以通过指令 ulimit -n 数字,进行更改。
  • 文件描述符的使用原则一般是最小未分配原则。
  • 特殊的文件描述符:0、1、2,这三个文件描述符在一个进程启动时就默认被打开了,分别表示标准输入、标准输出、标准错误

2. 文件IO常用函数

2.1打开文件:open

  1. 函数介绍:
#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:要打开的文件文件路径

参数2:打开模式 以下三种方式必须选其一:O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)
除了上面三个参数之外,以下的打开方式可以有零个或多个,跟上述的方式一起用位或运算连接到一起。
O_CREAT:用于创建文件,如果文件不存在,则创建文件,如果文件存在,则打开文件,
	如果flag中包含了该模式,则函数的第三个参数必须要加上。
O_APPEND:以追加的形式打开文件,光标定位在结尾。
O_TRUNC:清空文件。
O_EXCL:常跟O_CREAT一起使用,确保本次要创建一个新文件,如果文件已经存在,则open函数报错。

参数3:如果参数2中的flag中有O_CREAT时,表示创建新文件,参数3就必须给定,表示新创建的文件的权限。 
	如果当前参数给定了创建的文件权限,最终的结果也不一定是参数3的值。
	系统会用你给定的参数3的值,与系统的umask取反的值进行位与运算后,才是最终创建文件的权限,
	即:(mode & (~umask))
	
返回值:成功返回打开文件的文件描述符,失败返回-1并置位错误码。
*/

普通文件的权限一般为:0644,表示当前用户没有可执行权限,当前组中其他用户和其他组中的用户都只有读权限;目录文件的权限一般为:0755,表示当前用户具有可读、可写、可执行,当前组中其他用户和其他组中的用户都没有可写权限。
注意:如果不给权限,那么当前创建的权限会是一个随机值。

补充1:Linux下文件权限相关内容(包含对数字的解释)

Linux下文件权限相关内容

补充2:fopen()open()对应参数

在这里插入图片描述

2.2 关闭文件:close

  1. 函数介绍:
#include <unistd.h> 

int close(int fd); 
/*
功能:关闭文件描述符对应的文件 
参数:文件描述符 
返回值:成功返回0,失败返回-1并置位错误码
*/
  1. 示例代码:
#include<myhead.h> 

int main(int argc, const char *argv[]) 
{ 
	//1、定义文件描述符,对于文件IO而言,句柄就是文件描述符 
	int fd = -1; //以只读的形式创建文件,如果文件不存在则创建文件 
	//如果创建文件时没有给权限,则该文件的权限是随机权限 
	//如果创建文件时,给定了文件的权限,则文件最终的权限是 给定的 mode & (~umask)
	if((fd = open("./tt.txt", O_WRONLY|O_CREAT, 0644)) == -1) 
	{ 
		perror("open error"); 
		return -1; 
	}
	printf("open success fd = %d\n", fd); //3,由于0、1、2已经被使用,所以该数为3
	//关闭文件 
	close(fd); //关闭fd引用的文件 
	return 0; 
}

2.3 读写操作:read/write

函数介绍:

#include <unistd.h> 

ssize_t read(int fd, void *buf, size_t count);
/*
功能:从fd文件描述符引用的文件中读取count的字符放入buf对应的容器中 
参数1:已经打开文件对应的文件描述符 
参数2:容器的起始地址 
参数3:要读取的字符个数 
返回值:成功返回读取的字符个数,这个个数可能会小于count的值,失败返回-1并置位错误码
*/

#include <unistd.h> 

ssize_t write(int fd, const void *buf, size_t count); 
/*
功能:将buf容器中的count个数据,写入到fd引用的文件中 
参数1:已经打开的文件的文件描述符 
参数2:要写入的数据的起始地址 
参数3:要写入数据的个数 
返回值:成功返回写入的字符个数,这个个数可能小于count,失败返回-1并置位错误码
*/

2.4 关于光标的操作:lseek

函数介绍:

#include <sys/types.h> 
#include <unistd.h> 

off_t lseek(int fd, off_t offset, int whence); 
/*
功能:移动光标的位置,并返回光标现在所在的位置 
参数1:文件描述符 
参数2:偏移量
	>0:表示从指定位置向后偏移n个字节 
	><0:表示从指定位置向前偏移n个字节 
	>=0:在指定位置处不偏移 
参数3:偏移的起始位置 
	SEEK_SET:文件起始位置 
	SEEK_CUR:文件指针当前位置 
	SEEK_END:文件结束位置 
返回值:光标现在所在的位置 
*/
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值