第 8 章 IO库

时间:2022-09-12 21:50:20

第 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流本身是一个流,支持流的输入和输出操作。