【Linux学习】基础IO

目录

八.系统文件IO

        8.1 前言

        8.2 C语言文件IO

C语言常用的基本函数

C语言默认打开的的三个流

        8.3 系统文件IO

open接口

close接口

write接口

read接口

        8.4 C语言文件IO与系统文件IO的关系


八.系统文件IO

        8.1 前言

系统文件 I/O(输入/输出)是指在计算机系统中,通过操作系统提供的接口和函数,实现应用程序与文件系统之间的数据交互操作.这种交互涉及到从外部存储设备(通常是硬盘)读取数据到内存中,或将内存中的数据写入到外部存储设备中.

这里我们结合最初的知识从整体上认识系统文件IO

【Linux学习】初识进程 | 进程概念-CSDN博客

 顾名思义,这次我们讲到的系统文件IO正是处于操作系统层面的工作.

        8.2 C语言文件IO

C语言常用的基本函数

在学习C语言时我们便已经接触过许多语言层面上的IO函数

1.open: 打开文件

FILE *fopen(const char *filename, const char *mode);
filename:文件路径
mode:打开文件的模式,例如 "r"(读取)、"w"(写入)、"a"(追加)等

2.fclose: 关闭文件

int fclose(FILE *stream);
stream:指向 FILE 结构的指针,表示要关闭的文件

3.fprintf: 向文件写入格式化数据

int fprintf(FILE *stream, const char *format, ...);
stream:指向 FILE 结构的指针,表示要写入的文件
format:格式化字符串,类似于 printf 中的格式化字符串


4.fscanf: 从文件读取格式化数据

int fscanf(FILE *stream, const char *format, ...);
stream:指向 FILE 结构的指针,表示要读取的文件
format:格式化字符串,指定了要读取的数据的格式


5.fputc: 写入一个字符到文件

int fputc(int character, FILE *stream);
character:要写入的字符
stream:指向 FILE 结构的指针,表示要写入的文件


6.fgetc: 从文件读取一个字符

int fgetc(FILE *stream);
stream:指向 FILE 结构的指针,表示要读取的文件


7.fwrite: 向文件写入一块数据

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
ptr:指向要写入的数据的指针
size:每个数据项的大小(以字节为单位)
count:要写入的数据项的数量
stream:指向 FILE 结构的指针,表示要写入的文件


8.fread: 从文件读取一块数据

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
ptr:指向存储读取数据的缓冲区的指针
size:每个数据项的大小(以字节为单位)
count:要读取的数据项的数量。
stream:指向 FILE 结构的指针,表示要读取的文件


9.feof: 检查文件结束标志

int feof(FILE *stream);
stream:指向 FILE 结构的指针,表示要检查的文件


10.rewind: 将文件位置指针重置到文件开头

void rewind(FILE *stream);
stream:指向 FILE 结构的指针,表示要重置的文件


这些函数是 C 语言中进行文件 I/O 操作的基本函数,通过它们,你可以打开、读取、写入和关闭文件,实现对文件的各种操作

C语言默认打开的的三个流

在 C 语言中,有三个默认打开的标准 I/O 流,它们是:

  1. 标准输入流 (stdin):

    • 文件描述符:0
    • 默认与键盘关联,用于从用户获取输入
  2. 标准输出流 (stdout):

    • 文件描述符:1
    • 默认与屏幕关联,用于向用户输出数据
  3. 标准错误流 (stderr):

    • 文件描述符:2
    • 默认与屏幕关联,用于输出错误消息

这里我们可以在Linux下使用man手册查找

这里我们可以发现三个流的数据类型都是FILE*类型.同时也体现出了Linux系统一切皆文件的设计哲学.

既然是当作文件,那么我们就用上面提到的C语言提供的 fprintf函数来进行测试

#include <stdio.h>
int main() { 
    // 使用标准输入输出消息
    fprintf(stdin, "This is an in  message.\n");
    // 使用标准输出输出消息
    fprintf(stdout, "This is an out message.\n");
    // 使用标准错误输出消息
    fprintf(stderr, "This is an error message.\n");
    return 0;
}

 这里我们成功通过 fprintf()  向显示器输出了两条信息,进一步验证了stderr与stdout默认与显示器相关 而stdin默认与键盘相关.

        8.3 系统文件IO

open接口

用于打开或创建文件的系统调用,通常用于在程序中获取文件描述符,以便后续进行文件 I/O 操作

这里通过man手册查看其函数原型

参数:

1.pathname: 要打开或创建的目标文件

  • 若pathname以路径的方式给出,则需要创建该文件时,在pathname路径下进行创建
  • 若pathname以文件名的方式给出,则需要创建该文件时,默认在当前路径下进行创建

2.flags: 表示打开文件的标志

  • O_RDONLY: 只读打开
  • O_WRONLY: 只写打开
  • O_RDWR : 读,写打开                                                                                                                         这三个常量,必须指定一个且只能指定一个
  • O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
  • O_APPEND: 追加写
  • O_TRUNC:如果文件存在,截断文件为零长度

打开文件时,可以传入多个参数选项,当有多个选项传入时,将这些选项用“或”运算符隔开
例如,若想以只写的方式打开文件,但当目标文件不存在时自动创建文件,则参数设置如下:

O_WRONLY | O_CREAT

这里主要是用到了位图的思想

传入的flags类型为整数,也就是有32个bit位

而每个bit位的状态只会是0或1,这时我们可以使用一个bit位来对应一种参数是否传入,也就是定义为如果某一bit位为1,则对应参数被传入

实际上传入flags的每一个选项在系统当中都是以宏的方式进行定义的:

这里这些宏的值是八进制数,在文件访问标志中,通常使用八进制数表示.

这些宏定义选项的共同点就是,它们的二进制序列当中有且只有一个比特位是1(O_RDONLY选项的二进制序列为全0,表示O_RDONLY选项为默认选项),且为1的比特位是各不相同的,这样一来,在open函数内部就可以通过使用“与”运算来判断是否设置了某一选项。

int open(arg1, arg2, arg3){
	if (arg2&O_RDONLY){
		//设置了O_RDONLY选项
	}
	if (arg2&O_WRONLY){
		//设置了O_WRONLY选项
	}
	if (arg2&O_RDWR){
		//设置了O_RDWR选项
	}
	if (arg2&O_CREAT){
		//设置了O_CREAT选项
	}
	//...
}

3.mode: 表示创建文件的默认权限 

返回值:

  • 成功:新打开的文件描述符(相关概念会在后面讲到)
  • 失败:-1

close接口

用于关闭一个打开的文件描述符,这个函数通常用于释放程序中不再需要的文件资源

参数:

  •  fd:要关闭的文件描述符 

返回值

  • 如果成功,返回 0。
  • 如果发生错误,返回 -1

write接口

用于向文件描述符(通常是文件)写入数据

参数:

  • fd文件描述符,表示要写入的源文件或设备
  • buf指向要写入数据的缓冲区的指针
  • count要写入的字节数

返回值

  • 如果写入成功,返回 写入的字节数
  • 如果发生错误,返回 -1

read接口

用于从文件描述符(通常是文件)读取数据

参数: 

  • fd:文件描述符,表示要读取的源文件或设备
  • buf:指向存储读取数据的缓冲区的指针
  • count:要读取的字节数

返回值

  • 返回值为读取的字节数
  • 如果已到达文件尾(EOF),则返回 0 表示没有更多数据可读
  • 如果出现错误,返回值为 -1

        8.4 C语言文件IO与系统文件IO的关系

在 C 语言中,文件 I/O(Input/Output)操作通常是通过标准库提供的函数来进行的,主要包括对文件的读取和写入。这些函数包括 fopen、fclose、fread、fwrite、fseek 等

与此不同,系统文件 I/O 操作是通过操作系统提供的系统调用来执行的。在 UNIX/Linux 等系统中,常见的系统调用包括 open、read、write、close 等。这些系统调用直接与操作系统内核进行交互,提供了更底层的文件操作能力

C 语言标准库的文件 I/O 函数实际上是建立在系统文件 I/O 操作的基础上的。例如,fopen 函数在底层可能会使用 open 系统调用来打开文件,fwrite 可能会使用 write 系统调用来写入数据

C 语言标准库的文件 I/O 函数提供了一层抽象,使得文件操作更加方便和可移植。通过使用标准库,程序员可以更容易地编写跨平台的代码,而不必过多考虑底层的系统差异。此外,标准库函数通常提供了更多的错误处理和缓冲机制,以提高性能

总的来说,C 语言标准库的文件 I/O 函数是建立在系统文件 I/O 操作之上的高级接口,提供了更便捷、抽象的文件操作方式,同时隐藏了底层系统调用的复杂性。在许多情况下,使用标准库函数足以满足文件操作的需求,但在某些特殊情况下,直接使用系统调用可能更为灵活和高效

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【电路笔记】-快速了电阻

电阻类型 文章目录 电阻类型1、概述2、电阻器的组成类型2.1 碳电阻器2.2 薄膜电阻器2.3 绕线电阻器 3、总结 电阻器是所有电子元件中最基本、最常用的元件&#xff0c;人们几乎认为电阻器是理所当然的&#xff0c;但它们在电路中起着至关重要的作用。 1、概述 有许多不同类型的…

17.找出1000之内的所有完数。

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为循环结构编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 一个数如果恰好等于它的因子之和&#xff0c;这个数就称为“完数”。例如&#xff0c;⑥的因子为1、2、3&#xff0c;而…

2024年最新最全的Jmeter接口测试必会技能:jmeter_HTTP Cookie管理器

HTTP Cookie管理器 HTTP Cookie管理器可以像浏览器一样自动存储和发送cookie&#xff0c;以这种自 动收集的方式收集到的cookie不会在cookie manager中进行展示&#xff0c;但是运行后&#xff0c; 可以通过 查看结果树&#xff08;监听器&#xff09;可以查看到cookie信息 除…

【开源】基于JAVA的天然气工程业务管理系统

项目编号&#xff1a; S 021 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S021&#xff0c;文末获取源码。} 项目编号&#xff1a;S021&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四…

hive杂谈

数据仓库是一个面向主题的、集成的、非易失的、随时间变化的&#xff0c;用来支持管理人员决策的数据集合&#xff0c;数据仓库中包含了粒度化的企业数据。 数据仓库的主要特征是&#xff1a;主题性、集成性、非易失性、时变性。 数据仓库的体系结构通常包含4个层次&#xff…

(数据结构)顺序表的定义

#include<stdio.h> //顺序表的实现——静态分配 #define MAX 10 //定义最大长度 typedef struct List {int data[MAX]; //用静态的数组存放数据int lenth; //顺序表现在的长度 }List; //顺序表的初始化 void ChuShiHua(List L) {L.lenth 0; //将顺序表的长度初始化…

NAS非接入层协议学习(二)

在无线通信网络中 NAS (Non-Access Stratum)做为非接入层是演进分组系统(或5G核心网)中的一组协议。NAS用于在用户设备(UE)和移动管理实体(MME/AMF)之间传送非无线电信令&#xff0c;以实现NR/LTE/E-UTRAN接入。 NAS在协议栈中是控制面的最高层。 NAS协议分组中可以将其分为两…

『Confetti 喜庆散花插件の使用』

以下用 VUE3 语法 举例使用&#xff1a; npm install js-confetti<script setup lang"ts"> import JSConfetti from js-confetticonst confetti new JSConfetti()function showConfetti() {confetti.addConfetti() } </script><template><h1 …

“BMP转PNG一键转换,批量处理图片,迈入高效图片管理新时代“

你是否曾经为了转换图片格式而烦恼&#xff1f;是否曾经因为一张一张地手动转换而感到无奈&#xff1f;现在&#xff0c;我们的全新工具将为你解决这些问题&#xff0c;开启高效图片管理新时代&#xff01; 首先&#xff0c;我们进入首助编辑高手主页面&#xff0c;会看到有多种…

人力资源管理后台 === 首页+部署

目录 1.首页-echarts图表的应用 2.首页-echarts图表的按需导入 3.路由模式-将路由改成history模式 4. 打包分析-分析 5.CDN加速 6.项目打包-安装nginx 7.mac/windows环境下nginx部署启动项目 8.nginx解决history的404问题 9.nginx配置代理解决生产环境跨域问题 1.首页-…

分享一个鬼~

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 先看效果&#xff1a; 上源码&#xff1a; import GUI from "https://cdn.jsdelivr.net/npm/lil-gui0.18.2/esm"const canv…

C/C++内存管理,malloc,realloc,calloc,new,delete详解!!!

1.初步了解内存中各个区间存储的数据特征 1.栈区&#xff1a;存储一些局部变量、函数参数、返回值等&#xff0c;跟函数栈振有关&#xff0c;出了作用域&#xff0c;生命周期结束。 2.堆区&#xff1a;用于动态开辟空间&#xff0c;如果不主动销毁空间&#xff0c;则程序运行结…

Centos Bind安装与排错

1.配置Centos系统静态IP vi/etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTOstaticIPADDR192.168.1.100NETMASK255.255.255.0GATEWAY192.168.1.1DNS18.8.8.8:wqsudo systemctl restart network.service 2.安装BIND&#xff08;需要服务器连接互联网&#xff0c;如果服务…

手把手教你实现一个循环队列(C语言)

这是一道leetcode关于队列的经典题&#xff1a; 622. 设计循环队列https://leetcode.cn/problems/design-circular-queue/ 思路&#xff1a; 大家注意这个题目要求&#xff0c;这个队列是定长的&#xff0c;如果满了则不能再添加数据。那么我们设计一个队头front和队尾rear&…

激光雷达SLAM(一)------初始激光雷达SLAM

专栏目的及认识激光雷达SLAM 一、专栏目的二、初始激光雷达SLAM1、激光雷达SLAM算法相关知识点2、SLAM常见问题[^2]3、激光雷达SLAM的需求点4、RTK在SLAM中的作用5、激光雷达视觉紧耦合图优化滤波紧耦合 一、专栏目的 大家好&#xff01;介绍一下博主自己&#xff0c;感知算法工…

职场份子钱随不随?这20个真相你需要知道!

职场份子钱随不随&#xff1f;这20个真相你需要知道&#xff01; 1.千万不要在老婆面前夸小姨子水灵。 2.盖世功劳&#xff0c;当不得一个矜字&#xff1b;弥天罪过&#xff0c;当不得一个悔字。 3.愚蠢的人永远只会根据答案判断难度。 4.改变自己的是神&#xff0c;企图改…

数据库基础教程之数据库的创建(一)

双击打开Navicat&#xff0c;点击&#xff1a;文件-》新建连接-》PostgreSQL 在下图新建连接中输入各参数&#xff0c;然后点击&#xff1a;连接测试&#xff0c;连接成功后再点击确定。 点击新建数据库 数据库设置如下&#xff1a;

51代码审计-PHP框架MVC类上传断点调试

知识点1&#xff0c;文件上传漏洞挖掘 搜索关键字$_FILES phpmvc架构 MVC模式&#xff08;Model-View-Controller&#xff09;是软件工程中的一种软件架构模式。 MVC把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#…

2024年最新最全的Jmeter接口测试必会技能:jmeter对图片验证码的处理

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…

LeetCode.203移除链表元素(原链表操作、虚拟头结点)

LeetCode.203移除链表元素 1.问题描述2.解题思路3.代码 1.问题描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val …