C++ Primer 5th - 1.2 输入输出初看

1.2 输入输出初看

C++没有定义任何语句去做IO的事情。取而代之的是C++包含一个额外的并且支持IO(并还支持各种功能)的标准库。处于某种目的,在本书中包含的许多例子中,你只需要知道IO的几个基本概念和就可以了。

本书中的大多数例子都是用iostream库。组成iostream库的两个基本库叫istream和ostream,它们分别代表输入流和输出流。从IO设备上读取或写入时的一段连续的字符序列叫做流。流这个术语代表的是按时间顺序的字符的产生与消亡。

标准输入输出对象

这个库定义了四个IO对象,我们用istream的对象cin来处理输入。这个对象通常也称为标准输入。我们用ostream的对象cout来处理输出,这个对象通常也称为标准输出。iostream这个库中同样也定义了两个ostream的两个对象,分别是cerr和clog。cerr用来警告和错误信息,称为标准错误。clog用来生成程序在执行时的信息。

在一般情况下,操作系统会将这些IO对象与在运行状态下的程序的关联起来。所以,当我们从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代表一个头文件。不管什么程序,使用一个库的时候必须要包含这个库相关的头文件。#include指令和尖括号里面的名字必须处于同一行才有效,并且在一般情况下,#include指令不能出现在函数体内。

向流中写入

在main函数中的第一句指令是一个表达式。在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;

第一个输出操作打印一条信息给用户,这条消息为字面字符串,它是一个被双引号括起来的字符序列。在双引号中间的文本将打印到标准输出。第二个输出操作打印endl,endl的作用是结束当前的一行并且刷新与设备相关联的缓冲区。

使用标准库的命名空间

细心的读者可能会注意到比起cout,cin更愿意使用std::cout,std::cin。std::的意思是cout和cin这两个对象都定义在叫std的命名空间下。命名空间可以让我们避免在库的内部定义的名字发生冲突。标准库中的所有名字都定义在std这个命名空间下。

库中使用明明空间的一个作用是当我们从库中使用一个名字的时候,我们必须显式地对编译器说我们想要使用std下的名字。std::cout使用作用于标识符来说明想要使用std下的cout。在3.1节中将会介绍访问库中的名字的简单办法。

从流中读

在提示用户输入数字之后,我们的下一步会想要读取这些输入。我们从定义v1和v2这两个变量来存储输入开始:
    int v1 = 0, v2 = 0;
我们定义这些变量为int类型,并且将它们初始化为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。标准库中定义了许多输入输出操作符的版本去处理不同的类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值