【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 操作之上的高级接口,提供了更便捷、抽象的文件操作方式,同时隐藏了底层系统调用的复杂性。在许多情况下,使用标准库函数足以满足文件操作的需求,但在某些特殊情况下,直接使用系统调用可能更为灵活和高效

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

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

相关文章

pandas 如何获取dataframe的行的数量

pandas的dataframe提供了多种方法获取其中数据的行的数量&#xff0c;本偏文章就是介绍几种获取dataframe行和列出量的方法。 为了能够详细说明如何通过代码获取dataframe的行数和列数&#xff0c;需要先创建一个dataframe如下&#xff1a; import pandas as pdtechnologies …

C++设计模式之策略模式

策略模式 介绍示例示例测试运行结果应用场景优点总结 介绍 策略模式是一种行为设计模式。在策略模式中&#xff0c;可以创建一些独立的类来封装不同的算法&#xff0c;每一个类封装一个具体的算法&#xff0c;每一个封装算法的类叫做策略(Strategy)&#xff0c;为了保证这些策…

NX二次开发UF_CURVE_ask_wrap_curve_parents 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_wrap_curve_parents Defined in: uf_curve.h int UF_CURVE_ask_wrap_curve_parents(tag_t curve_tag, tag_t * defining_face, tag_t * defining_plane, tag_t * defin…

18. Python 数据处理之 Numpy

目录 1. 简介2. 安装和导入Numpy3. ndarray 对象4. 基本运算5. 索引、切片和迭代6. 条件和布尔数组7. 变换形状8. 操作数组 1. 简介 数据分析的流程概括起来主要是&#xff1a;读写、处理计算、分析建模和可视化4个部分。 Numpy 是Python 进行科学计算&#xff0c;数据分析时…

MySQL进阶_10.锁

文章目录 一、概述二、MySQL并发事务访问相同记录2.1、读-读2.2、写-写2.3、读-写2.4、并发问题的解决方案 三、锁的不同角度分类3.1、 读锁、写锁3.1.1、 锁定读 3.2、表级锁、页级锁、行锁3.2.1、表锁3.2.2、意向锁3.2.2.1、意向锁的作用3.2.2.2、意向锁的互斥性 3.2.3、自增…

2019年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

文章目录 2019年考研英语二真题SectionⅠ Use of EnglishSection II Reading ComprehensionText 121——细节信息题22——细节信息题23——细节信息题24——细节信息题25——词义题 Text 226——细节信息题27——细节信息题28——细节信息题29——细节信息题30——态度题 Text …

springboot2.0 集成swagger3+Knife4j导出离线API 配置

springboot 版本2.3.1 一、集成swagger3 引入swagger依赖包 <!--swagger3集成--><dependency><groupId>org.springframework.plugin</groupId><artifactId>spring-plugin-core</artifactId><version>2.0.0.RELEASE</version>…

Linux面试题(三)

目录 34、du 和 df 的定义&#xff0c;以及区别&#xff1f; 35、awk 详解。 36、当你需要给命令绑定一个宏或者按键的时候&#xff0c;应该怎么做呢&#xff1f; 37、如果一个 linux 新手想要知道当前系统支持的所有命令的列表&#xff0c;他需要怎么做&#xff1f; 38、…

第一百八十一回 如何绘制阴影效果

文章目录 1. 概念介绍2. 使用方法2.1 SegmentedButton2.2 ButtonSegment 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 1. 概念介绍 我们在本章回中介绍的SegmentedButton组件是一种分段式按钮&#xff0c;它把多个按钮连接成一组显示&#xff0c;组内再对不同的按钮进…

[计算机网络]应用层概述

0.写在前面: 该层为教学模型的最后一层,某种意义上来说是最接近各位开发者的一层,正因如此,这层中的很多定义和概念大家都有属于自己的理解, 完全按照书本反而才是异类,因此在这里我会去结合我做前端开发的一些经验,来处理和讲解一些概念,另外本层中的部分协议也不会过多阐述了…

VUE简易购物车程序

目录 效果预览图 完整代码 效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

Python 进阶(十一):高精度计算(decimal 模块)

《Python入门核心技术》专栏总目录・点这里 文章目录 1. 导入decimal模块2. 设置精度3. 创建Decimal对象4. 基本运算5. 比较运算6. 其他常用函数7. 注意事项8. 总结 大家好&#xff0c;我是水滴~~ 在进行数值计算时&#xff0c;浮点数的精度问题可能会导致结果的不准确性。为了…

【Amazon】通过直接连接的方式导入 KubeSphere集群至KubeSphere主容器平台

文章目录 一、设置主集群方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 二、在主集群中设置代理服务地址方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 三、登录控制台验证四、准备成员集群方式一&#xff1a;使用 Web 控制台…

第六届 传智杯初赛B组

文章目录 A. 字符串拼接&#x1f37b; AC code B. 最小差值&#x1f37b; AC code C. 红色和紫色&#x1f37b; AC code D. abb&#x1f37b; AC code E. kotori和素因子&#x1f37b; AC code F. 红和蓝&#x1f37b; AC code &#x1f970; Tips&#xff1a;AI可以把代码从 j…

Android获取原始图片Bitmap的宽高大小尺寸,Kotlin

Android获取原始图片Bitmap的宽高大小尺寸&#xff0c;Kotlin val options BitmapFactory.Options()options.inJustDecodeBounds trueval decodeBmp BitmapFactory.decodeResource(resources, R.mipmap.p1, options)//此时&#xff0c;decode出来的decodeBmp宽高并不是原始图…

C++通讯录管理系统

目录 系统需求 1、 创建项目 2、 菜单功能设计 3、 退出功能设计 4、 添加联系人功能设计 4.1 设计联系人结构体 4.2 设计通讯录结构体 4.3 在main函数中创建通讯录 4.4 封装添加联系人函数 4.5 添加联系人功能测试 5、 显示联系人功能设计 5.1 封装显示…

算法基础之合并集合

合并集合 核心思想:并查集: 1.将两个集合合并2.询问两个元素是否在一个集合当中 基本原理:每个集合用一棵树表示 树根的编号就是整个集合的编号 每个节点存储其父节点&#xff0c;p[x]表示x的父节点 #include<iostream>using namespace std;const int N100010;int p[N];…

Huggingface 超详细介绍

Hugging face 起初是一家总部位于纽约的聊天机器人初创服务商&#xff0c;他们本来打算创业做聊天机器人&#xff0c;然后在github上开源了一个Transformers库&#xff0c;虽然聊天机器人业务没搞起来&#xff0c;但是他们的这个库在机器学习社区迅速大火起来。目前已经共享了超…

【C++初阶】二、入门知识讲解(引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】一、入门知识讲解 &#xff08;C关键字、命名空间、C输入&输出、缺省参数、函数重载&#xff09;-CSDN博客 六 . 引用 &#xff08;1&#xff09;. 引用的概念和特性…

Hugging Face宣布最受欢迎的AI机构,开源模型ChatGLM-6B广受认可

近日&#xff0c;Hugging Face作为开源AI社区的代表&#xff0c;总结了社区最欢迎的前15个公司和机构&#xff0c;几乎囊括了全部国内外风头正盛的AI科技机构&#xff0c;Stability AI、Meta AI、Runway占据排名前三&#xff0c;大众熟知的OpenAI、谷歌、微软也榜上有名。 其中…