C++小细节16-简单的IO库

05/01/2020


IO拆分就是input和output,也就是输入和输出。

声明,定义,应用

//数据类型 + 变量名 = 初始化的值
std::istream& is = std::cin; 
std::ostream& os = std::cout;

std::ostream& os = std::cerr;
std::ostream& os = std::clog;

os << "Hello World!\n";
  • ostream和istream不能被拷贝,所以使用引用,所以必须绑定初始值。
  • 它们也不能被赋值

IO类

因为不是内置数据类型,那基本就是class类了。

  • iostream 针对流
  • fstream 针对文件
  • sstream 针对string

条件状态

IO操作可能发生错误,例如:

char a;
cin >> a; //如果用户给的是数字;cin的状态变成错误状态。
string s;
cin >> s; //一旦发生错误,从上一个a开始就无法进行读入。

cin.clear(); //使流回复正常

如何查询流的状态

iostate是一个类型的constexpr的值。

//流的4种状态 -- 常量值
std::cout << std::cin.badbit<<std::endl; //1
std::cout << std::cin.goodbit<<std::endl;//0
std::cout << std::cin.failbit<<std::endl;//4
std::cout << std::cin.eofbit<<std::endl;//2

//setstate();设置状态
std::cin.setstate(std::cin.badbit);
std::cin.clear(std::cin.eofbit); //clear 也可以设置状态

管理输出缓冲

cout << "Hello world";

每个输出流都管理一个缓冲区,用来保存读写数据。上面的文本串可能可能立即打印出来,但也有可能被操作系统保存在缓冲区,随后再打印。

什么是缓冲刷新

即数据真正写到输出设备或文件,原因有:

  • 程序结束,main的return语句结束
  • 缓冲区满了,需要刷新缓冲,新的内容才能写入
  • endl可以显示的刷新缓冲区
  • unitbuf设置流的内部状态
std::cout << unitbuf;//后面所有输出刷新缓冲区
std::cout << nonunitbuf;//回复正常的缓冲模式
  • 一个输出流可以关联到另一个流。一般cin和cerr关联到cout,因此当你使用cin,cout的会被刷新。
cin.tie(&cout);//cin关联到cout
ostream *old_tie = cin.tie(nullptr);//cin不再与其他流关联在一起。

文件输入输出

问题1: 文件流对象open两次文件,有什么后果?
第一次文件打开成功,建立关联,但是第二次文件流调用open失败,failbit被置位,随后使用文件流的操作都会失败。所以记得一定要关闭文件。

自动构造和析构

当一个fstream对象被销毁时,close会自动调用,比如离开作用域的局部变量。

文件模式

  • in 读文件打开
  • out 以写方式打开,会清空原有的内容,如果不想配合app使用。
  • app 每次写操作前均定位到文件末尾
  • ate 打开文件后立即定位大文件末尾
  • trunc 截断文件
  • binary 以二进制方式进行IO

string流

辅助getline或者整合string的

C++ primer 第五版 第8章

猜你喜欢

转载自blog.csdn.net/weixin_44200074/article/details/105872127
今日推荐