C/C++中I/O进阶详解及其作用介绍

 更新时间:2021年09月02日 16:49:15   作者:我是小白呀  
这篇文章主要介绍了C/C++中I/O进阶详解及其作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

概述

C++ 的输入 (input stream) 和输出 (output stream)是由若干字节组成的字节序列, 使得数据按顺序从一个对象传送到另一对象. 流 (stream) 表示量信息从源到目的端的流动.

在这里插入图片描述

C++ 的输入输出包括:

标准 I/O: 对系统指定的标准设备的输入

文件 I/O: 对磁盘文件的输入和输出

串 I/O: 对内存中指定的空间进行的输入和输出

I/O 类库

I/O stream 类库:

在这里插入图片描述

头文件是程序与类库的接口, iostream 类库的接口分别由不同的文件来实现.

常用的头文件:

iostream: 包含对 I/O 进行操作的基本信息

fstream: 用于用户管理的文件的 I/O 操作

strstream: 用于字符串流的 I/O 操作

stdiostream: 用于混合使用 C 和 C++ 的 I/O 机制

iomanip: 使用格式化 I/O 时的操作

I/O 中的重载

在之前的文章中我们使用<<>>来实现控制台的输出和输入.

在这里插入图片描述

<<>>被重载来用于标准类型数据的输出和输入:

  • <<>>本来是 C++ 中的左位移运算符和右位移运算符
  • 在 iostream 头文件中<<>>被重载了
  • 在使用<<>>的时候, 我们必须#include <iostream>

在 input stream 和 output stream 类中对位移运算符<<>>进行重载的成员函数, 包括:

  • ostream operator << (int );
  • ostream operator << (float );
  • ostream operator << (char );
  • ostream operator << (char *);

注: 想将<<>>用于自己声明的类型数据必须对<<>>进行重载.

流对象

I/O stream 头文件还定义了 4 种流对象:

  • cin: 从标准输入设备输入到内存的数据流对象, 称- 为 cin 流或标准输入流
  • cout: 从内存输出到控制台的数据流对象, 称为 cout 流或标准输出流
  • cerr 和 clog: 向控制台输出错误信息

例如:

在这里插入图片描述

当我们从键盘输入 “World”, cin 会把字符串存入内存, 当我们调用 cout, 内存中的 “World” 就被输出到控制台上.

标准输入流

标准输出流, 是流向标准输出设备的数据. ostream 类定义了 3 个输出流对象: cout, cerr, clog.

cin 流对象

cin 是 istream 类的对象, 从标准输入设备获取数据. 程序中的变量通过流提取符>>从 cin 流中提取数据:

流提取符>>从流中提取数据时, 通常跳过流中的空格, tab 键, 换行符等空白字符

只有在输入完数据再按回车键后, 该行数据才被送入键盘缓冲区, 形成输入流. 提取运算符>>才能从中提取数据

程序将从键盘缓冲区中连续的获得数据

当遇到无效字符或文件结束符^Z时, cin 无法正常提取数据, 处于出错状态, 返回 0 值 (false)

在这里插入图片描述

案例

输入个数不确定的成绩:

#include <iostream>
#include <valarray>
using namespace std;

int main() {
    // 定义变量
    double grade;
    cout << "enter your grade:\n";
    while (cin >> grade){
        if(grade >= 85){
            cout << grade << " Good!" << endl;
        }
        if(grade < 60){
            cout << grade << " fail" << endl;
        }
        cout << "enter your grade:\n";
    }
    cout << "The end." << endl;

    return 0;
}

输出结果:

enter your grade:
90
90 Good!
enter your grade:
12
12 fail
enter your grade:
^Z
The end.

get 函数

不带参数的 get 函数:

cin.get()
  • 从输入流中提取一个字符, 返回读入的字符
  • 遇到输入流中的文件结束符, 则返回 EOF (End Of File)

有一个参数的 get 函数:

cin.get(c)
  • 从输入流中读取一个字符, 赋值给字符变量 c
  • 读取成功返回真, 失败或遇到文件结束符返回 0 (false)

有 3 个参数的 get 函数:

cin.get(字符数组或指针, n, 终止字符)
  • 从输入流中读取 n-1 个字符, 赋值给指定的字符数组
  • 若在读取 n-1 个字符之前遇到指定的终止字符, 则提前结束读取
  • 读取成功函数返回真, 失败返回 0 (false)

getline 函数

getline 函数的作用是从输入流中读取一行字符. 例如:

istream &getline(char *buffer, streamsize num );
istream &getline(char *buffer, streamsize num, char delim );

getline 函数用于输入流, 读取字符到 buffer 中, 直到:

  • num-1 个字符已经读入
  • 碰到一个换行标志
  • 碰到一个 EOF
  • 读到字符 delim

注: getline 函数遇到空白字符不结束.

eof 函数

eof (End Of File) 表示文件结束. 从输入流读取数据如果达到文件末尾或遇到文件结束符时, eof 函数的值为非零值 (true), 否则为 0 (false)

cout 流对象

cout 是 console input 的缩写, 意为在控制台的输出:

  • cout 不是 C++ 预定义的关键字, 它是 ostream 流类的对象, 在 iostream 中定义
  • “cout <<” 输出基本类型的数据时, 可以不必考虑数据是什么类型,系统会判断数据的类型, 并根据其类型选择调用与之匹配的运算符重载函数
  • cout 流在内存中对应开辟了一个缓冲区, 用来存放流中的数据, 当向 cout 流插入一个 endl 时, 立即输出流中所有数据, 然后插入一个换行符, 并刷新流 (清空缓冲区)
  • cout.flush(); 输出流中所有数据, 刷新缓冲区

在这里插入图片描述

cerr 流对象

cerr 流对象是标准错误流, 被指定为与显示器关联. cerr 的作用是想标准组错误设备 (standard error device) 输出有关出错信息.

cerr 和 cout 的区别:

  • cout 流通常是传送到显示器输出, 但也可以被重新定向输出到磁盘文件
  • cerr 流中的信息只能在显示器输出

cerr 的用途:

  • 当调试程序时, 往往不希望程序运行时的出错信息被送到其他文件, 而要求在显示器上及时输出, 这是应该用 cerr
  • cerr 流中的信息是用户根据需要指定的

在这里插入图片描述

案例 (解一元二次方程):

#include <iostream>
#include <valarray>
using namespace std;

int main() {
    double a, b, c, delta;
    cout << "please input a, b, c:\n";
    cin >> a >> b >> c;

    if (a==0){
        cerr << "a is equal to zero, error!" << endl;
    }else if((delta = b*b - 4*a*c) < 0){
        cerr << "delta < 0, error" << endl;
    }else{
        cout << "x1=" << (-b + sqrt(delta)) / (2*a) << endl;
        cout << "x1=" << (-b - sqrt(delta)) / (2*a) << endl;
    }
    
    return 0;
}

输出结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

clog 流对象

colg 流对象也是标准错误流, 它是 console log 的缩写. clog 的作用和 cerr 相同, 都是在终端显示器上显示出错误信息.

clog 和 cerr 的区别:

  • cerr 是不经过缓冲区, 直接向显示器上输出有关信息
  • clog 中的信息存放在缓冲区, 缓冲区满后或遇到 endl 时向显示器输出

到此这篇关于C/C++中I/O进阶详解及其作用介绍的文章就介绍到这了,更多相关C++ I/O进阶内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux C/C++实现DNS客户端请求域名IP的示例代码

    Linux C/C++实现DNS客户端请求域名IP的示例代码

    DNS全称:Domain Name System,域名解析系统,是互联网的一项服务,本文主要介绍了C/C++如何实现DNS客户端请求域名IP,感兴趣的可以了解下
    2024-03-03
  • C++实现并行计算的两种方式

    C++实现并行计算的两种方式

    本文介绍了使用C++实现并行计算的两种方式,包括OpenMP和MPI,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • 详解C++引用变量时那些你不知道的东西

    详解C++引用变量时那些你不知道的东西

    这篇文章主要为大家详细介绍了C++引用变量时那些你不知道的东西——引用变量延迟绑定,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-11-11
  • C语言中关于scanf函数的一些问题详解

    C语言中关于scanf函数的一些问题详解

    这篇文章主要为大家介绍了C语言中关于scanf函数的一些问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • Matlab实现别踩白块小游戏的示例代码

    Matlab实现别踩白块小游戏的示例代码

    别踩白块是一款音乐类休闲游戏,游戏的玩法不难,只需跟着音乐的节奏点中对的方块即可。本文将用Matlab实现这一经典游戏,感兴趣的可以了解一下
    2022-03-03
  • C++中关于constexpr函数使用及说明

    C++中关于constexpr函数使用及说明

    这篇文章主要介绍了C++中关于constexpr函数使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言实现遍历文件夹中的文件

    C语言实现遍历文件夹中的文件

    这篇文章主要为大家详细介绍了如何使用C语言实现遍历文件夹中的文件,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-02-02
  • 如何判断一个数是否为2的幂次方?若是,并判断出来是多少次方?

    如何判断一个数是否为2的幂次方?若是,并判断出来是多少次方?

    本篇文章是对如何判断一个数是否为2的幂次方?若是,并判断出来是多少次方的实现方法,进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • c++中stack、queue和vector的基本操作示例

    c++中stack、queue和vector的基本操作示例

    这篇文章主要给大家介绍了关于c++中stack、queue和vector基本操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • QT中QChart绘制折线图

    QT中QChart绘制折线图

    本文主要介绍了QChart绘制折线图,Qt Charts基于Qt的Graphics View架构,其核心组件是QChartView 和 QChart,感兴趣的可以了解一下
    2022-04-04

最新评论