. . . . . . . . . . . . . . Blog Garden' C plus plus (My technology Impire!)

................................................................ It‘s a age of economic globalization and Infomation globalization........................................

C++启蒙之输入/输出

C++启蒙之输入/输出

 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程序,让用户输入两个数字,然后
打印出两个数字的和:

#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),当写入某个输出流的时候,它的效果是把新行写入到输出并且刷新与设备相关的缓冲器。通过刷新缓冲器,我们可以确保用户立即看到写入流的输出信息。

  注意:

  程序员在调试的过程中经常插入打印语句。这种语句一般也应该刷新流。如果忘记了这种操作,在程序崩溃的时候,可能会引起输出信息停留在缓冲器中,导致对程序在那个位置崩溃的判断错误。

  使用标准类库中的名称

  细心的读者可能注意到这个程序使用了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;

  这段代码合法吗?如果合法,是为什么?如果不合法,又是为什么? 

posted on 2006-10-04 03:09 Technical Consultant 阅读(182) 评论(0)  编辑 收藏 引用 所属分类: C plus plus dot Net


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


My Links

Blog Stats

常用链接

留言簿(3)

随笔分类(47)

随笔档案(45)

文章分类(87)

文章档案(87)

相册

C++

Database

Game Develope & Game Engine

Java

News

Web

最新随笔

搜索

最新评论

阅读排行榜

评论排行榜