C++ stream

 

定义

C++中把数据之间传输操作称为流

  • 输出流

流数据从内存传送到某个载体或设备中

  • 输入流

数据从某个载体或设备传送到内存缓冲区变量中

种类

标准I/O流

内存与标准输入输出设备之间信息传递

  • istream 从流读取数据

  • ostream 向流写入数据

  • iostream 读写流

cin

输入流

std::cin
  • 回车结束输入
std::vector<T> v;

T value;

while (std::cin >> value) {
    v.push_back(value);
    if (std::cin.get() == '\n') {
        break;
    }
}

cout

输出流

std::cout

cerr

错误输出

cerr不经过缓冲而直接输出,一般用于迅速输出出错信息,是标准错误

clog

日志输出

文件I/O流

内存与外部文件之间信息传递

  • ifstream 从文件读取数据

  • ofstream 向文件写入数据

  • fstream 读写文件

ifstream

输入文件流

ofstream

输出文件流, 用于创建文件并向文件写入信息

fstream

graph LR;
    x(打开方式)
    x --> a(ios::in) --> a1(为输入打开文件)
    x --> b(ios::out) --> b1(为输出打开文件)
    x --> c(ios::ate) --> c1(初始位置文件尾)
    x --> d(ios::app) --> d1(所有输出附加在文件末尾)
    x --> e(ios::trunc) --> e1(若文件已存在则先删除)
    x --> f(ios::binary) --> f1(以二进制方式操作)
const std::string path = "main.txt";

// 显式调用
ofstream out;

// 以追加方式为输出打开
out.open(path,  ios::out|ios::app);

// 隐式调用
ofstream out(path, ios::out|ios::app);
  • 写入

普通文件

<<
const std::string path = "main.txt";

ofstream out(path, ios::out|ios::app);

out << "Hello ";

out << "World\n";

二进制文件

write()
uint32_t value = 0xFF00FF00;

const std::string path = "image.rgb";

ofstream out(path, ios::out|ios::app);

// 将value的值写入4byte二进制文件中
out.write((char *)&value, 4);
  • 关闭
close()

字符串I/O流

内存变量与表示字符串流的字符数组之间信息传递

graph LR;
    x(类别)
    x --> a(istringstream) --> a1(从string读取数据)
    x --> b(ostringstream) --> b1(向string写入数据)
    x --> c(stringstream) --> c1(读写string, 可用于数据类型转换)
  • string 转 int32_t
#include <iostream>
#include <sstream>

template <class SourceType, class TargetType>
void ChangeType(SourceType &source, TargetType &target){
    std::stringstream ss;
    ss << source;
    ss >> target;
    ss.str("");
    ss.clear();
}

int main() {
    std::string source = "123456";
    int32_t target = 0;

    ChangeType(source, target);
    // 123456
    std::cout << target << std::endl;
    return 0;
}