当前位置:首页 > 技术 > 正文内容

C++ Primer 第八章:IO 库核心要点解析

访客 技术 2026年7月27日 1

8.1 IO 类体系

标准库提供三组主要的 IO 类型:

  • iostream:包含 istream(输入流)、ostream(输出流)和 iostream(双向流)
  • fstream:包含 ifstream(文件输入流)、ofstream(文件输出流)和 fstream(文件双向流),继承自 iostream 体系
  • sstream:包含 istringstream(字符串输入流)、ostringstream(字符串输出流)和 stringstream(字符串双向流),同样继承自 iostream 体系

宽字符版本使用 wcin、wcout、wcerr 替代 cin、cout、cerr 来处理 wchar_t 类型。

IO 对象的限制

IO 对象无法进行拷贝或赋值操作,但可以通过引用方式作为函数参数或返回值传递,从而实现输入输出功能。

流状态管理

每个流对象维护一个 iostate 类型的状态值,包含以下位标记:

  • badbit:流发生不可恢复错误
  • failbit:操作失败(如类型不匹配)
  • eofbit:到达文件结束位置
  • goodbit:流状态正常(值为 0)

常用状态查询函数:

stream.eof()   // 检查 eofbit
stream.fail()  // 检查 failbit  
stream.bad()   // 检查 badbit
stream.good()  // 检查 goodbit

状态控制方法:

stream.clear()       // 重置所有状态位
stream.clear(flags)  // 设置为指定状态
stream.setstate(flags)  // 添加指定状态位
auto st = stream.rdstate()  // 返回当前 iostate 值

输出缓冲机制

系统为提升性能,会将多次输出暂存到缓冲区,待缓冲区满或特定时机统一输出。

触发缓冲区刷新的条件:

  • 程序正常终止
  • 缓冲区容量达到上限
  • 主动使用 endl 操纵符
  • 设置 cout << unitbuf(cerr 默认已启用)
  • cin 或 cerr 操作时会自动刷新 cout(因为与 cout 绑定)

注意:程序异常崩溃时缓冲区内容不会被刷新,可能导致部分输出丢失。

8.2 文件输入输出

由于 ifstream、ofstream、fstream 分别继承自 istream、ostream、iostream,所有流操作符(如 >>、<<、getline)均可直接使用。

文件打开方式

ifstream input(fileName);          // 以读模式打开
ofstream output;                    
output.open(fileName + ".bak");    // 以写模式打开  

output.close();  // 关闭后再打开其他文件

在函数内定义的流对象,当函数结束时会自动关闭关联文件。

文件打开模式

in只读模式
out写入模式(默认会清空文件)
app追加写入
ate打开后定位到文件尾
trunc截断文件(out 模式下默认启用)
binary二进制模式
ofstream out1("data.txt");                  // out + trunc
ofstream out2("log.txt", ofstream::app);    // 追加模式

8.3 字符串流

头文件 sstream 提供的内存 IO 功能,基于 string 进行读写而非文件。

关键操作:

sstream strm;               // 创建空流
sstream strm(s);            // 拷贝字符串 s 到流中  
strm.str();                 // 返回流中存储的字符串
strm.str(s);                // 将 s 内容复制到流中
strm.clear();               // 清空内容(重复使用前必须调用)

示例代码:

string records("alice 1988 2034");
string name, token;
vector<string> items;

istringstream input(records);
input >> name;
while (input >> token) {
    items.push_back(token);
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。