控制台(console)是电脑的最基本交互接口,通常包括键盘(keyboard)和屏幕(screen)。键盘通常为标准输入设备,而 屏幕为标准输出设备。

在C++的iostream函数库中,一个程序的标准输入输出操作依靠两种数据流:cin 给输入使用和cout给输出使用。另外,cerrclog也已经被实现――它们是两种特殊设计的数据流专门用来显示出错信息。它们可以被重新定向到标准输出设备或到一个日志文件(log file)。

因此cout (标准输出流)通常被定向到屏幕,而cin (标准输入流)通常被定向到键盘。

通过控制这两种数据流,你可以在程序中与用户交互,因为你可以在屏幕上显示输出并从键盘接收用户的输入。

输出Output (cout)

输出流cout与重载(overloaded)运算符<<一起使用:

cout << "Output sentence"; // 打印Output sentence到屏幕上
cout << 120; // 打印数字 120 到屏幕上
cout << x; // 打印变量 x 的值到屏幕上

运算符<<又叫插入运算符(insertion operator) 因为它将后面所跟的数据插入到它前面的数据流中。在以上的例子中,字符串常量Output sentence,数字常量120和变量x先后被插入输出流cout中。注意第一句中字符串常量是被双引号引起来的。每当我们使用字符串常量的时候,必须用引号把字符串引起来,以便将它和变量名明显的区分开来。例如,下面两个语句是不同的:

cout << "Hello"; // 打印字符串Hello到屏幕上
cout << Hello; // 把变量Hello存储的内容打印到屏幕上

插入运算符insertion operator (<<)可以在同一语句中被多次使用:

cout << "Hello, " << "I am " << "a C++ sentence";

上面这一行语句将会打印 Hello, I am a C++ sentence 到屏幕上。插入运算符(<<) 的重复使用在我们想要打印变量和内容的组合内容或多个变量时有所体现:

cout << "Hello, I am " << age << " years old and my zipcode is " << zipcode;

如果我们假设变量age的值为24,变量zipcode的值为90064,以上句子的输出将为: Hello, I am 24 years old and my zipcode is 90064

必须注意,除非我们明确指定,cout并不会自动在其输出内容的末尾加换行符,因此下面的语句:

cout << "This is a sentence.";
cout << "This is another sentence.";

将会有如下内容输出到屏幕:

This is a sentence.This is another sentence.

虽然我们分别调用了两次cout,两个句子还是被输出在同一行。所以,为了在输出中换行,我们必须插入一个换行符来明确表达这一要求。在C++中换行符可以写作\n:

cout << "First sentence.\n ";
cout << "Second sentence.\nThird sentence.";

将会产生如下输出:

First sentence.
Second sentence.
Third sentence.

另外,你也可以用操作符endl来换行,例如:

cout << "First sentence." << endl;
cout << "Second sentence." << endl;

将会输出:

First sentence.
Second sentence.

当操作符endl被用在buffered streams中时有一点特殊:它们被flushed。不过cout 默认为unbuffered,所以不会被影响。 你可以暂时不管这一点。

你可以使用\n或endl来指定cout输出换行,请注意前面所讲的两者的不同用法。

输入Input (cin)

C++中的标准输入是通过在cin数据流上重载运算符extraction (>>) 来实现的。它后面必须跟一个变量以便存储读入的数据。例如:

int age;
cin >> age;

声明一个整型变量age然后等待用户从键盘输入到cin并将输入值存储在这个变量中。

cin 只能在键盘输入回车键(RETURN)后才能处理前面输入的内容。因此即使你只要求输入一个单独的字符,在用户按下回车键(RETURN)之前cin将不会处理用户的输入的字符。

在使用cin输入的时候必须考虑后面的变量类型。如果你要求输入一个整数,extraction (>>) 后面必须跟一个整型变量,如果要求一个字符,后面必须跟一个字符型变量,如果要求一个字符串,后面必须跟一个字符串型变量。

// i/o example
#include <iostream.h>
int main ()
{
int i;
cout << "Please enter an integer value: ";
cin >> i;
cout << "The value you entered is " << i;
cout << " and its double is " << i*2 << ".\n";
return 0;
}
Please enter an integer value: 702
The value you entered is 702 and its double is 1404.

使用程序的用户可以使引起错误的原因之一,即使是在最简单的需要用cin做输入的程序中(就像我们上面看到的这个程序)。因为如果你要求输入一个整数数值,而用户输入了一个名字(一个字符串),其结果可能导致程序产生错误操作,因为它不是我们期望从用户处获得的数据。当你使用由cin 输入的数据的时候,你不得不假设程序的用户将会完全合作而不会在程序要求输入整数的时候输入他的名字。后面当我们看到怎样使用字符串的时候,我们将会同时看到一些解决这一类出错问题的办法。

你也可以利用cin 要求用户输入多个数据 :

cin >> a >> b;

等同于:

cin >> a;
cin >> b;

在以上两种情况下用户都必须输入两个数据,一个给变量a,一个给变量b。输入时两个变量之间可以以任何有效的空白符号间隔,包括空格,跳跃符tab或换行。

cin和字符串

我们可以像读取基本类型数据一样,使用cin和>>操作符来读取字符串,例如:

cin >> mystring;

但是,cin >> 只能读取一个单词,一旦碰到任何空格,读取操作就会停止。在很多时候这并不是我们想要的操作,比如我们希望用户输入一个英文句子,那么这种方法就无法读取完整的句子,因为一定会遇到空格。

要一次读取一整行输入,需要使用C++的函数 getline,相对于是用cin,我们更建议使用getline来读取用户输入。

例如:

// 读取字符串例子
#include <iostream>
#include <string>
using namespace std;int main ()
{string mystr;cout << "What's your name? ";getline (cin, mystr);cout << "Hello " << mystr << ".\n";cout << "What is your favorite color? ";getline (cin, mystr);cout << "I like " << mystr << " too!\n";return 0;
}
What's your name? Aqua
Hello Aqua.
What is your favorite color? blue
I like blue too!

你可能注意到在上面的例子中,两次调用 getline 函数我们都是用了同一个字符串变量(mystr)。在第二次调用的时候,程序会自动用第二次输入的内容取代以前的内容。

字符串流 (stringstream)

标准头文件 <sstream> 定义了一个叫做 stringstream 的类,使用这个类可以对基于字符串的对象进行像流(stream)一样的操作。这样,我们可以对字符串进行抽取和插入操作,这对将字符串与数值互相转换非常有用。例如,如果我们想将一个字符串转换为一个整数,可以这样写:

string mystr ("1204");
int myint;
stringstream(mystr) >> myint;

这个例子中先定义了一个字符串类型的对象mystr,初始值为"1204",又定义了一个整数变量myint。然后我们使用 stringstream 类的构造函数定义了这个类的对象,并以字符串变量mystr为参数。因为我们可以像使用流一样使用stringstream 的对象,所以我们可以像使用cin那样使用操作符 >> 后面跟一个整数变量来进行提取整数数据。这段代码执行之后变量 myint 存储的是数值 1204 。

// 字符串流的使用示例
#include <iostream>
#include <string>
#include <sstream>
using namespace std;int main ()
{string mystr;float price=0;int quantity=0;cout << "Enter price: ";getline (cin,mystr);stringstream(mystr) >> price;cout << "Enter quantity: ";getline (cin,mystr);stringstream(mystr) >> quantity;cout << "Total price: " << price*quantity << endl;return 0;
}
Enter price: 22.25
Enter quantity: 7
Total price: 155.75

在这个例子中,我们要求用户输入数值,但不同于从标准输入中直接读取数值,我们使用函数getline从标注输入流cin中读取字符串对象(mystr),然后再从这个字符串对象中提取数值price和quantity。

通过使用这种方法,我们可以对用户的输入有更多的控制,因为它将用户输入与对输入的解释分离,只要求用户输入整行的内容,然后再对用户输入的内容进行检验操作。这种做法在用户输入比较集中的程序中是非常推荐使用的。

C++基础知识(五)—— 基本输入输出相关推荐

  1. git 分支复制_Git基础知识(五)

    Git基础知识(五) 分支 都说Git的分支是它的必杀技特性,由于没有接触过太多的版本管理工具,就使用过的SVN来说,两者真的差别巨大.SVN创建一个分支,需要将内容复制一遍!这个时间真的是非常的漫长 ...

  2. JavaSE基础知识(五)--面向对象代码实现初步(实现一个简单的类类型代码)

    Java SE 是什么,包括哪些内容(五)? 本文内容参考自Java8标准 一.面向对象(代码实现): 首先,在这里我需要说明一个根本性的问题:实际上,面向对象编程包括了两部分,一个是你的编程思想,一 ...

  3. C# 基础知识 (五).变量类型和字符串处理

            这篇文章是阅读<C#入门经典(Beginning C#)>书籍里面的内容,作者Karli Watson.主要包括自己缺乏的一些C#基础知识和在线笔记使用,文章主要包括C#简 ...

  4. Java基础知识(五) 字符串与数组

    Java基础知识 字符串与数组 1. 字符串的创建与存储的机制是什么 2. "==".equals和hashCode有什么区别 3. String.StringBuffer.Str ...

  5. 卷积神经网络基础知识五(mobilenet)

    一.简单介绍 1.1 绪论 论文下载地址: MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applicat ...

  6. JavaSE基础知识(五)--面向对象思想概述

    Java SE 是什么,包括哪些内容(五)? 本文内容参考自Java8标准 一.面向对象: 1.回顾前面的博文("了解这个开头,更有利于了解对象以及面向对象的思想") 首先我们知道 ...

  7. java基础知识五、六、七、八

    第五章 在较大的数之前先增加较小数是减小误差的一种方法. 第六章 方法签名(Method Signature)指方法名称.参数类型和参数数量.java编译器根据方法签名决定使用哪个方法. 调用方法时, ...

  8. Matlab基础知识五

    第五节 1.subplot() plot() 绘制二维图像,一般默认格式为plot(x,y),也可以用带属性的格式,增加线条的属性(标记符号.线型.颜色.粗细等) subplot(m,n,1); 改变 ...

  9. Java并发基础知识(五)

    线程池 为什么要用线程池? Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 第一:降低资源消耗.通过 ...

  10. Android学习之基础知识五—RecyclerView(滚动控件)

    RecyclerView可以说是增强版的ListView,不仅具有ListVIew的效果,还弥补许多ListView的不足. 一.RecyclerView的基本用法 与百分比布局类似,Recycler ...

最新文章

  1. 【C++专题】static_cast, dynamic_cast, const_cast探讨
  2. 问题的提出方式。(【先】说出最关键的【结果】,然后再描述细节)
  3. 有什么软件可以测试win10电脑性能,微软能否翻盘 Win10系统4K高分优化实测
  4. 推荐系统--基于用户的协同过滤算法(UserCF)
  5. AUTOCAD--实时缩放
  6. Butterworth低通滤波器
  7. WPS自动生成图片目录
  8. 华为交换机ntp自动校时配置
  9. 数据分析师必备技能之埋点
  10. 截图/贴图神器—Snipaste,下载地址
  11. jQuery weui Select组件显示指定值
  12. 用Python来玩微信小游戏跳一跳
  13. Android相机预览页面被压缩和拉伸问题
  14. 离散数学实验3 平面图判定及对偶图的求解 C++
  15. Ubuntu图形界面下命令行窗口打开快捷键创建
  16. 原子操作 - linux内核锁(一)
  17. windows网络服务之配置网络负载均衡(NLB)群集
  18. LeetCode 1079 活字印刷
  19. 中国研修网计算机培训心得,网络研修心得体会范文
  20. cf进服务器显示排位封停,cf枪王排位永久禁赛怎么解封(cf排位赛禁赛原因分析)...

热门文章

  1. IE 弹出框处理经验
  2. JAVA基础----java中E,T,?的区别
  3. 在Windows上编译MongoDB C Driver
  4. 滞后分析rstudio_使用RStudio进行A / B测试分析
  5. leetcode 18. 四数之和(双指针)
  6. leetcode733. 图像渲染(bfs)
  7. leetcode剑指 Offer 11. 旋转数组的最小数字(二分查找)
  8. pandas之DataFrame合并merge
  9. Python循环的一些基本练习
  10. 用URLGather来管理和保存你的页面