C++启蒙之输入/输出
副标题#e#
C++没有直接界说任何用于执行输入或输出(IO)的语句。作为取代,IO是通过尺度类库(standard library)提供的。IO类库提供了一个遍及的东西荟萃。可是,出于某些目标(包罗本文中的例子),你大概需要相识一些根基的观念和操纵。
本文中的例子利用了iostream类库,它处理惩罚名目化输入和输出。Iostream的基本是两个范例istream和ostream,它们别离暗示输入和输出流。流(stream)是筹备读取或写入某个IO设备或其它设备的字符串。"流"这个术语体现跟着时间的推移,生成了字符或消除了字符。
1、尺度的输入和输出工具
该类库界说了四个IO工具。为了处理惩罚输入,我们利用了istream范例的cin工具,它是尺度的输入。输出则利用ostream的cout工具,它凡是被称为尺度的输出。这个类库还界说了其它的两个ostream工具,别离是cerr和clog。Cerr工具是尺度的错误,典范环境下用于给措施的用户生成告诫或错误动静。Clog工具用于生成措施的执行环境信息。
凡是,系统把个中的每个工具都与措施执行的窗体相关联。因此,当我们从cin中读取的时候,数据来自措施执行的窗体,当我们写入cout、cerr、clog的时候,输出也写入沟通的窗体。大大都操纵系统都给了我们重定向输入或输出流的要领。利用重定向可以把这些流与我们选定的文件关联起来。
2、利用IO类库的措施
我们已经知道了如何编译和执行简朴的措施了,尽量这个措施没有任何成果。在整个问题中,有几个记录指向同一个ISBN。我们必需把这些记录归并成总数,这意味着我们必需知道如何添加销售的图书数量。
为了看到如何办理这些问题,我们先看一看两个数字如何相加。利用IO类库,我们可以扩展已有的main措施,让用户输入两个数字,然后打印出两个数字的和:
#p#副标题#e#
#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
我们的措施的第一行是预处理惩罚措施指令(preprocessor directive):
#include <iostream>
它汇报编译器我们但愿利用iostream类库。尖括号内的名字是头文件(header)。每个利用了类库的措施都必需包括相关的头文件。#include指令必需写在同一行中–头文件的名字和#include必需呈此刻同一行。一般来说,#include指令应该呈此刻函数的外面。典范环境下,#include指令呈此刻措施文件的开头部门。
向流写入信息
Main主体中的第一个语句执行了一个表达式(expression)。在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是一个非凡值,称为操纵者(manipulator),当写入某个输出流的时候,它的结果是把新行写入到输出而且刷新与设备相关的缓冲器。通过刷新缓冲器,我们可以确保用户当即看到写入流的输出信息。
留意:
措施员在调试的进程中常常插入打印语句。这种语句一般也应该刷新流。假如健忘了这种操纵,在措施瓦解的时候,大概会引起输出信息逗留在缓冲器中,导致对措施在谁人位置瓦解的判定错误。
利用尺度类库中的名称
#p#分页标题#e#
细心的读者大概留意到这个措施利用了std::cout和std::endl而不是cout和endl。std::前缀表白cout和endl这两个名称是在std名字空间(namespace)中界说的。名字空间答允措施员制止在类库中界说的名称斗嘴。由于尺度类库中界说的名称都界说在名字空间中,我们可以利用沟通的名称。
类库利用名字空间的副浸染是当利用某个类库中的名称的时候,我们必需明晰地说明本身但愿从std名字空间中利用某个名称。std::cout利用了范畴操纵符(scope operator,::)来说明我们利用的cout名称界说在std名字空间中。
从流中读取数据
输入提示信息之后,我们下一步需要读取用户的输入信息。我们先界说了两个变量(variable)v1和v2来生存输入信息:
int v1, v2;
我们把这些变量界说为整型(int),它是表示整数值的内建范例。这些变量没有被初始化,意味着我们没有给它们赋予初始值。我们第一次利用这些变量的时候就是把值读入它们内里,因此不赋予初始值也是正确的。
下一个语句
std::cin >> v1 >> v2;
读取输入信息。输入操纵符(>>操纵)与输出操纵符的行为雷同。它左边的操纵数是流,右边的操纵数是工具。它从流操纵数中读取并把值存储到右边操纵数中。与输出操纵符雷同,输入操纵符返回左边的操纵数。由于这种操纵返回左边的操纵数,我们就可以把一组输入请求归并成为一个语句。换句话说,这个输入操纵等同于:
std::cin >> v1;
std::cin >> v2;
我们的输入操纵的结果是从尺度的输入中读取两个值,存储在v1和v2中。
完善措施
剩余的部门是输出功效:
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
尽量这个语句比输出提示信息的语句长一些,可是它们本质上没有区别。它把每个操纵数都打印到尺度的输出中。个中有趣的是这些值的范例是差异的。有些操纵数是字符文本,譬喻
"The sum of "
而其它的一些是整型值,譬喻v1、v2和算术表达式的功效:
v1 + v2
iostream类库界说了两种输入和输出操纵符,它们可以或许接管所有的内建范例。
请留意:
编写C++措施的时候,在大大都环境下呈现空格的时候都可以用新行取代。这条法则的破例是字符串文本中的空格不能用新行取代。另一个破例是预处理惩罚措施指令中的空格也不答允替代。
已初始化和未初始化的变量
在C++中初始化是一个很重要的观念。初始化变量指在界说的时候给变量赋值。未初始化变量没有赋予初始值:
int val1 = 0; // 初始化了的
int val2; // 未初始化的
给变量赋予初始值一般都是正确的,可是不必然是须要的。当我们可以或许必定第一次利用变量的时候会给它赋予一个新值,就没有须要赋予初始值。
当我们界说变量的时候,我们必需给它赋予初始值,除非我们可以或许必定在变量利用之前这个值会被包围(重载)。假如不能担保变量被读取之前先复位,我们就应该初始化它:
操练3:
在尺度输出中打印出"Hello,World"。
操练4:
我们的措施利用内建的加操纵符(+)来生成两个数的和。编写一个措施利用乘操纵符(*)生成两个数字的积。
操练5:
我们把输出信息写在一个长的语句中了。从头编写这个措施,利用独立的语句输出每一个操纵数。
操练6:
表明下面的措施片断的成果:
std::cout << "The sum of " << v1;
<< " and " << v2;
<< " is " << v1 + v2
<< std::endl;
这段代码正当吗?假如正当,是为什么?假如不正当,又是为什么?