当前位置: 首页 > news >正文

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

文章目录

  • 文件操作总结
  • 预备知识
      • 结论:
  • 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:xxxxreturn 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:xxxxreturn 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:xxxxreturn 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]]

未完待续…

相关文章:

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

文章目录 文件操作总结预备知识结论: C文件操作回顾语言方案w写入方式a写入方式r只读方式 系统方案但是这个**没有设置权限**,需要这样改: 文件操作总结 1.文件描述符,重定向,缓冲区,语言和系统关于文件的不同的视角的理解 – 都是要让我们深刻理解文件 2.文件系统 3.动静态库 …...

uniapp 实现微信小程序手机号一键登录

app 和 h5 手机号一键登录&#xff0c;参考文档&#xff1a;uni-app官网 以下是uniapp 实现微信小程序手机号一键登录 1、布局 <template><view class"mainContent"><image class"closeImg" click"onCloseClick"src"quic…...

基于 Java 解释一下硬编码和非硬编码?

基于 Java 解释一下硬编码和非硬编码&#xff1f; 文章目录 基于 Java 解释一下硬编码和非硬编码&#xff1f;一、基本说明二、硬编码&#xff08;Hardcoding&#xff09;三、非硬编码 一、基本说明 硬编码和非硬编码是指软件开发中配置数据和变量处理方式的概念。 二、硬编码…...

【机器学习7】优化算法

1 有监督学习的损失函数 1.1 分类问题 对二分类问题&#xff0c; Y{1,−1}&#xff0c; 我们希望sign f(xi,θ)yi&#xff0c; 最自然的损失函数是0-1损失&#xff0c; 函数定义特点0-1损失函数非凸、非光滑&#xff0c;很难直接对该函数进行优化Hinge损失函数当fy≥1时&…...

常见的近似算法

前言 最近有个项目要用到近似算法&#xff0c;就到处摸了下&#xff0c;整理了一个小结。 近似算法统计 在Java中&#xff0c;你可以使用各种近似算法来解决不精确但接近于最优解的问题。以下是几种常见的近似算法的实现方法&#xff1a; 贪心算法&#xff08;Greedy Algori…...

【完整详细】IntelliJ IDEA中使用Docker插件一键部署前后端分离项目

前言:在使用Docker部署我们的前后端分离项目的时候,会涉及到一堆且重复的Docker命令,久而久之就会被这些重复性的操作感到繁琐,本篇博客教学大家如何通过IDEA自带的一款插件就可以实现一键部署前后端分离项目的操作,从头到尾我写的非常详细,大家逐步阅读即可。 博主的其他…...

ubuntu20.04 安装TensorRT,解决依赖问题

1.下载Tensor RT对应的deb包 先要确保cuda和cudnn安装好&#xff0c;https://blog.csdn.net/qq_41246375/article/details/115597025 下载tensor RT&#xff0c;注意版本对应关系 https://developer.nvidia.com/nvidia-tensorrt-8x-download 2.安装 按照官方步骤 https://d…...

你知道如何科学的学习吗?-关于个人成长的思考

背景 最近在翻看自己工作后的笔记&#xff0c;从有道云笔记到印象笔记&#xff0c;到本地笔记&#xff0c;到自己使用github搭建的博客&#xff0c;到语雀笔记&#xff0c;使用了不同的平台工具&#xff1b;零零总总记录了许多学习笔记、个人成长笔记、职业规划等内容。现在看…...

Java学习之路 —— 多线程

文章目录 1. 线程创建方式1.1 继承Thread1.2 声明一个实现Runnable接口的类1.3 利用Callable接口、FutureTask类来实现 2. 线程同步2.1 同步代码块2.2 同步方法2.3 Lock锁 3. 线程同步4. 线程池 1. 线程创建方式 1.1 继承Thread 定义子类&#xff0c;继承Thread&#xff0c;创…...

【云原生-Kurbernetes篇】K8s的存储卷/数据卷+PV与PVC

这是一个目录标题 一、Kurbernetes中的存储卷1.1 为什么需要存储卷&#xff1f;1.2 存储卷概述1.2.1 简介1.2.2 volume字段 1.3 常用的存储卷类型1.3.1 emptyDir&#xff08;临时存储卷&#xff09;1.3.2 hostPath&#xff08;节点存储卷&#xff09;1.3.3 nfs1.3.4 cephfs 二、…...

二层、三层交换机之间到底有什么区别?

简单地说 二层交换机&#xff0c;没有充当三层网关角色的能力&#xff08;Capability&#xff09;。三层交换机&#xff0c;首先也是二层交换机。但是&#xff0c;它有一个额外的能力&#xff08;Capability&#xff09;&#xff0c;软件配置一下&#xff0c;可以充当三层网关…...

【论文阅读】2736. 最大和查询-2023.11.17

题目&#xff1a; 2736. 最大和查询 给你两个长度为 n 、下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;另给你一个下标从 1 开始的二维数组 queries &#xff0c;其中 queries[i] [xi, yi] 。 对于第 i 个查询&#xff0c;在所有满足 nums1[j] > xi 且 nums2[j]…...

2. zk集群部署

简介 上一篇文章我们已经把环境准备好了&#xff0c;jdk也配置好了&#xff0c;下面我们开始把zk部署起来 hadoop环境准备 创建zk用户 useradd zk -d /home/zk echo "1q1w1e1r" | passwd --stdin zk上传zk包 拷贝zk包到/home/zk目录,这里的zk版本为 3.6.3 scp…...

抖音快手判断性别、年龄自动关注脚本,按键精灵开源代码!

这个是支持抖音和快手两个平台的&#xff0c;可以进入对方主页然后判断对方年龄和性别&#xff0c;符合条件的关注&#xff0c;不符合条件的跳过下一个ID&#xff0c;所以比较精准&#xff0c;当然你可以二次开发加入更多的平台&#xff0c;小红书之类的&#xff0c;仅供学习&a…...

IDEA软件使用步骤

1.IDEA概述 IDEA全称InelliJ IDEA,是用于java语言开发的集成环境&#xff0c;它是业界公认的目前用于Java程序开发最好的工具。 集成环境&#xff1a;把代码编写&#xff0c;编译&#xff0c;执行&#xff0c;调试扽过多种功能综合到一起的开发工具。 下载&#xff1a;https…...

设计模式-11-模板模式

经典的设计模式有23种&#xff0c;但是常用的设计模式一般情况下不会到一半&#xff0c;我们就针对一些常用的设计模式进行一些详细的讲解和分析&#xff0c;方便大家更加容易理解和使用设计模式。 1-什么是模板模式 模板模式&#xff0c;全称是模板方法设计模式&#xff0c;英…...

【技术分享】EIGRP stub实验

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【微/信/公/众/号&#xff1a;厦门微思网络】 拓扑图&#xff1a; R1配置&#xff1a; route…...

Python 爬虫 AES DES加密反爬

当你遇到需要处理 AES 或 DES 加密的反爬虫机制时&#xff0c;Python 可以通过使用相应的库来解决这类问题。首先&#xff0c;我们需要理解 AES 和 DES 加密是什么&#xff1a; AES (Advanced Encryption Standard)&#xff1a;一种广泛使用的对称加密算法&#xff0c;它使用相…...

(论文阅读30/100)Convolutional Pose Machines

30.文献阅读笔记CPMs 简介 题目 Convolutional Pose Machines 作者 Shih-En Wei, Varun Ramakrishna, Takeo Kanade, and Yaser Sheikh, CVPR, 2016. 原文链接 https://arxiv.org/pdf/1602.00134.pdf 关键词 Convolutional Pose Machines&#xff08;CPMs&#xff09;…...

vue3实现数据大屏内数据向上滚动,鼠标进入停止滚动 vue3+Vue3SeamlessScroll

1.效果图 2.npm下载依赖及main.js文件配置 npm install vue3-seamless-scroll --saveimport vue3SeamlessScroll from vue3-seamless-scroll;app.use(vue3SeamlessScroll) 3.html代码 <!-- scrollFlag为true时再渲染,vue3只要涉及到传值子页面需要加flag判断&#xff0c;否…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

统计学(第8版)——统计抽样学习笔记(考试用)

一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征&#xff08;均值、比率、总量&#xff09;控制抽样误差与非抽样误差 解决的核心问题 在成本约束下&#xff0c;用少量样本准确推断总体特征量化估计结果的可靠性&#xff08;置…...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL&#xff08;Software OpenGL&#xff09;‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式&#xff08;包括几何处理、光栅化、着色等&#xff09;&#xff0c;不依赖GPU硬件加速。这种模式通常性能较低&#xff0c;但兼容性极强&#xff0c;常用于不支持硬件加速…...

[C++错误经验]case语句跳过变量初始化

标题&#xff1a;[C错误经验]case语句跳过变量初始化 水墨不写bug 文章目录 一、错误信息复现二、错误分析三、解决方法 一、错误信息复现 write.cc:80:14: error: jump to case label80 | case 2:| ^ write.cc:76:20: note: crosses initialization…...