C++primer的学习|section1.2. 初窥输入/输出


1.2. 初窥输入/输出

C++ 并没有直接定义进行输入或输出(IO)的任何语句,这种功能是由 标准库提供的。
IO 库提供了大量的设施。然而,对许多应用,包括本书的例子而言,编程者只需要了解一些基本概念和操作。

本书的大多数例子都使用了处理格式化输入和输出的 iostream
iostream 库的基础是两种命名为 istreamostream 的类型,分别表示输入流和输出流。
流是指要从某种 IO 设备上读入或写出的字符序列。术语“流”试图说明字符是随着时间顺序生成或消耗的。

1.2.1. 标准输入与输出对象

标准库定义了 4 个 IO 对象。处理输入时使用命名为 cin(读作 see-in)的 istream 类型对象。这个对象也称为 标准输入
处理输出时使用命名为 cout(读作 see-out)的 ostream 类型对象,这个对象也称为 标准输出。标准库还定义了另外两个 ostream 对象,分别命名为 cerrclog(分别读作“see-err”和“see-log”)。 cerr 对象又叫作 标准错误,通常用来输出警告和错误信息给程序的使用者。而 clog 对象用于产生程序执行的一般信息。

一般情况下,系统将这些对象与执行程序的窗口联系起来。这样,当我们从 cin 读入时,数据从执行程序的窗口读入,当写到 cincerrclog 时,输出写至同一窗口。运行程序时,大部分操作系统都提供了重定向输入或输出流的方法。利用重定向可以将这些流与所选择的文件联系起来。


1.2.2. 一个使用IO库的程序

到目前为止,我们已经明白如何编译与执行简单的程序,虽然那个程序什么也不做。在开篇的书店问题中,有一些记录含有相同的 ISBN,需要将这些记录进行汇总,也就是说需要弄清楚如何累加已售出书籍的数量。

为了弄清楚如何解决这个问题,我们先来看应如何把两数相加。我们可以使用 IO 库来扩充 main 程序,要求用户给出两个数,然后输出它们的和:
#include <iostream>
int main() { std::cout << "Enter two numbers:" << std::endl; int v1, v2;
                                                    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 库。尖括号里的名字是一个。 头文件。程序使用库工具时必须包含相关的头文件。
#include 指示必须单独写成一行——头文件名和 #include 必须在同一行。通常, #include 指示应出现在任何函数的外部。而且习惯上,程序的所有 #include 指示都在文件开头部分出现。

              std::cout << "Enter two numbers:" << std::endl;
    等价于std::cout<<"Enter two numbers:";
              std::cout<<endl;
    endl是一个特殊的值,称为操作符,当它写入输入输出流时,具有换行的效果,并刷新与设备相关连的缓冲区。
Writing to a Stream
写入到流

main 函数体中第一条语句执行了一个表达式。C++ 中,一个表达式由一个或几个操作数和通常是一个操作符组成。该语句的表达式使用输出操作符<< 操作符),在标准输出上输出提示语:

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

这个语句用了两次输出操作符。每个输出操作符实例都接受两个操作数: 左操作数必须是 ostream 对象;右操作数是要输出的值。操作符将其右操作数写到作为其左操作数的 ostream 对象。

C++ 中,每个表达式都会产生一个结果,通常是将操作符作用到其操作数所产生的值。当操作符是输出操作符时,结果是左操作数的值。也就是说,输出操作返回的值是输出流本身。



既然输出操作符返回的是其左操作数,那么我们就可以将输出请求链接在一起。输出提示语的那条语句等价于

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


因为((std::cout << "Enter two numbers:"))返回其左操作数 std::cout,这条语句等价于

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


endl 是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区。通过刷新缓冲区,用户可立即看到写入到流中的输出。

Programmers often insert print statements during debugging. Such statements should always flush the stream. Forgetting to do so may cause output to be left in the buffer if the program crashes, leading to incorrect inferences about where the program crashed.

程序员经常在调试过程中插入输出语句,这些语句都应该刷新输出流。忘记刷新输出流可能会造成输出停留在缓冲区中,如果程序崩溃,将会导致程序错误推断崩溃位置。
Using Names from the Standard Library
使用标准库中的名字

细心的读者会注意到这个程序中使用的是 std::coutstd::endl,而不是 coutendl
前缀 std:: 表明 coutendl 是定义在 命名空间 std 中的。使用命名空间程序员可以避免与库中定义的名字相同而引起无意冲突。因为标准库定义的名字是定义在命名空间中,所以我们可以按自己的意图使用相同的名字。

标准库使用命名空间的副作用是,当我们使用标准库中的名字时,必须显式地表达出使用的是命名空间 std 下的名字。std::cout 的写法使用了作用域操作符(scope operator:: 操作符),表示使用的是定义在命名空间 std 中的 cout。我们将在第 3.1 节学习到程序中经常使用的避免这种冗长句法的方法。

Reading From a Stream
读入流

在输出提示语后,将读入用户输入的数据。先定义两个名为 v1v2变量来保存输入:

      int v1, v2;


将这些变量定义为 int 类型,int 类型是一种代表整数值的内置类型。这些变量未初始化,表示没有赋给它们初始值。这些变量在首次使用时会读入一个值,因此可以没有初始值。

下一条语句读取输入:

      std::cin >> v1 >> v2;


输入操作符>> 操作符)行为与输出操作符相似。它接受一个 istream 对象作为其左操作数,接受一个对象作为其右操作数,它从 istream 操作数读取数据并保存到右操作数中。像输出操作符一样,输入操作符返回其左操作数作为结果。由于输入操作符返回其左操作数,我们可以将输入请求序列合并成单个语句。换句话说,这个输入操作等价于:

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


输入操作的效果是从标准输入读取两个值,将第一个存放在 v1 中,第二个存放在 v2 中。

Completing the Program
完成程序

剩下的就是要输出结果:

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


这条语句虽然比输出提示语的语句长,但概念上没什么区别。它将每个操作数输出到标准输出。有趣的是操作数并不都是同一类型的值,有些操作数是字符串字面值。例如

   "The sum of "

and others are various int values, such as v1, v2, and the result of evaluating the arithmetic expression:

其他是各种 int 值,如 v1v2 以及对算术表达式

   v1 + v2

The iostream library defines versions of the input and output operators that accept all of the built-in types.

求值的结果。iostream 库定义了接受全部内置类型的输入输出操作符版本。

When writing a C++ program, in most places that a space appears we could instead use a newline. One exception to this rule is that spaces inside a string literal cannot be replaced by a newline. Another exception is that spaces are not allowed inside preprocessor directives.

在写 C++ 程序时,大部分出现空格符的地方可用换行符代替。这条规则的一个例外是字符串字面值中的空格符不能用换行符代替。另一个例外是空格符不允许出现在预处理指示中。


猜你喜欢

转载自blog.csdn.net/qq_41245033/article/details/80214481