C++ Iostreams 用法详解(二)标准输入输出
续:C++ Iostreams 用法详解(一)整体把握
首先说我们最常用的两个全局对象cin和cout,以下摘自MSDN:
You can then extract values from cin or wcin to read the standard input. The rules for doing so are outlined in the description of the class basic_istream Class. You can also insert values to cout or wcout to write the standard output. The rules for doing so are outlined in the description of the class basic_ostream Class.
可以看出,其中cin是istream的对象,可以从标准输入中提取数据,而cout是ostream的对象,可以向标准输出中输出数据。
什么是标准输入和标准输出呢?可能对于我们这些90后来说不是那么容易理解的,毕竟这是字符界面的概念,而我们在开始接触计算机的时候就已经是普遍的windows图形界面的操作系统了。但是windows操作系统还是为我们提供了一个模拟dos这种字符界面的程序cmd,让我们大致对这个有一定的了解。而在Linux系统中我们更容易说清楚这个概念:在执行一个shell命令时,会默认打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
这样说比较了解了吧,因为我们在windows下面写一个win32 控制台应用程序的时候,其实我们的这个程序就是类似于Linux中执行在shell中的命令,所以这个程序在执行的时候当然可以带有参数(就是main函数的参数int argc和char* argv[]了),而且有标准输入缓冲区和标准输出缓冲区的概念了。只不过我们在windows下刚开始学习编程语言的时候,总是会用一些图形界面的IDE(例如VC++6.0就是我的启蒙IDE),所以对这个程序的运行机制并不是很清楚,只知道摁一下运行按键就自动完成了编译、连接、打开一个cmd并直接运行我们写的这个程序了。
有了标准输入和输出的概念(最好把他们像Linux里面一样看成是设备文件),接下来就要说一下这个cin和这个cout到底是怎么完成输入输出机制的了。首先来看一下下面这个例子:
#include <iostream>#include <string>using namespace std;int main(){int j = 0;while(++j>0) for(int i=0;i>0;i++);string str;cin >> str;cout << str << endl;system("pause");}
用嵌套的循环来做了一个延时,当我们的程序(win32 控制台应用程序)在正常运行的时候,我们在键盘上敲下五个字符"hello",这个时候屏幕上并不会显示任何东西,因为虽然我们的输入都保存到了输入缓冲区中,但是我们并没有把它显示到屏幕上来。当我们第一次调用cin>>str的时候,这时其实是调用了cin这个istream对象的>>运算符的方法,它首先让我们的进程从运行(running)状态转换到等待I/O(waiting)状态,然后将输入缓冲区中的内容都输出到屏幕上来,这个时候我们刚才在键盘上按的hello就都显示出来了,然后当我们继续在键盘上按五个字符"world"的时候,输入缓冲区继续吸收我们输入的字符,然后被cin对象显示到屏幕上来,直到我们在键盘上按回车键(正常情况下)时,这时输入缓冲区也同时吸收了一个换行字符'\n',这个时候输入缓冲区中就有11个字符"helloworld\n"了,然后cin>>str开始将输入缓冲区中的这11个字符全部抽取(extract)出来存到对象cin的streambuf中(后面会讲到,这其实就是存储的buffer,而cin对象拥有的其实是streambuf对象的指针)。到这一步,还没有跟我们的str对象有任何关系,cin对象只是从标准输入输出中提取出了数据而已(这时我们可以理解为输入缓冲区中已经空了)。
之后的工作才关系到str对象,cin对象会根据str的类型(string)去格式化stream中的内容,即将前10个字符"helloworld"存到str对象中去,同时从streambuf中将这10个字符和结束字符'\n'清除(这其实是通过移动get指针来实现的,后面会说到),然后这条语句cin<<str;终于执行结束了。如果我们的代码改成
char str[20];cin >> str;
char str1[20],str2[20];cin.get(str1,20);cin.get(str2,20);
转载于:https://www.cnblogs.com/zorro-x/archive/2013/05/11/3072305.html
C++ Iostreams 用法详解(二)标准输入输出相关推荐
- 8.linux 重定向详解,标准输入输出,输入重定向,输出重定向
文章目录 一.初识 1.标准输入输出设备 2. 文件描述符 3. 重定向 3. &(重点) 二.输入重定向 三.输出重定向 1. 描述符 2. 输出重定向的符号及作用 总结 友情链接 一.初识 ...
- java typedef的用法_Java 枚举用法详解(二)
枚举可以添加方法 在概念章节提到了,枚举值默认为从0开始的有序数值 .那么问题来了:如何为枚举显示的赋值. Java 不允许使用 = 为枚举常量赋值 如果你接触过C/C++,你肯定会很自然的想到赋值符 ...
- PaddlePaddle基本用法详解(二)、PaddelPaddle训练水果分类模型
PaddlePaddle基本用法详解(二).PaddelPaddle训练分类模型 1.基本用法 2.训练水果分类模型 1.基本用法 2.训练水果分类模型 1.数据集预处理与模型定义代码: import ...
- STL中map和string, vector 用法详解
1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...
- Java IO用法详解
一.java io 概述 1.1 相关概念 Java IO Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这 ...
- Java 注解用法详解——@SuppressWarnings
转自: https://www.cnblogs.com/fsjohnhuang/p/4040785.html Java魔法堂:注解用法详解--@SuppressWarnings 一.前言 编码时我们总 ...
- linux mount命令参数及用法详解
linux mount命令参数及用法详解 非原创,主要来自 http://www.360doc.com/content/13/0608/14/12600778_291501907.shtml. htt ...
- Linux下的awk用法详解
Linux下的awk用法详解 一.awk介绍 二.awk的语法 三.awk常见用法 四.awk其他用法 五.awk语言特性 一.awk介绍 1.AWK 是一种处理文本文件的语言,是一个强大的文本分析工 ...
- Python中第三方库Requests库的高级用法详解
Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...
- response.setHeader()的用法详解及实现文件下载过程中出现问题的分析
response.setHeader()用法详解,转载记录: 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Prag ...
最新文章
- Linux的secureCRT设置字体大小
- XML Parsing in a Producer-Consumer Model
- centos7 安装python3
- linux java -xms_java.lang.OutOfMemoryError及解决方法
- Vue之前端页面使用json编辑框
- JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)
- linux 7 远程桌面xrdp,[转帖]CentOS7安装xrdp(windows远程桌面连接linux)
- CGAL4.4+VC2008编译
- 为什么numba不能提高背包功能的速度?
- [bigdata-093] drool 规则引擎安装和试用(不全)
- 管理信息系统期末复习
- ccy测试影响因子版270ms
- 转行软件测试两个多月,感觉很迷茫,下一步该如何提高自己?
- 利用clamav为程序添加查毒功能
- 接口设计需要考虑哪些方面
- DOS时代后,金山系再出神级办公软件,会像WPS一样普及
- Kubeadm搭建高可用K8S(四)Dashboard安装配置
- 让我摘下星星送给你_抖音想摘下星星给你是什么歌 星球坠落原唱是谁
- java中的依赖是啥意思_java – “ – ”(箭头)在gradle的依赖图中是什么意思?
- Veritas NetBackup8.1.1汉化
热门文章
- tomcat access log pattern
- oracle hint 谓词推进,SQL Hint都无法解救DB性能时,如何通过视图曲线救国?
- 【渝粤教育】电大中专电商运营实操 (13)作业 题库
- 数字图像处理(七) 图像分割
- 推荐系统000111
- Python实现人工神经网络逼近股票价格
- springmvc框架使用拦截器实现301永久重定向,其实用过滤器应该是更好
- 教你如何修改运行中的docker容器的端口映射
- ShopEx 中规格属性添加时,自己主动计算其相应的销售价格,同一时候注意模板中的变量间的计算...
- 算法笔记_083:蓝桥杯练习 合并石子(Java)