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

Linux基础IO--重定向--缓冲区

1,为什么语言喜欢做封装?

我们先知道一个概念,显示器叫做字符设备,根据ACSLL码来打印数据,所以我们从键盘输入的

1234,在显示器看来就是一个一个的字符('1','2','3','4')而不是一千两百三十四:

 下图输入字符类型数据:

下图输入int类型数据:

可以看到,要是输入int类型数据到显示器里,就会被解析成另外一个字符,不能如我们所愿的打印出1234,我们需要将输入的int类型值格式化之后才能向显示器输出:

所以为什么c中有printf?为什么又write还要printf?

因为要把内存级别的数据转成字符串,再用write打印到显示器,如果这些全程交给程序员来做不做封装,就会降低程序员的工作效率,这就是c/c++为什么提供fput等io接口的原因之一。

键盘输入数据也是以字符串的方式输入。

如果直接用read读出来的是字符串,如果要的是1234数字而不是字符串,就有c封装的scanf(“%d”,&a);,和上面的代码模板类似:buffer ---> %d ---> &a;

所以c/c++为什么要封装?

1,为了方便用户操作

因为在操作系统中无文本的概念,只有二进制,但在语言层,就转化成用户可看的:

例子就是./text,text.c变成可执行文件的过程就是把代码编译成二进制文件。

2,提高语言的可移植性

Linux,win ,macos底下都有不同的系统调用接口,printf就封装了这三种接口的方法,如果是在Linux中用printf他就会调用Linux的接口,如果在win中用就调用win接口。

2,IO的基本过程

1,缓冲区

write本质其实是拷贝函数,从用户拷贝到缓冲区:

然后再由os自主决定什么时候刷新到外设:

外设可以以预加载到缓冲区:

每个函数都有自己的操作表,里面是函数指针的合集,指向文件内核缓冲区。

修改的本质也是先读取在写入。

为什么要存在缓冲区?

因为磁盘很慢,内存很快,缓冲区的存在变相提高了效率。

同时这就是我们平时写东西的时候没按保存,缓冲区没把数据刷到磁盘,断点的时候我们写的东西就不会被保存而被刷掉。

2,重定向

我们在打开文件的时候,把0关掉会怎么样?:

可以看到,0号关了之后就会被新创建的表占用:

那么把2关掉会怎么样:

     

把2关掉首创建的文件就会把2占用,如果把1关了会怎么样?

把1关了相当于把显示器输出关了,printf不知道哦我们关了一号文件,printf就无法把内容输入到显示器,根据我们之前的理解,这个时候printf应该会向一号文件中写入我们要输出的东西:

事实证明文件里什么都没有,为什么呢?

因为写入的内容在缓冲区中没刷新到文件里,程序推出后缓冲区清空,写入的内容消失,这时候需要用fflush刷新到文件中:

可以看到,数据已被刷入文件。

那么本来应该向显示器文件写入的,却写到了文件中?

也就是改变了一号指向显示器的文件,改到了指向其他文件,这就是重定向了!

重定向的过程中,上层代码毫不知情,他们只认识0,1,2.

那么有无接口直接重定向而不是这样关闭打开操作太麻烦了?

dup2!

如果不理解之前文件描述符等等的学习经历,就无法理解为什么dup2里传1,2就可以重定向?

只有学习里,才知道里面1,2的作用,才能理解dup2,

重定向之后,被覆盖的文件如果没有其他指针指向,就会自动关闭文件。

覆盖的文件如果没有关掉之前老地址的指向,就会有两个指针指向该文件。

操作:

     

什么是追加重定向?就是open里面的是O_APPEND,而不是O_TRUNC.

与重定向的方法无不同,只是打开方式不同。

什么是输入重定向?

将键盘的位置和文件换一下,就变成了直接从文件中读内容。

重定向之后很少恢复,入宫需要恢复可以在重定向之前存好需要被重定向的文件。

     

相关文章:

Linux基础IO--重定向--缓冲区

1,为什么语言喜欢做封装? 我们先知道一个概念,显示器叫做字符设备,根据ACSLL码来打印数据,所以我们从键盘输入的 1234,在显示器看来就是一个一个的字符(1,2,3,4)而不是一千两百三十四: 下图输入字符类型数…...

Conda 安装与使用指南

Conda 是一个开源的软件包管理和环境管理系统,主要解决一个系统上同时要使用python2,python3等等多个python环境的切换问题,支持多种编程语言(如 Python、R 等),可以在 Windows、macOS 和 Linux 上运行。它…...

C++中获取硬盘ID的方法

在C++中,直接获取硬盘的ID(通常是硬盘的序列号或唯一标识符)并不是一项简单的任务,因为这通常涉及到低级的硬件访问,这通常是由操作系统或特定的硬件驱动程序管理的。标准C++库并没有提供直接访问硬盘ID的功能。 然而,可以通过以下几种方法来获取硬盘的ID: 操作系统特定…...

OpenRTP 传输增加OpenRTPServer

开源地址 最近增加了OpenRTPServer, 已经修改完成一版放在了目录下,window和linux下编译都成功了,不过由于修改代码CMakefile 需要修改,先放放 OpenRTP开源地址 vlc得纠错传输方式 我发现我代码写错以后,vlc 依然能…...

使用vue3+cesium+earthsdk+supermap实现通视分析(有版本报错问题)

main.js: 这个文件是项目的入口文件,主要进行了以下操作: 使用Vue 3的createApp创建应用实例。加载了element-plus UI 组件库。加载了router和store,以及axios用于发送HTTP请求。将@turf/turf和自定义的bus.js注册到全局属性中,便于在组件中使用。环境配置需求: 你需要安…...

python 轮子是什么

此一词语的由来是因为轮子由人类所发明,且在各方面都带来许多便利。既然轮子已被发明,而且在使用上没有什么缺陷,重新再发明一次轮子是没有意义的,只是浪费时间,分散研究者的资源,使其无法投入更有意义及价…...

农作物大豆病虫害识别分类数据集(猫脸码客第227期)

农作物大豆病虫害识别分类数据集 大豆,作为全球重要的粮食作物之一,不仅承载着人类饮食中的重要角色,还深刻影响着农业经济的发展。然而,大豆的生长过程中,常常面临着来自病害和虫害的双重威胁。这些病虫害不仅会影响…...

如何在算家云搭建GPT-SOVITS(语音转换)

一、模型介绍 GPT-SOVITS是一款强大的小样本语音转换和文本转语音 WebUI工具。它集成了声音伴奏分离、自动训练集分割、中文ASR和文本标注等辅助工具。 具有以下特征: 零样本 TTS: 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS&…...

ThinkPad T480拆机屏幕改装:便携式显示器DIY指南

ThinkPad T480拆机屏幕改装:便携式显示器DIY指南 本文记录了将旧笔记本电脑 T480 拆机屏幕改装为便携式显示器的全过程。作者在决定升级设备后,选择通过 DIY 方式利用原有的屏幕资源。文章详细介绍了屏幕驱动板的安装、螺丝孔的剪裁、排线连接及固定的步…...

C++ (8) C++11及更新特性:探索魔法新领域

C11及更新特性:探索魔法新领域 随着C语言的不断进化,C11及其后续版本带来了许多激动人心的新特性,它们就像是魔法世界中新发现的领域,充满了无限的可能性。这些新特性不仅提高了编程的效率和灵活性,还为程序员提供了更…...

【vue】Mammoth.js的使用:将.docx和doc 文件转换成HTML

mammoth.convertToHtml(input, options) :把源文档转换为 HTML 文档 mammoth.convertToMarkdown(input, options) :把源文档转换为 Markdown 文档。 mammoth.extractRawText(input) :提取文档的原始文本。这将忽略文档中的所有格式…...

HarmonyOS介绍 第一课习题答案

一、判断题 1. “一次开发,多端部署”指的是一个工程,一次开发上架,多端按需部署。为了实现这一目的,HarmonyOS提供了多端开发环境,多端开发能力以及多端分发机制。 正确(True)错误(False) 正确(True)回答正确 2. 《鸿蒙生态应用开发白皮书》全面阐释了鸿蒙生态下应…...

c/c++ stdcall cdel fastcall等函数调用约定说明

调用约定(Calling Conventions)是编程中定义函数如何接收参数、返回值以及如何管理堆栈的协议。主要的调用约定包括 __cdecl、__stdcall、__fastcall 和 __thiscall 等。下面将详细介绍这些调用约定的特点及其适用场景。 1. __cdecl 调用约定 定义&…...

【ROS概述】概念及环境搭建

学习途径: 教程:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 课程视频:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 机器人体系 要完全实现一个机器人的系统研发,几乎是“全栈”开发,…...

MongoDB Shell 基本命令(三)生成学生脚本信息和简单查询

一、生成学生信息脚本 利用该脚本可以生成任意个学生信息,包括学号、姓名、班级、年级、专业、课程名称、课程成绩等信息,此处生成2万名学生,学生所有信息都是给定范围后随机生成。 生成学生信息后,再来对学生信息进行简单查询。…...

java核心技术点都有哪些

1. 面向对象编程(OOP) 核心概念:类、对象、继承、封装、多态。 比喻:面向对象编程就像是在搭建一个积木城堡。类(Class)是城堡的设计图纸,它定义了城堡的结构和功能;对象&#xff08…...

4404 - 提高:二分与三分:曲线(三分)

明明做作业的时候遇到了n个二次函数Si(x)=ax22+bx+c,他突发奇想设计了一个新的函数F(x)=max(Si(x)), i=1,2...n。 明明现在想求这个函数在[0,10000]的最小值,要求精确到小数点后四位四舍五入。 输入 输入包含T 组数据 (T<10) ,每组第一行一个整数 n(n≤10000) ,之后n行…...

软件工程--需求分析与用例模型

面向对象分析(ObjectOrientedAnalysis&#xff0c;简称OOA) 分析和理解问题域&#xff0c;找出描述问题域所需的类和对象&#xff0c;分析它们的内部构成和外部关系&#xff0c;建立独立于实现的OOA模型&#xff0c;暂时忽略与系统实现有关的问题。 主要使用UML中的以下几种图…...

预测房价学习

1. 实现函数来方便下载数据 import hashlib import os import tarfile import zipfile import requestsDATA_HUB dict() DATA_URL http://d2l-data.s3-accelerate.amazonaws.com/def download(name, cache_diros.path.join(.., data)):"""下载一个DATA_HUB中…...

电脑无法上网,但是微信、QQ可以正常使用

这种情况一般是由于DNS服务器配置错误&#xff0c;或者已有的DNS服务器无法正常解析地址造成的。 按下winR打开运行&#xff0c;输入ncpa.cpl&#xff0c;点击确定。 在打开的网络连接窗口中找到对应的网卡&#xff0c;双击打开。一般有线网是“以太网”&#xff0c;无线网&am…...

1、Chrome Elements面板:从入门到精通的网页调试实战指南

1. Chrome Elements面板&#xff1a;你的网页调试瑞士军刀 第一次打开Chrome开发者工具时&#xff0c;那个标着"Elements"的标签页看起来就像是一堆杂乱无章的HTML代码。但当我真正开始理解它的功能后&#xff0c;它迅速成为了我每天使用最频繁的开发工具。Elements面…...

All-in-One Telegram机器人:加密货币监控与多功能集成部署指南

1. 项目概述 如果你和我一样&#xff0c;是个喜欢折腾各种效率工具&#xff0c;同时又对加密货币市场保持关注的玩家&#xff0c;那你肯定也经历过这样的场景&#xff1a;手机里塞满了各种功能的机器人——一个用来监控币价&#xff0c;一个用来下载视频&#xff0c;一个用来处…...

终极指南:华为光猫配置解密工具深度解析与应用实践

终极指南&#xff1a;华为光猫配置解密工具深度解析与应用实践 【免费下载链接】HuaWei-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/hu/HuaWei-Optical-Network-Terminal-Decoder 华为光猫配置解密工具&#xff08;HuaWei-Optical-Ne…...

联想刃7000k BIOS隐藏选项完全解锁指南:一键释放硬件隐藏性能

联想刃7000k BIOS隐藏选项完全解锁指南&#xff1a;一键释放硬件隐藏性能 【免费下载链接】Lenovo-7000k-Unlock-BIOS Lenovo联想刃7000k2021-3060版解锁BIOS隐藏选项并提升为Admin权限 项目地址: https://gitcode.com/gh_mirrors/le/Lenovo-7000k-Unlock-BIOS 联想刃70…...

Switch大气层系统:从零开始掌握自定义固件的完整指南

Switch大气层系统&#xff1a;从零开始掌握自定义固件的完整指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 大气层系统&#xff08;Atmosphere&#xff09;是任天堂Switch平台上最强大…...

关于python

1.python的主要运用Python的主要应用领域Python作为一种通用编程语言&#xff0c;因其简洁、易读和强大的生态系统&#xff0c;被广泛应用于多个领域。以下是Python的主要应用场景&#xff1a;数据科学与机器学习Python在数据分析和机器学习领域占据主导地位。库如NumPy、Panda…...

华为CANN GE动态宽高获取API

aclmdlGetDynamicHW 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch、Tensor…...

如何快速解密网易云音乐NCM文件:5步完成格式转换的完整指南

如何快速解密网易云音乐NCM文件&#xff1a;5步完成格式转换的完整指南 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump 还在为网易云音乐的NCM加密格式烦恼吗&#xff1f;想要在任意播放器上畅听你收藏…...

openwrt--by--myself

1. 完全清理配置make distclean // 清理所有配置make clean&#xff1a;最基础的清理&#xff0c;仅删除编译生成的固件、内核和软件包等产物&#xff08;即 bin/ 和 build_dir/ 目录&#xff09;。make dirclean&#xff1a;在 clean 的基础上&#xff0c;还会清除交叉编译工…...

[CAN BUS] 从开源到商用:USB-CAN适配器选型避坑指南与稳定性深度剖析

1. 为什么USB-CAN适配器选型这么重要&#xff1f; 如果你正在开发汽车电子、工业控制或者机器人项目&#xff0c;大概率会用到CAN总线。作为嵌入式工程师&#xff0c;我最开始接触CAN总线时&#xff0c;天真地以为随便买个USB转CAN的工具就能搞定。结果在实际项目中踩了不少坑—…...