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:文件结束位置 
返回值:光标现在所在的位置 
*/
相关推荐
良木生香3 分钟前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
Kurisu_红莉栖1 小时前
c++复习——const,static字
c++
czxyvX1 小时前
1-Qt概述
c++·qt
齐鲁大虾1 小时前
新人编程语言选择指南
javascript·c++·python·c#
Eyfcom1 小时前
快递管理系统:从“功能实现”到“人性化体验”与“客户洞察”的技术跃迁
c语言·系统架构·快递管理系统
CoderMeijun2 小时前
C++ 多线程进阶:Lambda、条件变量与死锁
c++·多线程·条件变量·lambda·死锁·生产者消费者
unicrom_深圳市由你创科技2 小时前
上位机开发常用的语言 / 框架有哪些?
c++·python·c#
|_⊙3 小时前
C++ 智能指针
开发语言·c++
代码中介商3 小时前
C语言指针深度解析:从数组指针到函数指针
c语言·开发语言
Jasmine_llq3 小时前
《B4356 [GESP202506 二级] 数三角形》
开发语言·c++·双重循环枚举算法·顺序输入输出算法·去重枚举算法·整除判断算法·计数统计算法