title: 【C++】C++中的IO类总结——下篇
tags: C++
description: ’ ’
categories:
- C++
date: 2023-06-05 00:36:59
istream/ostream/iostream类
对象
0. 介绍
- cin/cout/cerr/clog是 istream/ostream/iostream类实例化出来的对象
- (1)cin对应于标准输人流,用于从键盘读取数据,也可以被重定向为从文件中读取数据。
- (2)cout对应于标准输出流,用于向屏幕输出数据,也可以被重定向为向文件写入数据。
- (3)cerr对应于标准错误输出流,用于向屏幕输出出错信息,不能被重定向。
- (4)clog对应于标准错误输出流,用于向屏幕输出出错信息,不能被重定向。
- cerr和clog的区别在于cerr不使用缓冲区,直接向显示器输出信息;而输出到clog中的信息先会
被存放在缓冲区,缓冲区满或者刷新时才输出到屏幕。
1.cin
-
cin是一个istream类对象,可以读取各种基本数据类型,如int、float、double、char、bool等。
-
cin输入运算符重载了>>,可以使用它从控制台读取数据,并将数据存储到指定变量中。
-
重定向
对于重定向,可以使用freopen()函数将标准输入流cin和标准输出流cout重定向到一个文件上,
或者重定向到其他设备上(如串口)。
例如:freopen("input.txt", "r", stdin); //将标准输入重定向到input.txt文件 freopen("output.txt", "w", stdout); //将标准输出重定向到output.txt文件
-
判断输入结束
int x; while (cin >> x && !cin.eof()) { //处理输入数据 }
在这个例子中,我们首先使用cin读取一个整数,如果读取成功并且输入流没有结束,
就对该整数进行处理。循环会一直执行,直到输入流读取到结束符为止。
2. cout
-
cout是一个ostream类对象。
-
cout输出运算符重载了<<,可以使用它向控制台输出数据。
-
cout支持格式化输出,例如,可以使用setw()函数设置输出宽度,使用setprecision()函数设置浮点数的精度等 这些接口我们后面会讲到
-
重定向
对于重定向,我们可以使用freopen()函数将标准输出流cout重定向到一个文件上,或者重定向到其他设备上(如串口)。例如:
freopen("output.txt", "w", stdout); //将标准输出重定向到output.txt文件
这样,我们就可以通过在程序中使用cout输出结果,
然后将结果保存到文件中,而不是输出到控制台。
在重定向时,需要注意文件的打开模式必须是"w",
否则会导致输出异常。另外,如果需要同时将输出流重定向到文件和控制台,
可以使用重定向符">"将输出重定向到文件中,
同时使用tee命令将输出复制一份到控制台,例如:./a.out > output.txt | tee /dev/tty
在这个例子中,"./a.out"是需要运行的程序,
“> output.txt"将程序的输出重定向到output.txt文件,
而”| tee /dev/tty"则将同样的输出内容复制一份输出到控制台。
3. cerr
-
cerr是一个ostream类对象。
-
和cout类似,cerr输出运算符重载了<<,可以使用它向控制台输出错误信息。cerr支持格式化输出,例如,可以使用setw()函数设置输出宽度,使用setprecision()函数设置浮点数的精度等。
-
与cout不同的是,cerr的输出不能被重定向到文件或其他设备上,始终输出到控制台。
接口
1.<<运算符
- <<运算符是iostream库中的输出运算符,
- 用于向输出流对象(如cout、cerr等)输出数据。
- 相比于printf等函数形式的输出方式,<<运算符使用起来更加直观、简便,也更加符合面向对象的思想。
- 使用时有一些需要注意的点
-
1.转义字符:如果需要在输出结果中包含转义字符,可以使用转义符号\进行转义。例如,要在输出结果中包含引号或反斜杠符号,需要将其用\进行转义。
-
2.格式化输出:<<运算符支持格式化输出,可使用一些控制符和函数来控制输出格式。例如,在输出浮点数时,可以使用setprecision()函数设置小数点后的精度,使用fixed和scientific来指定输出的格式等。
-
3.运算符优先级:<<运算符的优先级相对较低,因此需要注意运算顺序。例如,如果要向输出流对象输出一个表达式的值,需要将该表达式使用括号括起来,以确保正确的运算顺序
-
2. >>运算符
- >>运算符是iostream库中的输入运算符,
- 用于从输入流对象(如cin等)读取数据
- 在使用时有一些需要注意的点
-
- 输入验证
在使用>>运算符读取数据时,需要考虑输入数据的合法性。例如,当从输入流中读取一个整数时,可能会出现输入非数字字符的情况,这时需要处理输入错误并重新读取输入。
- 输入验证
#include <iostream>
using namespace std;
int main() {
int num1, num2;
cout << "请输入两个整数:";
cin >> num1 >> num2;
// 输入验证,如果输入不合法,则重新读取输入
while (cin.fail()) {
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 跳过当前行剩余字符
cout << "输入不合法,请重新输入:" << endl;
cin >> num1 >> num2;
}
cout << "两个整数之和为:" << num1 + num2 << endl;
return 0;
}
-
- 默认忽略空格/制表符/换行符
比如当我们使用cin >> num1 >> num2; 语句从输入流中读取两个整数时,如果用户输入的是"10 20"(输入数字之间包含空格),则程序会将这两个数字分别读取到num1和num2变量中,而不会将空格字符读取到变量中。如果我们需要从输入流中读取带有空格等特殊字符的数据,可以使用getline()函数进行处理,该函数可以读取包含空格等特殊字符的一整行数据,并将其存储在字符串中。在使
- 默认忽略空格/制表符/换行符
-
- 忽略字符:有时需要跳过输入流中的某些字符,可以使用ignore()函数实现。
3. get函数
4. getline函数
5.ignore函数
6.peek函数
- iostream中的peek函数可以用于查看输入流中下一个字符,而不会将其从流中删除。其函数原型如下:
int peek();
-
peek()函数返回输入流中的下一个字符,但并不将其从流中删除。当输入流为空时,peek()函数会返回EOF(End of File)。
-
我们可以使用peek()函数来实现一些特殊的输入操作,例如判断输入流中下一个字符是否为指定字符等。
-
下面是一个示例代码,演示了peek()函数的使用方法:
#include <iostream>
using namespace std;
int main() {
char c;
cout << "请输入一个字符: ";
cin >> c;
if (cin.peek() == '\n') { // 如果输入流中下一个字符是回车符,则说明用户未输入第二个字符
cout << "输入了一个字符:" << c << endl;
}
else { // 否则继续读取输入流中的第二个字符
char d;
cin >> d;
cout << "输入了两个字符:" << c << " 和 " << d << endl;
}
return 0;
}
- 在上述示例代码中,我们使用了peek()函数来查看输入流中下一个字符,以判断用户是否输入了第二个字符。
- 如果输入流中下一个字符是回车符,则说明用户只输入了一个字符;
- 否则,继续使用cin读取输入流中的第二个字符,并输出两个字符。
- 这样,我们就可以根据下一个字符的特点来决定如何处理输入了。
7.输出格式指定函数
8.eof/fail/bad/good/clear/setstate/rdstate函数
- 这些函数在【C++】C++中的IO类总结——上篇讲过
主要用来进行输入输出流的状态检测和错误处理
这里不赘述