C++ 基本输入/输出
C++ 标准库提供了一套丰富的输入/输出功能,我们将在后续章节中详细介绍。本章将讨论 C++ 编程中最基本和最常见的 I/O 操作。
C++ 的 I/O 操作发生在流(streams)中,流是字节序列。如果字节从键盘、磁盘驱动器或网络连接等设备流向主内存,这称为输入操作;如果字节从主内存流向显示屏、打印机、磁盘驱动器或网络连接等设备,这称为输出操作。
I/O 库头文件
以下头文件对 C++ 程序非常重要 −
| Sr.No | Header File & Function and Description |
|---|---|
| 1 | <iostream> 该文件定义了 cin, cout, cerr 和 clog 对象,分别对应标准输入流、标准输出流、无缓冲标准错误流和缓冲标准错误流。 |
| 2 | <iomanip> 该文件声明了用于执行格式化 I/O 的服务,通过所谓的参数化流操作符(如 setw 和 setprecision)实现。 |
| 3 | <fstream> 该文件声明了用户控制的文件处理服务。我们将在文件和流相关章节中详细讨论。 |
| 4 |
<bits/stdc++.h> 该头文件包含了大部分标准 C++ 库的功能,无需逐个指定每个库即可添加广泛的功能。这在编码竞赛中特别有用。 |
标准输出流 (cout)
预定义对象 cout 是 ostream class 的实例。cout 对象被认为“连接到”标准输出设备,通常是显示屏。cout 与流插入操作符(<<,即两个小于号)结合使用,如以下示例所示。
Example
#include <iostream>
using namespace std;
int main() {
char str[] = "Hello C++";
cout << "Value of str is : " << str << endl;
}
上述代码编译并执行后,将产生以下结果 −
Value of str is : Hello C++
C++ 编译器还会确定要输出的变量的数据类型,并选择合适的流插入操作符来显示值。<< 操作符被重载,用于输出内置类型(如 integer、float、double、strings 和 pointer values)的数据项。
如上所示,在单个语句中可以多次使用插入操作符 <<,而 endl 用于在行尾添加新行。
标准输入流 (cin)
预定义对象 cin 是 istream class 的一个实例。cin 对象被认为附加到标准输入设备,通常是键盘。cin 与流提取运算符一起使用,该运算符写作 >>,即两个大于号,如以下示例所示。
示例
#include <iostream>
using namespace std;
int main() {
char name[50];
cout << "Please enter your name: ";
cin >> name;
cout << "Your name is: " << name << endl;
}
当上述代码编译并执行时,它会提示您输入姓名。您输入一个值然后按回车,将看到以下结果 −
Please enter your name: cplusplus Your name is: cplusplus
C++ 编译器还会确定输入值的 data type,并选择合适的流提取运算符来提取该值并将其存储到指定的 variables 中。
流提取运算符 >> 可以在单个语句中使用多次。要请求多个 datum,可以使用以下方式 −
cin >> name >> age;
这等价于以下两个语句 −
cin >> name; cin >> age;
标准错误流 (cerr)
预定义对象 cerr 是 ostream class 的一个实例。cerr 对象被认为附加到标准错误设备,这也是显示屏,但 cerr 对象是无缓冲的,每次向 cerr 的流插入都会导致其输出立即出现。
cerr 也与流插入运算符一起使用,如以下示例所示。
示例
#include <iostream>
using namespace std;
int main() {
char str[] = "Unable to read....";
cerr << "Error message : " << str << endl;
}
当上述代码编译并执行时,它会产生以下结果 −
Error message : Unable to read....
标准日志流 (clog)
预定义对象 clog 是 ostream class 的一个实例。clog 对象被认为附加到标准错误设备,这也是显示屏,但 clog 对象是有缓冲的。这意味着每次向 clog 插入都可能导致其输出被保存在 buffer 中,直到 buffer 填满或 buffer 被刷新。
clog 也与流插入运算符一起使用,如以下示例所示。
示例
#include <iostream>
using namespace std;
int main() {
char str[] = "Unable to read....";
clog << "Error message : " << str << endl;
}
当上述代码编译并执行时,它会产生以下结果 −
Error message : Unable to read....
在这些小示例中,您无法看出 cout、cerr 和 clog 之间的区别,但在编写和执行大型程序时,这种区别会变得明显。因此,使用 cerr stream 显示错误消息是一种好习惯,而显示其他日志消息时则应使用 clog。
使用 bits/stdc++ 进行输入/输出
bits/stdc++.h 是 C++ 中的一个非标准头文件,因为它不属于官方 C++ 标准库。相反,它是 GCC 特有的头文件,包含了 C++ 中大多数标准库。您也可以使用 bits/stdc++.h 进行输入和输出,而无需使用其他库。
示例
#include <bits/stdc++.h>
using namespace std;
int main() {
int number;
string name;
// #include <iostream>
// #include <string>
cout << "Welcome to !" << endl;
// 输入用户的姓名和数字
cout << "Please enter your name: ";
cin >> name;
cout << "Please enter a number: ";
cin >> number;
cout << "Hello," << name << " You entered " << number << endl;
// 演示一些 STL 特性
// #include <vector>
vector<int> numbers;
cout << "Enter 4 numbers: ";
for (int i = 0; i < 4; ++i) {
int temp;
cin >> temp;
numbers.push_back(temp);
}
cout << "You entered the following numbers: ";
for (int num : numbers) {
cout << num << " ";
}
cout << endl;
// 对数字进行排序并显示
// #include <algorithm>
sort(numbers.begin(), numbers.end());
cout << "Sorted numbers: ";
for (int num : numbers) {
cout << num << " ";
}
cout << endl;
return 0;
}
当上述代码编译并执行时,会产生以下结果 −
Welcome to ! Please enter your name: Aman Please enter a number: 2006 Hello, Aman You 2006 Enter 4 numbers: 2 0 0 6 You entered the following numbers: 2 0 0 6 Sorted numbers: 0 0 2 6
因此,在这里,我们没有使用诸如以下的多个头文件,
- #include <iostream>
- #include <string>
- #include <vector>
- #include <algorithm>
我们只需使用 <bits/stdc++.h>,因为它包含了输入/输出操作、字符串处理、动态数组和算法所需的所有必要标准库,这简化了您的代码,使其更简洁和便捷。它尤其适用于竞赛编程。