内容来自《C++ Primer(第5版)》1.2 初识输入输出


目录

标准输入输出对象

一个使用IO库的程序

向流写入数据

使用标准库中的名字

从流读取数据

完成程序


C++语言并未定义任何输入输出(IO)语句,取而代之,包含了一个全面的标准库(standard library)来提供IO机制(以及很多其他设施)。对于很多用途,包括本书中的示例来说,我们只需了解IO库中一部分基本概念和操作。

本书中的很多示例都使用了iostream库。iostream库包含两个基础类型istreamostream,分别表示输入流和输出流。一个流就是一个字符序列,是从IO设备读出或写入IO设备的。术语“流”(stream)想要表达的是,随着时间的推移,字符是顺序生成或消耗的。

标准输入输出对象

标准库定义了4个IO对象。为了处理输入,我们使用一个名为cin(发音为see-in)的istream类型的对象。这个对象也被称为标准输入(standard input)。对于输出,我们使用一个名为cout(发音为see-out)的ostream类型的对象。此对象也被称为标准输出(standard output)。标准库还定义了其他两个ostream对象,名为cerrclog(发音分别为see-err和see-log)。我们通常用cerr来输出警告和错误消息,因此它也被称为标准错误(standard error)。而clog用来输出程序运行时的一般性信息。

系统通常将程序所运行的窗口与这些对象关联起来。因此,当我们读取cin,数据将从程序正在运行的窗口读入,当我们向cout、cerr和clog写入数据时,将会写到同一个窗口。

一个使用IO库的程序

在书店程序中,我们需要将多条记录合并成单一的汇总记录。作为一个相关的,但更简单的问题,我们先来看一下如何将两个数相加。通过使用IO库,我们可以扩展main程序,使之能提示用户输入两个数,然后输出它们的和:

#include <iostream>
int main()
{std::cout << "Enter two numbers:" << std::endl;int v1 = 0, v2 = 0;std::cin >> v1 >> v2;std::cout << "The sum of " << v1 << " and " << v2<< " is " << v1 + v2 << std::endl;return 0;
}

这个程序开始时在用户屏幕打印

Enter two numbers:

然后等待用户输入。如果用户键入

3 7

然后键入一个回车,则程序产生如下输出:

The sum of 3 and 7 is 10

程序的第一行

#include <iostream>

告诉编译器我们想要使用iostream库。尖括号中的名字(本例中是iostream)指出了一个头文件(header)。每个使用标准库设施的程序都必须包含相关的头文件。#include指令和头文件的名字必须写在同一行中。通常情况下,#include指令必须出现在所有函数之外。我们一般将一个程序的所有#include指令都放在源文件的开始位置。

向流写入数据

main的函数体的第一条语句执行了一个表达式(expression)。在C++中,一个表达式产生一个计算结果,它由一个或多个运算对象和(通常是)一个运算符组成。这条语句中的表达式使用了输出运算符<<)在标准输出上打印消息:

std::cout << "Enter two numbers:" << std::endl;

<<运算符接受两个运算对象:左侧的运算对象必须是一个ostream对象,右侧的运算对象是要打印的值。此运算符将给定的值写到给定的ostream对象中。输出运算符的计算结果就是其左侧运算对象。即,计算结果就是我们写入给定值的那个ostream对象。

我们的输出语句使用了两次<<运算符。因为此运算符返回其左侧的运算对象,因此第一个运算符的结果成为了第二个运算符的左侧运算对象。这样,我们就可以将输出请求连接起来。因此,我们的表达式等价于

(std::cout << "Enter two numbers:") << std::endl;

链中每个运算符的左侧运算对象都是相同的,在本例中是std::cout。我们也可以用两条语句生成相同的输出:

std::cout << "Enter two numbers:";
std::cout << std::endl;

第一个输出运算符给用户打印一条消息。这个消息是一个字符串字面值常量(string literal),是用一对双引号包围的字符序列。在双引号之间的文本被打印到标准输出。

第二个运算符打印endl,这是一个被称为操纵符(manipulator)的特殊值。写入endl的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流。

WARNING

程序员常常在调试时添加打印语句。这类语句应该保证“一直”刷新流。否则,如果程序崩溃,输出可能还留在缓冲区中,从而导致关于程序崩溃位置的错误推断。

使用标准库中的名字

细心的读者可能会注意到这个程序使用了std::cout和std::endl,而不是直接的cout和endl。前缀std::指出名字cout和endl是定义在名为std命名空间(namespace)中的。命名空间可以帮助我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突。标准库定义的所有名字都在命名空间std中。

通过命名空间使用标准库有一个副作用:当使用标准库中的一个名字时,必须显式说明我们想使用来自命名空间std中的名字。例如,需要写出std::cout,通过使用作用域运算符::)来指出我们想使用定义在命名空间std中的名字cout。

从流读取数据

在提示用户输入数据之后,接下来我们希望读入用户的输入。首先定义两个名为v1和v2的变量(variable)来保存输入:

int v1 = 0, v2 = 0;

我们将这两个变量定义为int类型,int是一种内置类型,用来表示整数。还将它们初始化(initialize)为0。初始化一个变量,就是在变量创建的同时为它赋予一个值。

下一条语句是

std::cin >> v1 >> v2;

它读入输入数据。输入运算符>>)与输出运算符类似,它接受一个istream作为其左侧运算对象,接受一个对象作为其右侧运算对象。它从给定的istream读入数据,并存入给定对象中。与输出运算符类似,输入运算符返回其左侧运算对象作为其计算结果。因此,此表达式等价于

(std::cin >> v1) >> v2;

由于此运算符返回其左侧运算对象,因此我们可以将一系列输入请求合并到单一语句中。本例中的输入操作从std::cin读入两个值,并将第一个值存入v1,将第二个值存入v2。换句话说,它与下面两条语句的执行结果是一样的

std::cin >> v1;
std::cin >> v2;

完成程序

剩下的就是打印计算结果了:

std::cout << "The sum of " << v1 << " and " << v2<< " is " << v1 + v2 << std::endl;

这条语句虽然比提示用户输入的打印语句更长,但原理上是一样的,它将每个运算对象打印在标准输出上。本例一个有意思的地方在于,运算对象并不都是相同类型的值。某些运算对象是字符串字面值常量,例如"The sum of "。其他运算对象则是int值,如v1、v2以及算术表达式v1+v2的计算结果。标准库定义了不同版本的输入输出运算符,来处理这些不同类型的运算对象。

【C++】初识输入输出相关推荐

  1. 【重温C++ Primer】第一章、初识C++

    目录 前言 一.编写一个简单的c++程序 二.编译.运行程序 三.初识输入输出 四.注释类型 五.控制流 5.1.循环语句:while + for 5.2.读取数量不定的输入数据 5.2.if 语句 ...

  2. 《C++primer》第一章--开始

      之前开始读<C++primer>,想着读书不动笔不如不读书,于是就想做一个读书笔记的内容,于是就想起了写一个<C++primer读思录>的一个专栏.一是为了给自己平时读书做 ...

  3. 《C++PrimerPlus》阅读笔记 + 源码实践

    目录 说明 前言 第一章:开始 1.1编写一个简单的C++程序 1.2初识输入输出 1.3注释简介 1.4控制流 1.5类 文件重定向 1.6书店程序 说明 C++PrimerPlus系列博客是对于书 ...

  4. Primer c++ 第5版pdf

    下载地址:网盘下载 内容简介  · · · · · · 这本久负盛名的 C++经典教程,时隔八年之久,终迎来史无前例的重大升级.除令全球无数程序员从中受益,甚至为之迷醉的--C++ 大师 Stanle ...

  5. 《C++ Primer 5th》笔记(1 / 19):C++基础

    文章目录 编写一个简单的C++程序 编译.运行程序 初识输入输出 注释简介 控制流 while语句 for语句 读取数量不定的输入数据 if语句 类简介 Sales_item类 初识成员函数 书店程序 ...

  6. C++学习:第一章 开始

    第一章 开始 学习一门新的程序设计语言的最好方法就是练习编写程序. 编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用mai ...

  7. C++问答1 语言基础

    1 32位 计算机上char, int , long int 字节长度为 1,2,4 2 常量与变量区别 常量 变量 初始化 需要 可不 寻址 不可,且地址不可赋给非常量指针 可 效率 以立即数形式( ...

  8. 第一章 开始 |编写一个简单的C++程序

    学习目标: 编写一个简答的C++程序 学习内容: 1.一个简单的c++程序 2.输入和输出 3.关于注释 4.控制流 5.类简介 6.书店程序 1.1 编写一个简单的c++程序 每个C++程序都包含一 ...

  9. C++ Primer中文版(第5版)

    <C++ Primer中文版(第5版) > 基本信息 作者: (美)Stanley B. Lippman(斯坦利 李普曼)    Josee Lajoie(约瑟 拉乔伊)    Barba ...

最新文章

  1. 基于重力补偿的 PD 控制
  2. PHP面试题:请以空格作为间隔,拆分字符串’Apple Orange Banana Strawberry’,组成数组$fruit,
  3. 猎鹰与龙飞船基于Linux,采用C++、Chromium与JS开发
  4. 【CDS技术揭秘系列 01】阿里云CDS-OSS容灾大揭秘
  5. 解决jodconverter 2.2.1 版本不支持docx、xlsx、pptx 转换成PDF格式异常
  6. 2021-06-01 深入分析锁升级流程的基础
  7. mysql reset_mysql的reset命令
  8. 投标文件模板 | 信息化智慧校园项目投标方案 | word版
  9. android SDK安装以及环境变量配置(windows)
  10. 漫谈基础工业软件开发
  11. 瑞星企业防毒2010网络版(二)管理及应用
  12. Linux丢包故障的解决与思路
  13. 手把手教你搭建SpringCloud项目(三)集成Eureka服务注册中心
  14. DDR从channel/rank/chip/bank/row/col/cell,DDR/GDDR/HBM
  15. 广度优先搜索(BFS)最短路径输出表示(三种方法)
  16. 微信.NET:开源的ASP.NET微信公众号应用平台 .
  17. 方孔分段的lisp_cad怎么把一条线直接分段
  18. C语言中双下划线__的作用
  19. Hyperspectral Band Selection by Multitask Sparsity Puisuit
  20. [COGS2189][HZOI 2015]帕秋莉的超级多项式-NTT-多项式求逆-多项式求ln-多项式开方-多项式求exp-多项式快速幂

热门文章

  1. Python+Pycharm和 VisualStudio C++社区版使用PK及易混淆的语法问题
  2. markdown中编辑复杂表格
  3. android程序字体大小,Android如何动态调整应用字体大小详解
  4. 有C++/C的java学习
  5. 通俗讲解 依概率收敛,大数定理和中心极限定理
  6. Buu Crypto
  7. javaWEB——主页面新闻展示删除查看修改主题绑定
  8. Linux桌面虚拟化技术--KVM
  9. 做好准备:独立游戏开发人员适用的 4P 营销理论
  10. SQL语句的基础教程(二)