9.3 Linux_I/O_文件I/O相关函数

打开与关闭

1、打开文件

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

返回值:成功返回文件描述符,失败返回EOF

pathname:文件路径

flags:标志,其中O_RDONLY、O_WRONLY、O_RDWR三个互斥,其余可用 ' | ' 链接

标志名 含义
O_RDONLY 只读方式打开
O_WRONLY 只写方式打开
O_RDWR 可读可写方式打开
O_CREAT 文件不存在则创建,此时mode参数有效
O_EXCL 与O_CREAT搭配使用,测试文件是否存在,存在返回错误
O_TRUNC 若文件存在,则清除文件原有的内容
O_APPEND 以尾部插入的方式进行写入

mode:表示文件的权限,是可读可写可执行,以八进制表示。实际权限 = mode & (~umask) 

具体权限参考博文"4.Linux_Shell命令"中的"3、修改文件权限“章节,博文链接如下:

4.Linux_Shell命令-****博客

注意:open函数只能打开设备文件,不能创建设备文件

2、关闭文件

int close(int fd);

返回值:成功返回0,失败返回EOF

fd:要关闭的文件描述符

注意:文件关闭后,fd不再能代表文件

读写与光标

读写文件的使用方式与标准I/O中的fread、fwrite非常相似。

1、读取文件

ssize_t read(int fd, void *buf, size_t count);

返回值:成功返回实际读取的大小,失败返回EOF,读取到末尾返回0

fd:要进行操作的文件的文件描述符

buf:读取数据缓冲区,用于存放读取的数据

count:想要读取数据的个数,单位:字节

注意:返回值不一定等于count,假如文件只有3个字节,count传入5,那么返回值是3

注意:count值不能超过buf的大小

注意:read不会因为遇到回车就停止读取,只有读完count个字节后才会停止

2、写入文件

ssize_t write(int fd, const void *buf, size_t count);

返回值:成功返回实际写入的大小,失败返回EOF

fd:要进行操作的文件的文件描述符

buf:写入数据缓冲区,用于存放要写入的数据

count:想要写入的数据个数,单位:字节

3、定位文件

off_t lseek(int fd, off_t offset, int whence);

返回值:成功返回当前文件读写位置,失败返回EOF

offset、whence含义与fseek完全一致,参考博文"9.2 Linux_标准I/O_相关函数"的"2、流定位"章节,博文链接为:9.2 Linux_标准I/O_相关函数-****博客

整体实验

具体代码实现如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
int main(){
	int fd;
	char read_buf[100] = {0};
	//1.打开文件
	if((fd = open("./file",O_RDWR|O_CREAT|O_TRUNC,0777)) == -1){
		perror("open");
		return -1;
	}
	//2.写入数据
	if(write(fd,"write\n",strlen("write\n")) == -1){
		perror("write");
		return -1;
	}
	//3.重置光标
	lseek(fd,0,SEEK_SET);
	//4.读取数据
	read(fd,read_buf,sizeof(read_buf));
	printf("read:%s",read_buf);
	//5.关闭文件
	close(fd);
	return 0;
}

代码运行结果如下:

上一篇:Github 2024-09-25 C开源项目日报 Top9


下一篇:Redis主从架构和高可用性实现