第 8 章 IO库

第 8 章 IO库

标签: C++Primer 学习记录 IO库



8.1 IO类

  1. IO对象无拷贝或赋值,因此不能将形参或返回类型设置为流类型,进行 IO操作的函数通常以引用方式传递和返回流。又因为读写一个流会改变其状态,所以不能是 const引用!
  2. IO操作因为需要频繁地与外部设备进行数据传递,很容易出错。IO库中设置了一些函数和标志来操纵流的条件状态。
  • badbit,不可恢复的错误
  • failbit,可恢复的错误
  • 到达文件结束位置,eofbit和 failbit都会被置位。
  1. 由于设备的写操作可能很耗时,所以操作系统会将多个输出操作合为单一的系统级写操作,即缓冲机制。
  2. 导致缓冲刷新的原因有很多:
  • 程序正常结束,作为 main函数的 return操作的一部分,缓冲刷新被执行。
  • 缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区。
  • 操纵符显式刷新。
    • endl,完成换行并刷新缓冲区
    • flush,刷新缓冲区,但不输出任何额外的字符
    • ends,插入一个空字符,然后刷新缓冲区
  • 使用 unitbuf设置流的内部状态,告诉流在接下来的每次操作之后都进行一次 flush操作,而 nounitbuf则重置流,使其恢复正常的系统管理的缓冲区刷新机制。 cout << unitbuf; // 所有输出操作后都会立即刷新缓冲区 cout << nounitbuf; // 回到正常的缓冲方式
  • 关联输入和输出流。标准库中, 是将 cin关联到 cout上的,任何试图从输入流读取数据的操作都会先刷新关联的输出流。对于交互式系统,这意味着用户提示信息会在读操作之前被打印出来。

8.2 文件输入输出

  1. 在操作文件流对象之前,进行 open是否成功的检测通常是一个好习惯。 // 检测 open是否成功 if (out) { }
  2. 读入和写出的文件,默认是与 cpp/h代码文件在同一路径下的。
  3. 当一个 fstream对象离开其作用域时, close会被自动调用,与之关联的文件会自动关闭。
  4. 未指定文件模式时, ifstream默认以 in模式打开,ofstream默认以 out模式打开,fstream默认以 in和 out模式打开。
  5. 默认情况下,以 out模式打开文件,就同时也意味着 trunc模式,已有数据会被截断。如果要保存已有数据,需要在打开文件时同时指定 app模式(定位到文件末尾)。

8.1 string流

  1. 当我们的某些工作是对整行文本进行处理,而其他一些工作是处理行内的单词时,通常可以使用 istringstream。同样的,而当需要频繁地文件输出操作或在输出字符串前还要进行某些操作时,可以先将输出内容写入到一个 ostringstream中,然后一次性输出。
  2. stringstream流就是一个string流的缓冲机制,有点类似于 vector<string>,只是 stringstream流本身是一个流,支持流的输入和输出操作。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++中输出流的刷新问题和 endl和 \n的区别

    用户1653704
  • 发布利用 Qt Assistant来做帮助系统的程序遇到的问题

    用户1653704
  • Windows平台下源码分析工具

    用户1653704
  • 为什么说你的API并不安全?

    0×00 背景介绍 前段时间我向Spree Commerce公司报告了其所有API路径存在 JSONP+CSRF漏洞的问题。同样,Instagram的API存在...

    FB客服
  • HTML 基础

    HTML 基础 本章展示最常用的 HTML 标签。 标题 标题很重要 请确保标题标签只用于标题。不要仅仅是为了产生粗体或大号的文本而使用标题。 搜索引擎...

    静默虚空
  • 错误:java: Compilation failed: internal java compiler error

    在Idea中编译时出现错误:java: Compilation failed: internal java compiler error 解决办法很简单:Fil...

    似水的流年
  • 一种常见的关于率指标的错误分析思路

    今天给大家分享一种在数据分析过程中关于率指标分析可能会犯的一种错误。这个问题其实很多新人都会犯,有的老人也会犯,而且很多时候错了以后并不自知。刚好读者群有人在问...

    张俊红
  • [天池竞赛项目]·2019菜鸟全球科技挑战赛 —智能体积测量(队员招募)

    我可以负责深度学习的特征提取,模型训练与部署,也有开发手机APP和网页的一些经验。

    小宋是呢
  • MySQL流程函数

    流程函数是很常用的一类函数,用户可以使用这类函数在一个SQL语句中实现条件选择,这样做能够提高语句的效率。

    秋白
  • 即使不懂单元测试,会用这个工具也够了~

    Mockito 是一个强大的用于 Java 开发的模拟测试框架, 通过 Mockito 我们可以创建和配置 Mock 对象, 进而简化有外部依赖的类的测试.可以...

    测试小兵

扫码关注云+社区

领取腾讯云代金券