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

文章目录

  • [1. 文件描述符](#1. 文件描述符)
  • [2. 文件IO常用函数](#2. 文件IO常用函数)
    • 2.1打开文件:open
    • [2.2 关闭文件:close](#2.2 关闭文件:close)
    • [2.3 读写操作:read/write](#2.3 读写操作:read/write)
    • [2.4 关于光标的操作:lseek](#2.4 关于光标的操作:lseek)

1. 文件描述符

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

2. 文件IO常用函数

2.1打开文件:open

  1. 函数介绍:
cpp 复制代码
#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下文件权限相关内容(包含对数字的解释)

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

2.2 关闭文件:close

  1. 函数介绍:
cpp 复制代码
#include <unistd.h> 

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

函数介绍:

cpp 复制代码
#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

函数介绍:

cpp 复制代码
#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:文件结束位置 
返回值:光标现在所在的位置 
*/
相关推荐
xinghuitunan1 小时前
蓝桥杯顺子日期(填空题)
c语言·蓝桥杯
van叶~1 小时前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
Half-up1 小时前
C语言心型代码解析
c语言·开发语言
knighthood20011 小时前
解决:ros进行gazebo仿真,rviz没有显示传感器数据
c++·ubuntu·ros
懒大王就是我1 小时前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
半盏茶香1 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
小堇不是码农2 小时前
在VScode中配置C_C++环境
c语言·c++·vscode
Jack黄从零学c++2 小时前
C++ 的异常处理详解
c++·经验分享
小肥象不是小飞象2 小时前
(六千字心得笔记)零基础C语言入门第八课——函数(上)
c语言·开发语言·笔记·1024程序员节
励志成为嵌入式工程师7 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim