C++输入输出的一点总结

C语言学习之:输出格式控制 printf(“格式控制字符串”, 数据1, 数据2, 数据3, …); 1 .类型 d 以十进制形式输出带符号整数(正数不输出符号) o 以八进制形式输出无符号整数(不输出前缀0x) X 以十六进制形式输出无符号整数(不输出前缀0x) u 以十进制形式输出无符号整数 f 小数形式输出单、双精度实数 e , E 以指数形式输出单、双精度实数 g , G 以%或%e中较短的输出宽度输出单、双精度实数... 阅读详情

"Hello World!",是大多数程序员学习一门语言的时候写的第一个程序,我学C++的时候也不例外。当随着学习的深入,我们会发现不得不回头重新审视这个简单的程序,因为它背后隐藏着许多细节方面的知识,对于高手来说,也许是不值一提,但对于我们这些菜鸟来说,这些细枝末节的知识点却是我们走向大牛必须迈过的艰难,因为很少有书会讲这些。

讲的啰嗦了点,本文是讲输入输出的小细节的,前几篇文章陆陆续续讲了缓冲区,文本文件和二进制文件,回车换行等等。。。这篇文章就对上面的知识做个总结贯通。

输入输出其实是狭义的信息交换,一端的信息通过管道流到另一端,并展示或者保存起来。因为计算机是以位保存信息的,所以计算机传递信息可以以位为单位传播,这毫无疑问是没问题的。但是人类能够看懂的并不是位,而是一个一个字符(仅以英文为例),所以C++的输入输出是以字节为单位的,以为ASCII是用一个字节表示一个字符的。稍微提前点讲一句,即使是二进制文件,也是以字节为单位的。

前几篇文章有一篇是介绍缓冲区的,缓冲区是存放了要输出或输入的字节信息。处理器并不直接与IO设备交换信息,而是直接与缓冲区打交道。

正文:

C++的输入输出主要包括三个部分:标准输入输出流、文件流和字符串流,大多数书上是这么说的,但解释清楚或者解释的比较直白的比较少。标准输入输出其实是与控制台(屏幕)和键盘打交道要用到的一系列类和对象,文件流则是与文件相关的一系列类和对象,同理字符串流,但其实这三类都属于输入输出流。你可以这样想象,这三个是的出发点都是处理器,当然中间都有缓冲区,但终点或目的地不同,分别是(屏幕和键盘)、文件和字符串。

我们先讲解目的地或终点是屏幕和键盘的这类流,我们知道计算机存储是以二进制的方式存储的,我们人类读东西是以字符读取的,当然我们也可以看懂二进制,但是只有纯数字的我们才能转换为相等的二进制表示,例如10=0x0000000A(int是四个字节),但是A却没有纯粹的二进制表示,这时候我们就自己定义了一套表示方法ASCII,人为把A用二进制表示为0x41。看样子到这时候天下太平统一,但是不然,这时候会产生一个混乱,那我要存储10ABCD45678到内存或外存的时候(外存和内存是一样的),遇到数字的时候,例如遇到10我是看做0x00000000A这形式,将它存到内存或文件,还是将10看做两个字符,分别是1和0字符,以0x31和0x30(1和0的ASCII值)方式存到内存或外存。其实这个问题就是二进制文件和文本文件的区别的由来,其实字母字符ABSHTY等这些,只能用ACSII来表示,但是数字却有两种方式,int、float和字符表示。那这和标准输入输出什么关系啊,这不应该是文件流要讲的么?对的,文件流才会遇到这个问题,标准输入输出流不会遇到这个问题,其实不是不会遇到,而是编译器或者库文件帮我们统一了,即标准输入输出流是文本文件的形式,即将所有的输入输出看做是字符形式。例如cout<<10<<endl;这个语句是输入int型的10这个数值到屏幕显示,当然,首先它输入到缓冲区,缓冲区可以看做是内存,那10是以什么形式存放到缓冲区的呢?答案是字符形式,即缓冲区存放的是0x3130,然后屏幕在读取缓冲区的内容,显示出来。因为屏幕读取缓冲区的内容,默认或只能以字符形式读取,就是,以每个字节为单位读取,然后根据ASCII翻译成字符,输出这个字符的图形。那怎么证明是这样的呢?我们可以以二进制的方式将内容输出到缓冲区,即cout.write((char*)&a,4);,a是int型,是10。缓冲区存放的不再是两个字节的0x3130,而是四字节的0x0000000A,但是屏幕不管你以什么方式写到缓冲区,它读取缓冲区的时候,仍然会以字节为单位读取,并翻译成字符,那么0x0000000A就代表四个字符,分别是回车和三个空字符。键盘呢?键盘也是类似的,你键盘输入的也是字符,然后将字符的ASCII码值放在缓冲区,等待cin去提取,有人会问,cin是可以直接提取整型的,例如:int a;cin>>a。如果我输入的是10,那么其实缓冲去存放的是0x3130,那么我提取会出错,即使我能提取到3130,但int是四个字节的,也还差两个字节,其实这个时候cin>>帮你完成了转换,从字符到整型的转换。

而遇到文件的话,你得自己定义,你是以二进制方式打开还是以文本方式打开,其实 以二进制文件形式打开,读写只能用成员函数write和read,如果你以文本文件的形式打开,其实也是可以以文本文件的方式读取的。

总结起来就是这样子的,当你和屏幕或键盘传消息,和屏幕的话,肯定是输出流,如果你用插入符<<,则你插入缓冲区的都是字符流,即例如你cout<<10,这是插入缓冲区的是两个字符1和0,内存是两个字节是0x31和0x30,然后当缓冲区刷新的时候,你看到是1和0两个字符;当你不用<<想缓冲区输入流,而是以write函数,则在缓冲区流进的数据不会改变,还是二进制的10,即四个字节的内容(当然,write函数的用法自己去百度),然后缓冲区刷新,还是每个字节翻译成字符的读取,10的话,在屏幕上显示的是一个换行符,即回车换行的操作。因为10是回车的ASCII值,当然,还有三个为0的字节,都是空字节。

然后是键盘输入,你输入流进入的缓冲区都是字符流,即你输入A,在缓冲区的形成一个字节的数是0x41,你输入1,则缓冲区还是一个字节的数0x31,并不会是四个字节的int型的内存表现形式。主要取决于你怎么去读取缓冲中的内容,你是以字符流的方式提取,还是以二进制的方式提取。以字符流的方式则是根据cin>>a,a的类型来决定,例如,你键盘输入了123ABC(空格)3d,这个在缓冲区的内存存储形式是0x31_32_33_41_42_43_20_33_64,下划线为人为添加的分隔符号,如果a是int型,那么提取符号一直提取到A为止,其实是fail函数为真(可不用理解),那么你提取了123,但你不能把123在缓冲区对应的内容直接搬迁到存储a的内存中去,因为a是四个字节的,123在缓冲区也只占3个字节,即使假设你提取的是1230是四个字节,也不行,那么最终显示a的值不是1230而是0x30313233这四个字节组成的int型,是一个很大的值,所以,cin>>a,提取了123三个字符以后,经过转换将123变为int的123,在传给a。如果二进制的方式读取的话,则是将缓冲区的内容原封不动的搬迁到你你要读取的地方。cin.write((char*)&a,4)。中间不会进行转换。

文件流的其实也是相似的,只根据你以什么方式写到文件中去(而并不依赖你以什么方式打开文件),如果文本方式的话,将你所写的东西都先转换成字符,放到缓冲区,然后在放到文件的内存中去,例如out<<123,虽然123 是int型的,但是先将123转换成"123",然后放到缓冲区,即缓冲区的是0x313233,而并不是123的四个字节的int型的,当你以二进制的方式写到文件的时候,才是将原封不动的123的int型放到缓冲,然后再从缓冲放到文件中去。

你以什么方式打开文件的话,这个就行屏幕,屏幕是怎么解释缓冲区传来的内容的?以字符流的方式,将每个字节翻译成一个字符,在屏幕上显示,举个例子,如何以二进制的方式输出到屏幕,显示A,则你得cout.write((char*)&a,1),a=65;你以文本文件的形式打开文件就行屏幕显示一样,其实也就是屏幕显示,打开文件是看文件,它也是将里面的内容以每个字节为单位根据ASCII翻译成字符,显示出来,如果当初你是以<<写的文件,那么就能对应起来,如果是以write函数写的文件,如果你写的字母,那么还好没什么影响,如果是write(65),那么显示的是A这个字符和三个空字符。

所以,综上,文本文件存储还是二进制文件存储取决于你用<<还是write()成员函数?如果,以<<的符号的方式,则将要存储的先翻译成字符,123翻译成"123",存放到缓冲区,如果以writ(),则将write的变量地址的值原封不动的放到缓冲区。如果是读取的话,也是不管文件的打开方式是什么,只取决于你用什么读取,用>>还是read()函数,如果用,当然键盘输入特殊了,你输什么,都是翻译成字符型放到缓冲区,如果你以>>方式的话,取决于你>>a,a的类型,如果是read的,则将缓冲区的内容原封不动的读取出来,放到a的内存中去。

所以<<和>>是一个相反过程,<<将东西翻译成字符放到缓冲区,>>a将缓冲区的内容看成是字符类型,然后根据a的类型,将字符翻译成a相应的类型。

read和write则是原封不动的将缓冲区的内容搬迁一下。

啰嗦了,不知道有没有讲明白,以后在进行更详细明了的总结改正吧。

C++之C++输入输出流 ios是抽象基类,由它派生出istream类和ostream类,iostream类支持输入输出操作,iostream类是从istream类和ostream类通过多重继承而派生的类。根据不同的情况,对文件的读写操作,可以采用不同的文件打开模式。又比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的。比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以。 阅读详情

相关推荐

cpp命名空间 输入输出 缺省参数 函数重载

文章目录1.命名空间命名空间到底是什么呢?为什么C++为什么要引入命名空间?如何定义命名空间?命名空间支持嵌套吗?命名空间怎么使用?2.c++中的输入输出输入:输出:3.缺省参数缺省参数概念:(函数带默认值)缺省参数的分类:缺省参数的几个特性:4.函数重载什么是函数重载?函数重载的规则:函数重载的作用:面试题1.C语言中为什么不能支持函数重载?2.C++中函数重载底层是如何处理的? 1.命名空间 命名空间到底是什么呢? 命名空间是一个容器,这个容器主要是为了识别其下的类和函数。一旦定义了命名空间,它下面的

河马HerMark的博客 1814

关于C++输入输出优化的一点事

这几天在练习CF的时候,有一题TLE了,这里是原题(CF 1600J): J. Robot Factory time limit per test: 1 second memory limit per test: 256 megabytes inputstandard input outputstandard output You have received data from a Bubble bot. You know your task is to make factory facilities,

weixin_47689491的博客 1914

C++ 史上最全输入输出方法及拓展

C++ 中有多种读入(输入)和读出(输出)数据的方法,涵盖了标准输入输出、文件操作、字符串处理等多个方面。

weixin_72389218的博客 1635

关于c++输入输出的一点理解

c+中输入不要cin和scanf同时用,会出现很奇怪的读入错误,并且怎么改都无法避免。

henry_bird的博客 73

Linux下基于AHCI controller模块实现SATA Platform驱动附代码详细流程

本文主要是针对ARM A55集成了AHSATA controller模块开发sata驱动,通过Platform的形式在linux识别到SSD,本文详细讲述整个开发过程,同时对SATA Platform驱动进行讲解。1、配置SATA Phy的初始化;2、打开SATA Platform相关编译开关;3、配置设备树;4、linux启动识盘。

Luckiers的博客 2497

泛微OA表单设计实战:如何快速实现自定义多选浏览框(附完整配置步骤)

本文详细介绍了在泛微OA中快速实现自定义多选浏览框的完整配置步骤。针对招聘提报、活动审批等需要从海量数据中规范选择多个条目的业务场景,文章从理解需求、构建数据源、设计查询页面到创建浏览框控件,提供了清晰的实战指南,帮助开发者高效解决复杂数据选择难题,提升表单操作体验。

yog99的博客 1049

牛客C++输入输出的一点思考

例题是:Leetcode322.兑换零钱 题目详情见:https://leetcode-cn.com/problems/coin-change/ 样例 1 2 5 11 输入: coins = 1, 2, 5 , amount = 11 3 输出: 3 解释: 11 = 5 + 5 + 1 #include <iostream> #include<vector> using namespace std; class Solution { public: int co

i_poison_Mind的博客 358

从零构建EtherCAT从站:SSC工具配置与TwinCAT3 PDO/SDO调试实战

本文详细介绍了从零构建EtherCAT从站的完整流程,重点讲解SSC工具配置与TwinCAT3 PDO/SDO调试实战。通过解析EtherCAT通信机制、PDO与SDO的核心概念,提供SSC工具配置技巧、XML文件生成与校验方法,以及TwinCAT3环境下的调试经验,帮助开发者高效完成EtherCAT从站开发与优化。

weixin_42520573的博客 342

C++文件输入输出流的一点经验

http://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/18/2144247.html这个博客我觉得写的非常详尽,我很多也是从上面借鉴而来,请先看这个博客,下面是我的一点心得与补充: 文本方式的操作: 心得体会: 1、开一个输入一个输出,不能同时进行,必须先关一个才能进行下一个的操作,例如: #include #include #include

zhuyisong12的专栏 788

190、LLC谐振变换器的样机调试实战(问题定位)

这篇实战笔记总结了LLC谐振变换器样机调试中的五大典型问题及解决方案:1)空载炸机源于谐振电容纹波电流能力不足;2)轻载啸叫因控制环路不稳定,需调整突发模式阈值;3)MOSFET过热由死区时间不当导致,需精确优化实现ZVS;4)输出纹波大由PCB布局耦合引起,需优化共模抑制;5)启动过冲需延长软启动时间。作者强调调试需结合示波器、热成像仪等工具,理论计算与实测并重,并详细记录每次参数调整。文章指出LLC调试是不断试错的过程,关键是通过现象分析本质原因。

Jack010169的博客 49

java项目反编译工具记录,共计6个工具

java项目反编译工具记录,共计6个工具

橙-极纪元-JJYCheng 1801

20141204-关于使用C++标准输入输出库:iostream的一点思考

转载请注明出处~   iostream(In and Out stream)是C++语言中标准库(standard library)中提供IO机制的函数库,包含两个基础类型istream和ostream,分别表示输入流和输出流。一个“流”指的就是一个字符序列,表示从IO设备读出或写入IO的。“流”(stream)即:随着时间的推移,字符是顺序产生或消耗掉的;   标准输入输出库中定义了四种对象

BayINGbf的专栏 1041

多智能体系统在军事仿真中的应用:AI人工智能战略推演

本文旨在全面解析多智能体系统在军事仿真领域的应用技术,重点探讨AI驱动的战略推演系统的设计原理和实现方法。研究范围涵盖从基础理论到实际应用的完整技术栈。本文采用从理论到实践的递进结构,首先介绍核心概念,然后深入算法实现,最后展示实际应用案例和未来展望。多智能体系统(MAS):由多个相互作用的智能体组成的分布式系统军事仿真(Military Simulation):通过计算机模拟军事行动和战争场景战略推演(Strategic Wargaming):通过模拟推演评估军事战略的有效性更高保真度的仿真。

AI天才研究院 1777

PTA 万绿丛中一点红(注意“一点”)

对于计算机而言,颜色不过是像素点对应的一个 24 位的数值。现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 8 个相邻像素的颜色差充分大。 输入格式: 输入第一行给出三个正整数,分别是 M 和 N(≤ 1000),即图像的分辨率;以及 TOL,是所求像素点与相邻点的颜色差阈值,色差超过 TOL 的点才被考虑。随后 N 行,每行给出 M 个像素的颜色值,范围在 [0,2^​24​ ) 内。所有同行数字间用空格或 TAB 分开。 输出格式: 在

qq_45405490的博客 354

【unity游戏开发入门到精通——UGUI】UI控件 —— Toggle开关切换控件

【unity游戏开发入门到精通——UGUI】UI控件 —— Toggle开关切换控件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1845

如何使用Agent框架来模拟群体智能?

Agent 框架作为人工智能领域的重要工具,可以模拟复杂的群体智能行为,广泛应用于社会科学、经济学和行为学等领域。

335

C++基础之C++中的输入输出

目录 文章目录 前言 一、输入输出流 二、c++中输入输出语句 1.标准输入设备 2.标准输出设备 3.原理 三、iostream类库

weixin_48716357的博客 5万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++之输入输出

C++是一种广泛使用的编程语言,具有强大的输入输出功能。在C++中,输入输出主要通过标准输入输出流进行操作。通过使用iostream库中的cin和cout对象,可以实现从键盘读取用户输入和向屏幕输出结果。 输入输出在C++中是非常重要的,因为它们可以帮助我们与用户交互并显示程序的执行结果。正确地处理输入输出可以使程序更加灵活和友好。在C++中,可以使用流操作符"<<"和">>"来实现输入输出操作,这使得代码变得简洁而直观。

踏入代码与智能交织的奇妙世界,我是小辉同志。在这片技术天地里,C++ 是我探索底层逻辑、雕琢高效算法的利刃,每一段精心编写的代码都是通往优化之路的基石。而人工智能,则宛如闪耀星辰,引领我不断钻研机器学习、深度学习等前沿领域,探寻智能的奥秘。 1510

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++语言之输入输出深入介绍

C++语言之输入输出深入介绍,包括:C++基本的输入输出、C++如何输入含空格的字符串、C++输入输出的格式控制。

cnds123的专栏 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Cpp入门基础

定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。

2401_86658278的博客 5184

ElectronBot 舵机驱动方案深度解析:FM116B 凭什么扛住六自由度

桌面机器人动作一顿一顿、角度老是不听话?多半是驱动方案没选对。ElectronBot 靠一块巴掌大的 **ServoDrive** 驱动板搞定六个自由度,板上最小的那颗 **FM116B** 和一颗 STM32F042F6 就是闭环比的底座。 ## 项目与组件速览 ElectronBot 是个桌面级开源小机器人,头部主控 STM32F405 负责屏幕与 USB 通信,六个关节的舵机则各自挂一块

gitblog_00530的博客 675

牛客OJ笔试 C++ 输入输出

背景 最近以及春招做笔试的时候发现,很多公司都用牛客网作为在线编程的OJ,这里需要自己做输入输出。因为牛客判题使用的方式是:不管输入,只将你程序的输出,和正确答案进行对比,有点像文本比对,有一点不一样,就会是不通过。比如 输出结尾不能/必须有空格,空行,逗号等特殊要求。今天根据牛客官网给出的练习做一下C++的输入输出总结。 大家也可以去练下下~ 传送门:https://ac.nowcoder.com/acm/contest/5647 8-9-10是实战中经常用到的方式,比如输入数组,有多组,以逗号/空格分隔

haiki66的博客 9445

C++ 的输入输出

C++ 的输入输出是程序与用户交互的核心,>>和<<的使用是理解输入输出流的关键。<<:数据从右流向左(流入输出流)。>>:数据从左流向右(提取到变量)。输入输出流看似简单,但它是 C++ 程序的基础,掌握它将为你后续学习更复杂的 C++ 知识奠定坚实的基础。

2403_86977424的博客 1465

C++青少年简明教程:C++的输入输出

C++青少年简明教程:C++的输入输出

cnds123的专栏 1820

C++输入输出流

比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。又比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的 CPU 可以处理别的事情。,这种方式是兼容C的写法。IO 操作与生俱来的一个问题是可能会发生错误,一些错误是可以恢复的,另一些是不可以的。

caijirui_rui的博客 1254

C/C++之输入输出

本文主要讲解了C语言中的printf、scanf 及 C++中的cin、cout等输入输出方式,当程序向输出设备(比如屏幕、打印机)输出数据时,数据通常不是立即传递到设备上,而是先存储到缓冲区中,这样做的好处是可以减少向设备频繁传输数据的开销,而是利用缓冲区将数据一次性传输,从而提高效率,类似地,当数据从输入设备(比如键盘、网络)输入进来时,也会先存储到输入缓冲区中,程序可以逐步读取这些数据。)是一个抽象概念,用于表示数据的序列

DAY I 的成长之路 4203
上一篇: C/C++堆、栈、自由存储区、全局/静态存储区和常量存储区(转)
下一篇: C++程序在内存中的布局详细分析篇
funouc
博客等级 码龄16年 6粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值