文章目录

  • IOstream概述
  • 格式化/解析、缓存、编码转换、传输
  • 输入和输出


IOstream概述

iostream 关闭 iostream内容_开发语言


流是序列,元素是字节。字节流。输入输出就是一串字节数据。

这种输入输出的方式就是流式IO。

iostream 关闭 iostream内容_iostream 关闭_02


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 通过模版来封装字符特性,解决第一个问题。
通过继承来封装设备特性,解决第二个问题。

输入和输出

iostream 关闭 iostream内容_#include_03


非格式化I/O:不需要格式化和解析。从操作流程比较简单,提供一些类和方法。get读取一个字符,read读取多个字符,getline读取一行,gcount返回一个上一个格式化的操作读取的个数。put写一个字符,write写多个字符。

iostream 关闭 iostream内容_缓存_04


iostream 关闭 iostream内容_开发语言_05


使用非格式化的输入和输出,在一定程度上可以提升程序的性能。对计算机更友好。格式化对人更友好。

格式化的输入和输出,通过移位操作符来实现。操作符的重载。

iostream 关闭 iostream内容_c++_06

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

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

iostream 关闭 iostream内容_#include_07


width取值相对随意,调用一次后,就会被重置掉。

iostream 关闭 iostream内容_缓存_08


fill字符类型。1前面9个.。

iostream 关闭 iostream内容_iostream 关闭_09


iostream 关闭 iostream内容_缓存_10

#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
    // 操作符主要的目的就是格式化
}

iostream 关闭 iostream内容_iostream 关闭_11


iostream 关闭 iostream内容_缓存_12

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


int main()
{
    std::string x;
    cin >> x; // 不用担心内存越界问题,cpp内部对string进行了很好的设置
    cout << x; 
}