C++ 学习笔记(8)IO库

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l773575310/article/details/79162573

C++ 学习笔记(8)IO库

参考书籍:《C++ Primer 5th》
API:std::iostream


8.1 IO类

8.1.1 IO对象无拷贝或赋值

  • 不能拷贝或对IO对象赋值,通常用引用来操作。
  • 读写IO对象会改变其状态,所以传递或返回的引用不是const的。
ofstream out1, out2;
out1 = out2;                // 错误。不能对流对象赋值
ofstream print(ofstream);   // 错误。不能初始化ofstream参数
out2 = printf(out2);        // 错误。不能拷贝流对象

8.1.2 条件状态


  • badbit:系统级错误,如不可恢复的读写错误。置位后,流就无法使用。
  • failbit:可恢复错误,如读取数值时读出错误字符。
  • 达到文件结束位置时,eofbit 和 failbit 都会被置位。

8.1.3 管理输出缓冲

  • 每个输出流都管理一个缓冲区,用来保存程序的读写数据。
  • 导致缓冲刷新(数据真正写到输出设备或文件)原因:
    • 程序正常结束,作为main函数return操作的一部分,刷新缓冲。
    • 使用endl、flush、ends显式刷新。
    • 使用操纵符unitbuf设置流状态(每次输出操作后都刷新),默认情况下cerr是unitbuf的。
    • 一个流被关联到另一个流。读写流会让被关联的流缓冲区刷新。默认cin和cerr都关联cout,即读cin或写cerr都会导致cout缓冲区刷新。
cout << "a" << endl;        // 输出a和换行,然后刷新缓冲区
cout << "a" << flush;   // 输出a,刷新缓冲区
cout << "a" << ends;    // 输出a和空格,属性缓冲区

cout << unitbuf;            // 开启每次输出后就flush
// 所有输出操作后都会立即更新
cout << nounitbuf;      // 关闭
  • 关联流使用 tie 函数。
  • 每个流同时最多关联到一个流,但多个流可以同时关联到同一个ostream。

8.2 文件输入输出

8.2.1 使用文件流对象(ifstream、ofstream、iofstream)

  • 使用open打开指定文件后,文件流和文件就保持关联。要关联另一个文件时,要先close关闭已经关联的文件。
  • 当fstream对象被销毁时,close会自动调用。

8.2.2 文件模式

  • app:append,默认以写的方式打开。ate:at end,默认以读的方式打开。如果打开文件不存在,app会生成这个文件,ate会打开失败。
  • trunc:truncated,舍弃流的内容。
  • ofstream 对象只能设定 out 模式。
  • ifstream 对象只能设定 in 模式。
  • 只有 out 被设定时才能用 tructc 模式。
  • 默认 out 模式打开文件也会被截断,要保留文件内容应该同时用app,或者用in。
  • ate 和 binary 模式可以用于任何类型的文件流对象。

8.3 string流


小结

  • iostream 处理控制台IO
  • fstream 处理命名文件IO
  • stringstream 完成内存string 的IO
  • fstream 和 stringstream都继承至iostream。同理istream、ostream也是其基类。

猜你喜欢

转载自blog.csdn.net/l773575310/article/details/79162573