《C++ 开发从入门到精通》——2.4 输入输出基础

简介:

本节书摘来自异步社区出版社《C++ 开发从入门到精通》一书中的第2章,第2.4节,作者: 王石磊 , 韩海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.4 输入输出基础

1 知识点讲解:光盘:视频PPT讲解(知识点)第2章输入输出基础.mp4

C++并没有直接定义进行输入或输出(IO)的任何语句,而是由标准库(standard library)提供,IO库为程序员提供了大量的工具。然而对于许多应用来说,包括本书的例子而言,编程者只需要了解一些基本概念和操作。本书中的大多数例子都使用了处理格式化输入和输出的iostream库。iostream库的基础是两种命名为istream和ostream的类型,分别表示输入流和输出流。流是指要从某种IO设备上读入或写出的字符序列。术语“流”试图说明字符是随着时间顺序生成或消耗的。在本节的内容中,将简要讲解C++实现输入和输出的基本知识。

2.4.1 标准输入与输出对象

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

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

2.4.2 一个使用IO库的程序

到目前为止,我们已经明白如何编译与执行简单的程序,虽然那个程序什么也不做。在接下来的内容中,我们先来看一看应该如何实现把两数相加的处理代码。我们可以使用IO库来扩充main程序,实现输出用户给出的两个数的和的功能,具体代码如下。

#include <iostream>
int main()
{
   std::cout << "输入两个数字:" << std::endl;
   int v1, v2;
   std::cin >> v1 >> v2;
   std::cout << "它们的和是" << v1 << " and " << v2
           << " is " << v1 + v2 << std::endl;
   return 0;
}

在上述代码中,首先在用户屏幕上显示提示语“输入两个数字:”,输入后按下回车键,将输出两者的和。程序的第一行是一个预处理指示。

#include <iostream>
功能是告诉编译器要使用iostream库。尖括号里的名字是一个头文件。当程序使用库工具时必须包含相关的头文件。#include指令必须单独写成一行——头文件名和#include必须在同一行。通常,#include指令应出现在任何函数的外部。而且习惯上,程序的所有#include指示都在文件开头部分出现。

1.写入到流

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),将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区(buffer)。通过刷新缓冲区,保证用户立即看到写入到流中的输出。

F:paiban电子书41885图zy.png

注意:程序员经常在调试过程中插入输出语句,这些语句都应该刷新输出流。忘记刷新输出流可能会造成输出停留在缓冲区中,如果程序崩溃,将会导致程序错误推断崩溃位置。

2.使用标准库中的名字

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

标准库使用命名空间的副作用是,当我们使用标准库中的名字时,必须显式地表达出使用的是命名空间std下的名字。std::cout的写法使用了作用域操作符(scope operator,::操作符),表示使用的是定义在命名空间std中的cout。

3.读入流

在输出提示语后,将读入用户输入的数据。先定义两个名为v1和v2的变量(variable)来保存输入。

int v1, v2;
将这些变量定义为int类型,int类型是一种代表整数值的内置类型。这些变量未初始化(uninitialized),表示没有赋给它们初始值。这些变量在首次使用时会读入一个值,因此可以没有初始值。下一条语句读取输入如下。

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

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

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

4.完成程序

剩下的就是要输出结果。

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

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

"The sum of "
其他是不同的int值,如v1和v2以及对算术表达式v1 + v2求值的结果。iostream库定义了接受全部内置类型的输入输出操作符版本。

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

相关文章
|
机器学习/深度学习 算法 算法框架/工具
为什么使用C++进行机器学习开发
C++作为一种高性能语言,在某些性能要求极高或资源受限的场景下也具有非常重要的地位。C++的高效性和对底层硬件的控制能力,使其在大规模机器学习系统中发挥重要作用,尤其是当需要处理大数据或实时响应的系统时。
516 3
|
IDE 开发工具 C语言
C++一分钟之-嵌入式编程与裸机开发
通过这些内容的详细介绍和实例解析,希望能帮助您深入理解C++在嵌入式编程与裸机开发中的应用,提高开发效率和代码质量。
558 13
WK
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
1187 1
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
653 7
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
1107 3
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
766 1
WK
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
617 0
WK
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
669 0
|
NoSQL API Redis
如何使用 C++ 开发 Redis 模块
如何使用 C++ 开发 Redis 模块
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
1972 0