注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 程序开发 > 32位开发 > C/C++ > 内容正文

C++启蒙之输入/输出

发布时间:2006-09-20 17:57:26 来源:友佳学院 网友评论 0 条
  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;

  这段代码合法吗?如果合法,是为什么?如果不合法,又是为什么?
关于 C++ C++教程 C++下载 C++程序 C++技巧 C++函数 C++工具 C++应用 的新闻
  • More Effective C++:理解new和delete
  • More Effective C++:不要重载的操作符
  • C++启蒙之编写简单的C++程序
  • C++中class与struct的区别
  • More Effective C++:避免缺省构造函数
【评论】【收藏本文】【打印】【关闭】
上一篇文章:More Effective C++:理解new和delete
下一篇文章:C++中禁止异常信息传递到析构函数外
讨论区
查看
已有 0 位对此新闻感兴趣的网友发表了看法
匿名发表
注册通行证 登陆
图文阅读推荐
全站资源
  • 微软官方入门教程19:轻松掌握Vista系统的快
  • 微软2008大冲击,预借Vista SP1力促Vista市
  • 在收件箱中获得 Windows Vista 的最新更新
  • 微软官方Vista入门教程全集19篇(Vista学院
  • Windows Vista 的成功将势不可挡
  • 快快抛弃Vista,拥抱XP SP3!你觉得呢?
  • 浅谈Vista系统关闭虚拟内存与使用内存盘加速
  • 嘿嘿,按下键盘上面的三个键,马上让你的Vi
  • Windows Vista的盗版率只有Windows XP的一半
  • 3DMark和PCMark Vantage新版将只支持Vista系
阅读排行
  • Borland 发布C++ Builder 2006 RAD 环境
  • C/C++程序员应聘常见面试题深入剖析
  • Visual C++常用数据类型转换详解
  • C++中的 static 关键字
  • 利用VC++实现局域网实时视频传输
  • 浅谈C/C++内存泄漏及其检测工具
  • 英国投票否决C++/CLI 微软强攻ISO标准受挫
  • VC++下用MSComm控件实现串口通讯
  • 伪随机数生成及在VC++中的实现
  • VC++编程实现对波形数据的频谱分析
最新技术文档
  • C++中用赋值形式op=取代单独形式op
  • C++启蒙之用C++制作程序
  • C++启蒙之C++中的类
  • 解析C++/CLI之头文件、内联函数与数组
  • C++启蒙之控制结构
  • C++启蒙之注释符号
  • 了解C++异常处理的系统开支
  • C++语言学习之从结构到类
  • C++中理解“传递参数”和异常之间的差异
  • C++中禁止异常信息传递到析构函数外
专题教程
  • 大话G游 专题:手机病毒揭密
  • ARP攻击防范与解决方案 路由故障处理手册
  • Picasa中文版_Picasa教程 专题:清除流氓软件
  • Firefox专题 seo搜索引擎优化专区
  • 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
  • 杀毒软件反被病毒杀 连"救命"都不能喊
  • 金山ARP防火墙
  • 还原卡神话破灭“机器狗”病毒来势汹汹
  • cctv经济半小时:你的手机现在安全吗?
  • 新挂马方式开始流行 ARP挂马称雄局域网
  • 木马和病毒清除的通用解法
  • IP地址不再冲突 查找ARP攻击者元凶
  • 教你几招识别和防御Web网页木马
  • 分析:封杀BT只是暂时的止痛药
  • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载