文件IO----(open、close、read、write、lseek)

news2024/11/15 11:50:11

1.文件IO

介绍:(系统IO、系统调用)
POSIX(可移植操作系统接口)定义的一组函数,不提供缓冲机制,每次读写操作都引起系统调用,核心概念是文件描述符,访问各种文件类型,Linux下,标准IO基于文件IO实现

操作标准IO文件IO
打开fopen,freopen,fdopenopen
关闭fcloseclose
getc,fgetc,getchar,fgets,gets,freadread
putc,fputc,putchar,fputs,puts,fwritewrite

文件描述符:
每个打开的文件都对应一个文件描述符
文件描述符是一个非负整数。Linux为程序中每个打开的文件分配一个文件描述符
文件描述符从0开始分配,依次递增
文件IO操作通过文件描述符来完成

2.文件IO打开使用

文件IO——open
open函数用来创建或打开一个文件

#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);
int creat(const char *pathname, mode_t mode);

成功时返回文件描述符,出错时返回EOF

  • 打开文件时使用两个参数
  • 创建文件时第三个参数指定新文件的的权限,(只有在建立新文件时有效)此外真正创建文件的权限会受到umask值影响,实际权限是mode-umasks
  • 可以打开设备文件,但是不能创建设备文件(创建设备文件,需要先申请设备号,定义声明设备对象等操作后,用mknod创建设备文件)

在这里插入图片描述
模式对比:

标准IO文件IO
rO_RDONLY
r+O_RDWR
wO_WRONLY 或 O_CREAT 或 O_TRUNC
w+O_RDWR 或 O_CREAT 或 O_TRUNC
aO_WRONLY 或 O_CREAT 或 O_APPEND
a+O_RDWR或 O_CREAT 或 O_APPEND

文件权限:

  • umask:用来设定文件或目录的初始权限
  • 文件或目录的初始权限 = 文件或目录的最大默认权限 - umask值
    对文件来讲,其可拥有的最大默认权限是 666,即 rw-rw-rw-
    对目录来讲,其可拥有的最大默认权限是 777,即 rwxrwxrwx

代码验证:

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

int main(int argc, char* argv[])
{
	int fd = -1;
	fd = open("test.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
	if(fd < 0){
		printf("open file err\n");
		return 0;
	}
	printf("open file success\n");
	return 0;
}

在这里插入图片描述
在这里插入图片描述
可以看到,文件打开成功,并且文件的权限为rw-rw-r–,也就是110110100,即664,我们设置的mode为666,查看当前用户的umask值:0002,则文件的实际权限为mode-umask=666-002=664

3.文件IO文件的关闭

文件IO----close
close函数用来关闭一个打开的文件:
#include <unistd.h>
int close(int fd);
成功时返回0,出错返回EOF
程序结束时,自动关闭所有打开的文件
文件关闭后,文件描述符不在代表文件

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

int main(int argc, char* argv[])
{
	int fd = -1;
	fd = open("test.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
	if(fd < 0){
		printf("open file err\n");
		return 0;
	}
	printf("open file success,fd = %d\n",fd);

	int ret = close(fd);
	if(ret < 0){
		printf("close failed\n");
	}
	fd = -1;
	
	return 0;
}

4.文件IO的读写定位

文件IO—read
read函数用来从文件中读取数据
#include <unistd.h>
ssize_t read(int fd,viod * buff,size_t count);
成功返回实际读取的字节数,出错返回EOF
读到文件末尾时,返回0
buff是接收数据的缓存区
count,要读的数据量,不应超过buf大小

文件IO—write
write函数用来向文件写入数据
#include <unistd.h>
ssize_t write(int fd,void * buff,size_t count);
成功返回实际写入的字节数,出错返回EOF
buff是发送数据的缓存区
count,要写的数据量,不应超过buf大小

文件IO—lseek
#include <unistd.h>
off_t lseek(int fd,off_t offset,int whence);
成功时返回当前文件读写位置,出错时返回EOF
offset:偏移量,可正可负
whence:SEEK_SET/SEEK_CUR/SEEK_END
SEEK_SET:从距离文件开头offset位移量为新的读写位置
SEEK_CUR:以目前的位置往后增加offset位移量为新的读写位置
SEEK_END:从距离文件末尾开始offset位移量为新的读写位置

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char* argv[])
{
	int fd = -1;
	int ret = 0;
	char buf[32] = "Hello world";
	char buf2[32] = {0};

	fd = open("test.txt",O_RDWR|O_CREAT|O_APPEND,0666);
	if(fd < 0){
		printf("open file err\n");
		return 0;
	}
	printf("open file success,fd = %d\n",fd);
	
	ret = write(fd,buf,strlen(buf));
	if(ret < 0){
		perror("Write");
		goto END;
	}
	printf("write count = %d\n",ret);

	lseek(fd,0,SEEK_SET);
	ret = read(fd,buf2,32);
	if(ret < 0){
		perror("read");
		goto END;
	}
	printf("read count = %d,%s\n",ret,buf2);

END:
	ret = close(fd);
	if(ret < 0){
		printf("close failed\n");
	}
	fd = -1;
	printf("close success\n");
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Keychron 键盘指南

文章目录QQ1Q2Q3Q4Q5KK1K2k3 && k3proK3 VS K7k6 && K6prok7K8k10K12K14CVV1V2V3V4V5V6SQ Q1 Q1 是一款革命性的全金属键盘&#xff0c;每个开关、键帽、稳定器、旋钮甚至面板都具有可定制的功能。它专为个性化体验和卓越的打字舒适度而设计。 双垫片设计…

Cadence PCB仿真使用Allegro PCB SI配置仿真库的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI软件选择需要仿真的网络的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可这样…

模型微调,低预算,高期望!

作为迁移学习中的常用技术&#xff0c;Fine-tuning&#xff08;微调&#xff09;已经成为了深度学习革命的重要部分。微调不需要针对新任务从头开始学习&#xff0c;只需要加载预训练模型的参数&#xff0c;然后利用新任务的数据进行一步训练模型即可。也可以说微调是对开放域任…

一文简单了解并部署Zookeeper集群

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;蟹黄瓜子文章来源&#xff1a;GreatSQL社区投稿 1.Zookeeper概述 Zookeeper对于很多人开始可能都有所耳闻&am…

基于Java+SpringBoot+vue+element实现爱心捐赠平台系统

基于JavaSpringBootvueelement实现爱心捐赠平台系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

排他思想的运用

思路简述 需求&#xff1a;桌子上有一排灯&#xff0c;点哪个亮哪个&#xff0c;但是要求每次只能点亮一盏。如果不使用排他思想&#xff0c;操作过程如下&#xff1a; 第一次打开一盏灯&#xff0c;记为 A&#xff0c;记录下来。第二次打开灯之前&#xff0c;先去找记录&…

[cpp进阶]C++智能指针

文章目录为什么需要智能指针?智能指针的原理及使用智能指针的原理智能指针的使用C中的智能指针C智能指针的发展历程std::auto_ptrstd::auto_ptr的使用std::auto_ptr的模拟实现std::unique_ptrstd::unique_ptr的使用std::unique_ptr的模拟实现std::shared_ptrstd::shared_ptr的…

Springboot @InitBinder处理from-data表单传参,指定参数默认新增前缀

前言 有兄弟突然找到我&#xff0c;江湖救急&#xff0c;我以为是啥问题呢&#xff1f; 一看这位小兄弟也是半路出家&#xff0c; 没有对springboot的常用注解有过研究。 不过没大碍&#xff0c;还是那句话&#xff0c; 学习的事情&#xff0c;只有先知和后知 现在你看完这篇…

纳米软件分享:光伏逆变器ATE测试系统,逆变器测试解决方案

光伏并网逆变器&#xff08;以下简称“逆变器”&#xff09;是光伏发电系统的核心部件之一&#xff0c;其主要功能是将光伏阵列的直流逆变为符合电网接入要求的交流电并入电网。并网逆变器ATE测试平台&#xff0c;主要是模拟光伏阵列特性输入的直流电源、模拟电网电源、系统控制…

Java垃圾分类查询管理系统源码+数据库,基于SpringBoot+mybatis-plus,垃圾分类查询及预约上门回收

垃圾分类查询管理系统 完整代码下载地址&#xff1a;Java垃圾分类查询管理系统源码数据库 1.介绍 垃圾分类查询管理系统&#xff0c;对不懂的垃圾进行查询进行分类并可以预约上门回收垃圾。 让用户自己分类垃圾&#xff0c; 按国家标准自己分类&#xff0c; 然后在网上提交订…

java学习之main方法

目录 一、main方法的注意事项 二、在IDEA中传入参数 一、main方法的注意事项 形式&#xff1a;public static void main(String[] args){}&#xff0c;main方法是一个静态方法&#xff0c;访问修饰符是&#xff1a;public&#xff0c;形参是String数组 args 注意事项&#xf…

go语言--函数

package mainimport "fmt"func main(){//功能: 10 20var num1 int 10var num2 int 20var sum int 0sum num1sum num2fmt.Println(sum) }为什么使用函数 提高代码的复用性&#xff0c;减少代码冗余, 代码维护性也提高了 函数的定义 为完成摸一个功能的程序指令(…

IRCNN-FPOCS 文章解读

1、论文概述 1&#xff09;待解决的问题&#xff1a;地震道数据缺失&#xff08;野外地震数据的质量往往受到地质环境或设备参数的影响&#xff0c;这些数据可能在空间上不连续&#xff0c;导致地震痕迹缺失&#xff0c;也称为下采样观测&#xff09; 2&#xff09;目的&…

从菜鸟到团队协同大神:产品经理工具技能修炼

现在&#xff0c;自雇人士和自由职业者越来越普遍。受环境影响&#xff0c;员工们正在放弃朝九晚五的工作&#xff0c;转而采用更灵活的远程工作&#xff0c;另一方面&#xff0c;随着办公数字化转型、远程办公的需求强烈、在线协协同管理工具飞项等一批知名互联网工具如雨后春…

c#入门-捕获变量

局部变量捕获 局部函数&#xff0c;匿名函数&#xff0c;可以直接在函数体内使用局部变量。 如果作为委托使用&#xff0c;传递给别人。可能在别人使用委托的时候&#xff0c;这些局部变量的作用域就已经消失了。 因此&#xff0c;编译器会对这些变量做出特殊的操作&#xff…

优维低代码:I18n 国际化

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 连载…

第8季3:使用字库字符实现区域显示

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、代码框架分析 在第8季2&#xff1a;OSD实验演示与代码分析中&#xff0c;我们分析了SAMPLE_RGN_CreateVideoRegion函数&#xff0c;该函数完成了左下角的logo区域显示、右下角的时间区域显示&a…

Ubuntu18.04安装教程

Ubuntu18.04安装教程# 阿里云源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates ma…

【Vue+Springboot】综合程序设计后端部分实现(含跨越访问)

文章目录1、功能展示2、前端部分&#xff1a;VueAPI3、后端部分&#xff1a;Springboot1、功能展示 大致分为用户管理&#xff0c;商品管理&#xff0c;收藏管理&#xff0c;购物车管理&#xff0c;订单管理五个模块。 2、前端部分&#xff1a;VueAPI Vue 使用 axios 库进行网…

如何在Unity中实现MVC模式?

MVC是什么&#xff1f; ​ MVC即Model View Controller&#xff0c;是模型(model)【数据层】&#xff0d;视图(view)【表现层】&#xff0d;控制器(controller)【逻辑层】的缩写。主要应用于网站开发&#xff0c;在游戏开发方面&#xff0c;因为不同游戏的需求、功能不尽相同&…