【C++】C++中的I/O类总结——下篇


title: 【C++】C++中的IO类总结——下篇
tags: C++
description: ’ ’
categories:

  • C++
    date: 2023-06-05 00:36:59

【C++】C++中的IO类总结——上篇

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等)读取数据
  • 在使用时有一些需要注意的点
    1. 输入验证
      在使用>>运算符读取数据时,需要考虑输入数据的合法性。例如,当从输入流中读取一个整数时,可能会出现输入非数字字符的情况,这时需要处理输入错误并重新读取输入。
#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;
}
    1. 默认忽略空格/制表符/换行符
      比如当我们使用cin >> num1 >> num2; 语句从输入流中读取两个整数时,如果用户输入的是"10 20"(输入数字之间包含空格),则程序会将这两个数字分别读取到num1和num2变量中,而不会将空格字符读取到变量中。如果我们需要从输入流中读取带有空格等特殊字符的数据,可以使用getline()函数进行处理,该函数可以读取包含空格等特殊字符的一整行数据,并将其存储在字符串中。在使
    1. 忽略字符:有时需要跳过输入流中的某些字符,可以使用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函数

ifstream/ofstream/fstream类

istringstream/ostringstream/stringstream类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值