文章目录
- 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;
}