【Linux】C文件系统详解(一)——C文件操作

news2024/11/24 18:49:26

文章目录

  • 文件操作总结
  • 预备知识
      • 结论:
  • C文件操作回顾
    • 语言方案
      • w写入方式
      • a写入方式
      • r只读方式
    • 系统方案
      • 但是这个**没有设置权限**,需要这样改:

文件操作总结

1.文件描述符,重定向,缓冲区,语言和系统关于文件的不同的视角的理解 – 都是要让我们深刻理解文件
2.文件系统
3.动静态库 – a.制作者的角度 b.站在使用者的角度 c.如何理解动态库加载(进程地址空间的内容)

预备知识

1.你真的理解文件原理和操作了吗?这不是语言问题,这是系统的问题
2.是不是只有c/c++有文件操作呢?pytho java php go也有的,但是他们的文件操作的方法是不一样的,如何理解这种现象?有没有一种统一的视角看待所有的语言文件操作呢
3.操作文件的时候,第一件事情,都是打开文件.打开文件是做什么呢,如何理解呢
4.文件 = 内容 + 属性->针对文件的操作,对内容的操作,对属性的操作
5.当文件没有被操作的时候,文件会在磁盘上
6.当我们对文件进行操作时,文件会被放在内存上,因为冯诺依曼体系是这么规定的
7.当我们对文件进行操作时,文件需要提前被load到内存,load的是内容还是属性呢?反正至少得有属性吧
8.当我们对文件进行操作时,文件需要提前被load到内存,是不是只有你一个人在load呢?不是,内存中一定存在大量的不同文件的属性
9.综上->打开文件本质就是将我们需要的文件属性加载到内存中,OS内部一定会同时存在大量的被打开的文件,那么OS要不要管理这些被打开的文件呢?先描述,再组织!构建在内存中的文件对象结构体,struct file{就可以从磁盘来,struct file* next} ,表明被打开的文件
10.文件被打开,是谁在打开呢?OS,但是是谁让OS打开的呢? 用户(进程为代表的)
11.我们之前的所有的文件操作,都是进程和被打开文件的关系
12.进程和被打开文件的关系struct task_structstruct file的关系

结论:

  1. 每一个被打开的文件,都要在OS内创建对应的struct结构体,可以将所有的struct file 结构体用某种数据结构链接起来,在OS内部,对被打开的文件进行管理,就被转换为了对链表的增删查改
    即:文件被打开,OS要为被打开的文件创建对应的内核结构
struct file 
{
	//各种属性
	//各种链接关系
}
  1. 文件其实可以被分成两大类:磁盘文件,被打开的文件(内存文件)

C文件操作回顾

语言方案

w写入方式

w: 默认写方式打开文件,如果文件不存在,就创建它
1.默认如果只是打开,文件内容会自动清空
2.同时,每次进行写入的时候,都会从最开始进行写入
先清空,再写入

#include<stdio.h>
#define LOG "log.txt"
int main()
{
	
	FILE* fp = fopen(LOG,"w");
	if(fp == NULL)
	{
		return perror("fopen");
		//fopen:xxxx
		return 1;	
	}
	//正常进行文件操作
	const char* msg = "hellp lx,hello 2023\n";
	int cnt = 5;
	while(cnt)
	{
		char buffer[256];
		//int fprintf(FILE* stream,const char* format,...)
		//指定文件流,向指定文件打印
		fprintf(fp,"%s:%d:lx\n",msg,cnt)//往文件中输入
		fprintf(stdout,"%s:%d:lx\n",msg,cnt)//linux一切皆文件,stdout对应显示器文件 
		snprintf(buffer,sizeof(buffer),"%s:%d:lx\n"msg,cnt);//输入到自定义缓冲区中
		fputs(buffer,fp);
		
		//fputs(msg,fp);
		cnt--;
	}

	fclose(fp);
	return 0;
}

a写入方式

不会清空文件,而是每一次写入都是从文件结尾写入的,即追加

#include<stdio.h>
#define LOG "log.txt"
int main()
{

	FILE* fp = fopen(LOG,"a");
	if(fp == NULL)
	{
		return perror("fopen");
		//fopen:xxxx
		return 1;	
	}
	//正常进行文件操作
	const char* msg = "aaa\n";
	int cnt = 5;
	while(cnt)
	{
		fputs(msg,fp);
		cnt--;
	}

	fclose(fp);
	return 0;
}

r只读方式

int main()
{
	FILE* fp = fopen(LOG,"r");
	if(fp == NULL)
	{
		return perror("fopen");
		//fopen:xxxx
		return 1;	
	}
	//正常进行文件操作
	while(1)
	{
		char line[128];
		if(fgets(line,sizeof(line),fp) == NULL) break;
		else 
		{
			printf("%s\n",line);
		}
	}

	fclose(fp);
	return 0;
}

系统方案

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
#define LOG "log.txt"
int main()
{
	//fd:文件描述符
	int fd = open(LOG, O_WRONLY | O_CREAT);
	if(fd == -1)
	{
		printf("fd:%d,errno:%d,errorstring:%s\n",fd,errno,strerror(errno));
	}
	else printf("fd:%d,errno:%d,errorstring:%s\n",fd,errno,strerror(errno));

	close(fp);
	return 0;
}

但是这个没有设置权限,需要这样改:

//写和读

//头文件不变
int main()
{
	//fopen(LOG,"w");
	umask(0);//文件权限受掩码的影响
	//fd:文件描述符
	//O_CREAT和O_WRONLY不对原始内容清空
	int fd = open(LOG, O_WRONLY | O_CREAT| O_TRUC, 0666);
	if(fd == -1)
	{
		printf("fd:%d,errno:%d,errorstring:%s\n",fd,errno,strerror(errno));
	}
	else printf("fd:%d,errno:%d,errorstring:%s\n",fd,errno,strerror(errno));
	//C语言,和这个接口的关系是什么呢?
	//C标准库函数底层是调用系统调用

	const char *msg = "hello lx,hollo world";
	
	int cnt = 5;
	while(cnt)
	{
		char line[128];
		snprintf(line,sizeof(line),"%s,%d\n",msg,cnt);
		write(fd,line,strlen(line));
		//这里的strlen不应该加1,因为\0结尾是C语言的规定,不是文件的规定!
	}
	close(fp);
	return 0;
}
//追加(且)写入

int fd = open(LOG, O_WRONLY | O_APPEND | O_CREAT, 0666);
	if(fd == -1)
	{
		printf("fd:%d,errno:%d,errorstring:%s\n",fd,errno,strerror(errno));
	}
	else printf("fd:%d,errno:%d,errorstring:%s\n",fd,errno,strerror(errno));
//读取文件(r)

int fd = open(LOG, O_RDONLY);
	if(fd == -1)
	{
		printf("fd:%d,errno:%d,errorstring:%s\n",fd,errno,strerror(errno));
	}
	else printf("fd:%d,errno:%d,errorstring:%s\n",fd,errno,strerror(errno));

	char buffer[1024];
	// 这里我们无法做到按行读取,我们是整体读取的
	size_t n = read(fd,buffer,sizeof(buffer - 1));//使用系统接口进行IO时,一定要注意\0问题
	if(n > 0)
	{
		buffer[n] = '\0';
		printf("%s\n",buffer);
	}
	

![[Pasted image 20230318122921.png]]

未完待续…

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

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

相关文章

实时音视频方案汇总

若有好的方案欢迎留言讨论&#xff0c;非常感谢&#xff0c;汇总了一些&#xff0c;从市面上了解的一些低时延的端到端的方案&#xff0c;仅供参照&#xff0c;若有问题&#xff0c;也欢迎留言更正&#xff01; 方案 方案描述 时延 备注 1大华同轴高清电缆200米电缆&#xf…

Python 使用difflib库 快速实现批量对比文件差异

关注我们 本文内容仅供学习参考,不足错误之处,还请多多指正,如果喜欢我们,请关注我们,你的支持就是我们最大的动力。 需求来源 霍克是一名软件实施工程师,每次版本升级时,虽然会提供升级相关的清单,但不会详细说明具体的改动点。为了能够更有针对性地验证和测试系统,…

通过 Canal 将 MySQL 数据实时同步到 Easysearch

Canal 是阿里巴巴集团提供的一个开源产品&#xff0c;能够通过解析数据库的增量日志&#xff0c;提供增量数据的订阅和消费功能。使用 Canal 模拟成 MySQL 的 Slave&#xff0c;实时接收 MySQL 的增量数据 binlog&#xff0c;然后通过 RESTful API 将数据写入到 Easysearch 中。…

Spring Boot Actuator:自定义端点

要在Spring Boot Actuator中实现自定义端点&#xff0c;可以按照以下步骤进行操作&#xff1a; 1.创建一个自定义端点类 该类需要使用Endpoint注解进行标记&#xff0c;并使用Component注解将其作为Spring Bean进行管理。 package com.example.highactuator.point;import lo…

Linux项目自动化构建工具:make与Makefile的基本用法

目录 1.什么是makefile 2.快速简单了解make/Makefile的使用 3.背后的知识&#xff1a; 4.依赖关系 5.其他写法 1.什么是makefile 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数&#xff0c;其按类型、功能、模块…

phpStorm Xdebug调试 加FireFox浏览器

步骤1&#xff1a; [Xdebug] zend_extension“D:\phpstudy_pro\Extensions\php\php5.4.45nts\ext\php_xdebug.dll” xdebug.collect_params1 xdebug.collect_return1 xdebug.remote_enableOn xdebug.remote_hostlocalhost xdebug.remote_port9001 xdebug.remote_handlerdbgp ;…

超融合还是虚拟化?一文了解二者的区别、优缺点与传统虚拟化转型方案

超融合作为一种创新的 IT 基础架构&#xff0c;从最初进入市场&#xff0c;到当下成为主流方案&#xff0c;发展速度十分迅猛&#xff0c;且未来趋势依然向好。但对于国内不少用户而言&#xff0c;“超融合”仍是一个新概念&#xff0c;很容易与“虚拟化”相混淆&#xff1a;“…

如何为初创企业选择合适的 ERP 系统?

**ERP系统**是制造、分销、供应链、金融、会计、风险管理等多个行业必不可少的企业技术解决方案。不论垂直行业、企业规模或目标受众如何&#xff0c;将ERP作为企业管理战略的核心部分都非常重要。 对于渴望发展的小型企业和初创企业来说&#xff0c;更是如此。大型企业需要对…

quickapp_快应用_tabBar

tabBar 配置项中配置tabBar(版本兼容)使用tabs组件配置tabBar语法示例问题-切换tab没有反应问题-数据渲染问题解决优化 问题-tab的动态配置 第三方组件tabbar 一般首页都会显示几个tab用于进行页面切换&#xff0c;以下是几种tab配置方式。 配置项中配置tabBar(版本兼容) 在m…

三种快速创建SpringBoot项目的方式

文章目录 在线创建IntelliJ IDEA 创建Maven 创建基本项目结构 SpringBoot 是一个快速开发框架&#xff0c;通过maven依赖的继承方式&#xff0c;帮助我们快速整合第三方常用框架。现在是 Java 领域的绝对霸主。 今天介绍三种快速创建 SpringBoot 项目的方式。 在线创建 1、打…

Uniapp-安装HBuilder调试基座失败解决方案

无法安装原因 有时候我们测试的时候&#xff0c;在手机上插上了线可能因为各种原因没有点击安装或者安装后删除就无法再次安装了&#xff0c;会提示同步资源失败,未得到同步资源的授权,请停止运行后重新运行&#xff0c;而且无论怎么操作都解决不聊这个问题&#xff0c;这是由…

搭建自己的JRebel服务

引入 JRebel插件热部署快速入门教程 上一篇文章有提到如何使用JRebel&#xff0c;其中在激活JRebel那一步骤时咱们使用的激活地址实际就是放在我的个人服务器上&#xff0c;本篇文章咱们手把手的搭建一个个人的JRebel服务。 下载激活工具 下载地址 如下图所示&#xff0c;…

专注于绘画,不受限制!尝试Growly Draw for Mac的快速绘画应用

Growly Draw Mac版是Mac平台上的一款绘画应用&#xff0c;它提供了简单易用的画板页面和多种色彩、画笔工具&#xff0c;让你可以轻松地完成作画。无论你是初学者还是专业人士&#xff0c;都可以在这款应用中找到适合自己的绘画方式。通过使用Growly Draw Mac版&#xff0c;你可…

echarts 实现双y轴折线图示例

该示例有如下几个特点&#xff1a; ①实现tooltip自定义样式&#xff08;echarts 实现tooltip提示框样式自定义-CSDN博客&#xff09; ②legend左右区分展示 ③双y轴折线展示 代码如下&#xff1a; this.options {grid: {left: "3%",right: "3%",top: &…

3GPP TS38.201 NR; Physical layer; General description (Release 18)

TS38.201是介绍性的标准&#xff0c;简单介绍了RAN的信道组成和PHY层承担的功能&#xff0c;下图是PHY层相关标准的关系。 文章目录 结构信道类型调制方式PHY层支持的过程物理层测量其他标准TS 38.202: Physical layer services provided by the physical layerTS 38.211: Ph…

docker笔记14--docker-nerdctl-crictl-ctr使用对比

docker笔记14--docker-nerdctl-crictl-ctr使用对比 介绍工具对比dockernerdctlcrictlctr 注意事项说明 介绍 随着容器云技术的成熟&#xff0c;越来越多的从业者开始接触、熟悉 docker和containerd 了&#xff0c;很多时候需要同时在 docker 和 containerd之间切换&#xff0c…

L1 频段卫星导航射频前端低噪声放大器芯片MS2659

产品简述 MS2659 是一款具有高增益、低噪声系数的低噪声放大器 (LNA) &#xff0c;支持 L1 频段多模式全球卫星定位&#xff0c;可以应用于 GPS 、 北斗二代、伽利略、 GLONASS 等 GNSS 导航接收机中。芯片采 用 SOT23-6 的封装形式。 主要特点 ◼ 支持北斗、 …

java调用c函数

一、关于JNI JNI是Java Native Interface的缩写&#xff0c;JNI是JAVA平台专门用于和本地C代码进行相互操作的API&#xff0c;称为JAVA本地接口。 二、JNI开发流程 1.在JAVA中先声明一个native方法。2.通过javac -h或javah -jni命令导出JNI使用的C头头文件。3.使用C实现本地方…

科普丨企业防泄密软件是什么

企业防泄密软件是一种专门设计用于保护企业敏感信息不被泄露的软件产品。这类软件通常采用多种安全技术和策略&#xff0c;以增强企业数据的安全性和保密性&#xff0c;防止核心知识产权和商业机密的泄露。 域之盾软件----企业防泄密软件的主要功能包括&#xff1a; 1、数据加密…

16位 (MCU) R7F101G6G3CSP、R7F101G6E3CSP、R7F101G6G2DSP、R7F101G6E2DSP是新一代RL78通用微控制器

产品描述 RL78/G24微控制器具有RL78系列MCU的最高处理性能&#xff0c;CPU工作频率高达48MHz&#xff0c;设有灵活的应用加速器 (FAA)。FAA是一款专门用于算法运算的协处理器&#xff0c;可以独立于CPU运行&#xff0c;提供更高处理能力。RL78/G24 MCU具有增强的模拟功能和大量…