头文件分3大类:<iostream><fstream><sstream>

一、标准 IO 流(控制台,<iostream>

  1. istream:通用输入流基类
  • cinistream的对象,标准输入(键盘)>>读数据。
  1. ostream:通用输出流基类
  • coutostream对象,标准输出(屏幕)
  • cerr:标准错误输出,无缓冲,出错信息直接打印
  • clog:标准错误输出,带缓冲

继承关系(记忆方法): istreamifstream(文件读)、istringstream(内存字符串读) ostreamofstream(文件写)、ostringstream(内存字符串写) iostream:同时继承 istream+ostream,可同时读写

二、文件流(<fstream>

  1. ifstream:文件输入(读文件),继承istream
  2. ofstream:文件输出(写文件),继承ostream
  3. fstream:文件既能读又能写!继承iostream
fstream io("test.txt", ios::in | ios::out | ios::binary);

| 是按位或,用来组合多个打开标志。

ios::in模式打开文件

ios::out模式打开文件

所以表示:文件可读、可写、二进制,文件原有内容保留,不会截断清空。

fstream 读写共用同一个文件指针:写之后读,指针已经跑到后面,想要从头读,需要手动seekg移动指针。

  • ios::in | ios::out:文件存在就打开保留内容;文件不存在会打开失败,不会新建文件
  • ios::out(单独):文件不存在新建,存在就清空截断
  • 只有 fstream 需要显式写ios::in | ios::out
    • ifstream 默认自带ios::in
    • ofstream 默认自带ios::out
  • in.is_open():判断文件是否打开成功(文件不存在、权限不够会打开失败)。
  • seekg(偏移, 基准):移动读指针(g‑get)
    • in.seekg(0, in.end); 跳到文件末尾
    • in.seekg(0, in.beg); 跳回文件开头
  • tellg():返回当前读指针距离文件开头的字节数,用来获取文件大小,返回类型是streampos,尽量用要用long long接收

linux的HTTP代码应用:

(1)提取filename的内容到out

(2)求文件大小

三、字符串内存流(<sstream>,全部在内存,不操作磁盘)

  1. istringstream:只做读取,从字符串里提取数据(相当于内存版 ifstream)
  2. ostringstream:只做写入,把数据输出拼成字符串(内存版 ofstream)
  3. stringstream:可读可写,合并上面两个

应用场景:

>>自动按空白(空格、换行、tab)分割。

// istringstream 拆分
istringstream iss("10 20 hello");
int a,b; string s;
iss >> a >> b >> s;

// ostringstream 拼接
ostringstream oss;
oss << "num=" << 100;
string res = oss.str();

ss.str(""); 真正清空内部字符串 ss.clear();只清除流的错误标记,不会清空内容!一般配合str("")一起写

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐