C++ 基础与深度分析 Chapter7 深入I/O(IOstream概述、输入与输出)

IOstream概述

在这里插入图片描述
流是序列,元素是字节。字节流。输入输出就是一串字节数据。
这种输入输出的方式就是流式IO。

在这里插入图片描述
cin如果接受100,计算机会解析将100这个字符序列转化成2进制的序列表示。这就是解析操作。
如果是同一块内存的不同类型,输出出来的序列也是不同的。

int main()
{
    union{
        int x;
        float y;
    };
    x = 100;
    cout << x << endl; // 100 
    cout << y << endl; // 1.4013e-43
}

I/O Stream在输入和输出时,为了解决“表示形式的变化”和“与外部设备通信”这2个问题,需要涉及到4步操作(下面顺序为输出流的顺序):

格式化/解析、缓存、编码转换、传输

格式化,将内部表示转换成字节序列。再将格式化的结果放在一个缓存里。这里不是直接将结果输出,因为输出这个操作是非常耗费系统资源的,通常情况下,我们是输入到缓存中,当缓存填满时,再一次输出到终端、文件、内存中。编码转化要把缓存中的字符编码进行转换。比如UTF-8。将编码转换完的结果,放在缓存里。再从缓存里逐一进行读取,通过解析的方式,将缓存中的字符序列,转换成内部表示。

I/O Stream 通过模版来封装字符特性,解决第一个问题。
通过继承来封装设备特性,解决第二个问题。

输入和输出

在这里插入图片描述
非格式化I/O:不需要格式化和解析。从操作流程比较简单,提供一些类和方法。get读取一个字符,read读取多个字符,getline读取一行,gcount返回一个上一个格式化的操作读取的个数。put写一个字符,write写多个字符。
在这里插入图片描述
在这里插入图片描述
使用非格式化的输入和输出,在一定程度上可以提升程序的性能。对计算机更友好。格式化对人更友好。
格式化的输入和输出,通过移位操作符来实现。操作符的重载。

在这里插入图片描述

通过格式控制,对转换的逻辑进行修改。

位掩码类型showpos,c++基本类型是一个字节8位,通常我们就是修改1位或者几位的值。具体怎么修改呢,就是通过位掩码操作。

在这里插入图片描述
width取值相对随意,调用一次后,就会被重置掉。

在这里插入图片描述
fill字符类型。1前面9个.。
在这里插入图片描述
在这里插入图片描述

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


int main()
{
    char x = '1';
    int y = static_cast<int>(x);
    cout << std::showpos << x << '\n' << y << endl; // 1 +49
    cout << std::showpos << std::setw(10) << std::setfill('.') << x << '\n'
         << std::setw(10) << y << endl; // 1 +49
    // .........1
    // .......+49
    // 操作符主要的目的就是格式化
}

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;


int main()
{
    std::string x;
    cin >> x; // 不用担心内存越界问题,cpp内部对string进行了很好的设置
    cout << x; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值