C++ primer(第八章)学习笔记

第七章 C++标准库
1.C++语言不直接处理输入和输出,而是通过一族定义在标准库的类型来处理IO这些类型从支持从设备读取数据、向设备写入数据的IO操作,设备可以是文件、控制台窗口等、还有一些类型允许内存IO,即,从string读取数据,向string写入数据。
2.IO库

  • istream(输入流)类型,提供输入操作
  • ostream(输出流)类型,提供输出操作
  • cin,一个istream对象,从标准输入读取数据
  • cout,一个ostream对象,向标准输出写入数据
  • cerr,一个ostream对象,通常用于输出程序的错误消息,写入到标准错误
  • 运算符,用来从一个istream对象读取输入数据

  • <<运算符,用来向一个ostream对象写入输出数据
  • getline函数,从一个给定的istream读取一行数据,存入一个给定的string对象中
    3.三种独立的头文件:iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型。
    4.IO类型间的关系。标准库使我们能忽略不同类型的流之间的差异,这是通过继承机制(inheritance)实现的。利用模板,我们可以使用具有继承关系的类,而不必了解继承机制如何工作的细节。
    继承机制使我们可以声明一个特定的类继承自另一个类。我们通常可以将一个派生类(继承类)对象当做其基类对象来使用。
    5.IO对象无拷贝或赋值
ofstream out1,out2;
out1 = out2;    //错误:不能对流对象赋值
ofstream print(ofstream);    //错误:不能初始化ofstream
out2 = print(out2);       //错误:不能拷贝流对象

不能拷贝IO对象,因此我们也不能将形参或返回类型设置为流类型。进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的。

strm::iostate    //strm是一种IO类型,iostate是一种机器相关的类型,提供了表达条件状态的完整功能。
strm::badbit     //指出流已崩溃
strm::failbit    //指出IO操作失败了
strm::eofbit     //eofbit用来指出流到达了文件结束
strm::goodbit    //goodbit用来指出流未处于错误状态
s.eof()
s.fail()
s.bad()
s.good()
s.clear()
s.clear()
s.setstate(flags)
s.rdstate()
auto old_state = cin.rdstate();  //记住cin的当前状态
cin.clear();                     //使cin有效
process_input(cin);              //使用cin
cin.setstate(old_state);         //将cin置为原有状态

6.管理输出缓冲。
每个输出流都管理一个缓冲区,用来保存程序读写的数据。有了缓冲机制,操作系统就可以将程序的多个输出操作组合成的单一的系统级写操作。由于设备的写操作可能很耗时,允许操作系统将多个输出操作组合为单一的设备写操作可以带来很大的性能提升。导致缓冲刷新的原因有很多:

  • 程序正常结束
  • 缓冲区满,需要刷新缓冲
  • 我们可以使用操纵符如endl来显式刷新缓冲区
  • 在每个输出操作之后,我们可以用来操纵符unitbuf设置流的内部状态,来清空缓冲区。
  • 一个输出流可能被关联到另一个流。
cout << "hi!" << endl;           //输出hi和一个换行,然后刷新缓冲区
cout << "hi!" << endl;           //输出hi,然后刷新缓冲区
cout << "hi!" << endl;           //输出hi和一个空字符,然后刷新缓冲区

7.关联输入和输出流
当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流。

cin.tie(&cout);     //仅仅是用来表示:标准库将cin和cout关联在一起
ostream *old_tie = cin.tie(nullptr);    //cin不再与其他流相关联
cin.tie(&cerr);     //读取cin会刷新cerr而不是cout
cin.tie(old_tie);   //重建cin和cout间的正常关联

8.文件的输入输出
头文件fstream定义了三个类型来支持文件IO:ifstream从一个给定文件读取数据,ofstream向一个给定的文件写出数据,以及fstream可以读写给定文件。

ifstream in(ifile);     //构筑一个ifstream并打开给定文件
ofstream out;           //输出文件流未与任何文件相关联
out.open(ifile+".copy");//打开指定文件
out.close();            //关闭文件
out.open(ifile + "2");  //打开另一个文件

自动构造和析构

//对每个传递给程序的文件执行循环操作
for(auto p = argv + 1; p != argv +argc; ++p)
{
	ifstream input (*p)     //创建输出流并打开文件
	if(input){              //如果文件打开成功,处理此文件
		process(input);
	} else
		cerr << "could not open :" string(*p);
}   //每个循环步input都会离开作用域,因此会被销毁

9.文件模式

in   以读方式打开
out  以写方式打开,会丢弃已有数据
app  每次写操作前均定位到文件末尾
ate  打开文件后立即定位到文件末尾
trunc 截断文件
binary  以二进制方式进行IO

ofstream app2("file2", ofstream::out | ofstream::app);

10.string流。istringstream从string读取数据,ostringstream向string写入数据,头文件stringstream既可以从string读数据也可向string写数据。

英语术语
条件状态:condition state 可被任何流类使用的一组标志和函数,用来指出给定流是否可用
文件模式:file mode 在文件打开时指定,用来控制文件如何被使用
文件流:file stream 用来读写命名文件的流对象
继承:inheritance 程序设计功能,令一个类型可以从另一个类型继承接口。
字符串流:string stream 用于读写string 的流对象

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页