1.2 初识输入输出

1.2 初识输入输出

C++语言并未定义任何输入输出(IO)语句,取而代之,包含了一个全面的标准库(standard library)来提供IO机制(以及很多其他机制)。对于很多用途,包括本文章中的实例来说,我们只需了解IO库中一部分基础概念和操作。
本书中的很多示例都使用了iostream库。iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流。一个流就是一个字符序列,是从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;

链中每个运算符的左侧运算对象都是相同的,在本例中是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。3.1节
将给出一个更简单的访问标准库中的名字的方法。

如果我们这里有一些急性子,我可以现在公布一下:
在头文件后面加:using namespace std;

从流读取数据

在提示用户输入数据之后,接下来我们希望读入用户的输入。首先定义两个名为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的计算结果。标准库定义了不同版本的输入输出运算符,来处理这些不同类型的运算对象。

1.2节练习


练习1.3:编写程序,在标准输出上打印Hello,World。
练习1.4:我们的程序使用加法运算符+来将两个数相加。编写程序使用乘法运算符(星号),来打印两个数的积。
练习1.5:我们将所有输出操作放在一条很长语句中。重写程序,将每个运算对象的打印操作放在一条独立的语句中。
练习1.6:解释下面程序片段是否合法。

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

如果程序是合法的,它输出什么?如果程序不合法,原因何在?应该如何修正?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值