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重定向到一个文件上,
或者重定向到其他设备上(如串口)。
例如:1
2freopen("input.txt", "r", stdin); //将标准输入重定向到input.txt文件
freopen("output.txt", "w", stdout); //将标准输出重定向到output.txt文件判断输入结束
1
2
3
4
5int x;
while (cin >> x && !cin.eof()) {
//处理输入数据
}在这个例子中,我们首先使用cin读取一个整数,如果读取成功并且输入流没有结束,
就对该整数进行处理。循环会一直执行,直到输入流读取到结束符为止。
2. cout
cout是一个ostream类对象。
cout输出运算符重载了<<,可以使用它向控制台输出数据。
cout支持格式化输出,例如,可以使用setw()函数设置输出宽度,使用setprecision()函数设置浮点数的精度等 这些接口我们后面会讲到
重定向
对于重定向,我们可以使用freopen()函数将标准输出流cout重定向到一个文件上,或者重定向到其他设备上(如串口)。例如:
1
freopen("output.txt", "w", stdout); //将标准输出重定向到output.txt文件
这样,我们就可以通过在程序中使用cout输出结果,
然后将结果保存到文件中,而不是输出到控制台。
在重定向时,需要注意文件的打开模式必须是”w”,
否则会导致输出异常。另外,如果需要同时将输出流重定向到文件和控制台,
可以使用重定向符”>”将输出重定向到文件中,
同时使用tee命令将输出复制一份到控制台,例如:1
./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等)读取数据
在使用时有一些需要注意的点
- 输入验证
在使用>>运算符读取数据时,需要考虑输入数据的合法性。例如,当从输入流中读取一个整数时,可能会出现输入非数字字符的情况,这时需要处理输入错误并重新读取输入。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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()函数进行处理,该函数可以读取包含空格等特殊字符的一整行数据,并将其存储在字符串中。在使
- 默认忽略空格/制表符/换行符
4. getline函数
5.ignore函数
6.peek函数
- iostream中的peek函数可以用于查看输入流中下一个字符,而不会将其从流中删除。其函数原型如下:
1 | int peek(); |
peek()函数返回输入流中的下一个字符,但并不将其从流中删除。当输入流为空时,peek()函数会返回EOF(End of File)。
我们可以使用peek()函数来实现一些特殊的输入操作,例如判断输入流中下一个字符是否为指定字符等。
下面是一个示例代码,演示了peek()函数的使用方法:
1 |
|
- 在上述示例代码中,我们使用了peek()函数来查看输入流中下一个字符,以判断用户是否输入了第二个字符。
- 如果输入流中下一个字符是回车符,则说明用户只输入了一个字符;
- 否则,继续使用cin读取输入流中的第二个字符,并输出两个字符。
- 这样,我们就可以根据下一个字符的特点来决定如何处理输入了。
7.输出格式指定函数
8.eof/fail/bad/good/clear/setstate/rdstate函数
- 这些函数在【C++】C++中的IO类总结——上篇讲过
主要用来进行输入输出流的状态检测和错误处理
这里不赘述ifstream/ofstream/fstream类
待补充
istringstream/ostringstream/stringstream类
待补充