C++ 中 Iostream 的定义
本指南讨论如何使用 C++ 中的基本输入/输出库。
利用 <iostream>
标头在 C++ 中包含全局流对象
输入/输出库是 C++ STL 的核心部分,几乎每个现实世界的程序都使用它。C++ I/O 操作被抽象为流的形式,可以认为是通用的数据序列。流抽象是使用多个继承的类实现的,并作为专门用于某些 I/O 操作的不同命名对象公开给用户。请注意,基于流的 I/O 库作为一个整体可用于将文本打印到控制台或从磁盘上的文件读取/写入数据。你可以将流库视为 C++ 程序与文件系统和设备交互的主要方式。
两个基本的流类是 istream
和 ostream
,对应于用于读取和写入数据的流。这些类提供对字符流的操作。程序经常使用四个全局流对象来执行诸如获取用户输入或打印错误消息之类的操作。这些对象是:
cout
:它表示与 C 语言中的stdout
对应的标准输出流。cin
:它是标准输入流(对应于stdin
)。cerr
:它是作为无缓冲流实现的标准错误流(对应于stderr
)。clog
:它是标准的日志流,没有 C 等效项,它提供了cerr
的缓冲版本。
I/O 流库的另一个重要部分是用于在不同对象之间链接操作的运算符。<<
运算符,称为流插入运算符,将数据推送到流对象中。另一方面,>>
运算符被称为流提取器。请注意,这些运算符通常对算术类型进行移位运算,但在这种情况下它们被实现为重载运算符。
在以下示例中,我们向你展示了 C++ 基于流的 I/O 类的基本用法。我们使用 cout
对象将 string
内容输出到控制台。由于 cout
对应于标准输出流,我们使用插入运算符将数据推入,它通常会打印到控制台。请注意,endl
对象被称为操纵器,它输出换行符并刷新输出缓冲区。
流操纵器有多种类型,有的像 endl
那样修改输入/输出,有的强制流对象以不同的方式解释输入/输出。后者包括数字基操作符,如:dec
、hex
和 oct
。
#include <iostream>
#include <string>
using std::cout; using std::cerr;
using std::endl; using std::string;
int main() {
string str1("what does iostream mean?");
cout << str1 << endl;
cout << str1 << " - " << str1 << endl;
return EXIT_SUCCESS;
}
输出:
what does iostream mean?
what does iostream mean? - what does iostream mean?
如前面的程序所示,流操作符和对象最强大的特性是多次顺序链接。在这种情况下,我们看到我们可以将文字值与其他变量结合起来,将它们全部推送到 cout
流。接下来,我们使用 cin
和 cerr
对象来读取用户输入并打印读取的数据。
注意需要读取的类型的对象应该提前声明为浮点数 x
。插入/提取运算符的另一个有用属性是,如果操作失败,它们将返回非零值。或者,你可以使用成员函数 fail
和 bad
来检查给定的流对象是否遇到特定错误。
#include <iostream>
#include <string>
using std::cout; using std::cerr;
using std::endl; using std::string;
using std::cin;
int main() {
float x;
cout << "enter float: ";
if (! (cin >> x)) {
cerr << "error while reading the floating point value!"
<< endl;
return EXIT_FAILURE;
}
cout << x;
return EXIT_SUCCESS;
}
输出:
error while reading the floating point value!
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn