编程语言
首页 > 编程语言> > 《C++primer》第八章读书笔记

《C++primer》第八章读书笔记

作者:互联网

《C++Primer 第五版》

​ ——读书随笔集

第八章

8.1 IO类

8.1.1 IO对象无拷贝和赋值

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

ofstream out1, out2;
out1 = out2; //错误:不能对流对象赋值
ofstream print(ofstream); //错误:不能初始化ofstream对象
out2 = print(out2); //错误,不能拷贝流对象
头文件 类型
iostream istream,wistream从流中读取数据
ostream,wostream向流中写入数据
iostream,wiostream读写流
fstream ifstream,wifstream从文件中读取数据
ofstream,wofstream向文件中写入数据
fstream,wfstream读写文件
sstream istringstream,wistringstream从string中读取数据
ostringstream,wostringstream向string中写入数据
stringstream,wstringstream读写string

为了支持宽类型,标准库定义了一组类型和对象来wchar_t类型的数据。宽字符版本的类型和函数的名字以一个w开始。

本文介绍的标准库流特性都可以无差别地应用于普通流,文件流和string流,以及char或宽字符版本

8.1.2 条件状态

IO类定义了一些函数和标志,可以帮助我们访问和操纵流的条件状态

strm::iostate strm是一种IO类型,iostate是一种机器相关的类型,提供了表达条件状态的完整功能
strm::badbit strm::badbit指流已崩溃
strm::failbit strm::failbit用来指一个IO操作已经失败
strm::eofbit strm::eofbit用来指出流到达了文件结束
strm::goodbit strm::goodbit用来指出流未处于错误状态。此值保证为零
s.eof() 若流s的eofbit置位,则返回true
s.fail() 若流s的failbit或badbit置位,则返回true
s.bad() 若流s的badbit置位,则返回true
s.good() 若流s处于有效状态,则返回true
s.clear(flags) 根据给定的flags标志位,将流中对应条件状态位复位。flags的类型为strm::iostate。返回void
s.setstate(flags) 根据给定的flags标志位,将流中对应条件状态位置位。flags的类型为strm::iostate。返回void
s.rdstate() 返回流s的当前条件状态,返回值类型为strm::iostate

8.1.3 管理输出缓冲

每个输出流都有一个缓冲区,用来保存程序读写的数据。

8.2 文件的输入输出

头文件fstream定义了三个类型来支持文件IO:ifstream,ofstream,fstream。

这些类型提供的操作与我们之前已经使用过的对象cin和cout一样。它除了继承来自iostream类型的行为以外,fstream中定义的类型还新增了成员来管理与流关联的文件。这些成员只能对ifstream,ofstream,fstream对象调用这些操作,但不能对其他IO类型调用这些操作。

fstream fstrm 创建一个未绑定的文件流
fstream fstrm(s) 创建一个fstream,并打开名为s的文件。
fstream fstream(s,mode) 与前一个构造函数类型,但按指定mode打开文件
fstrm.open(s) 打开名为s的文件,并将文件与fstrm绑定。返回void
fstrm.close() 关闭与fstrm绑定的文件。返回void
fstrm.is_open() 返回一个bool值,指出文件是否打开且尚未关闭。

8.2.1使用文件流对象

ifstream in(file); //构建一个ifstream并打开给定文件
ofstream out; //输出流未关联到任何文件

文件名可以是一个库类型string对象,也可以是C风格字符数组

8.2.2 文件模式

每个流都有一个文件模式,用来指出如何使用文件。

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

无论用哪种方式打开文件,我们都可以指定文件模式,调用open打开文件时可以,用一个文件名初始化流来隐式打开文件时也可以。指定文件模式有如下限制∶

每个文件流类型都定义了一个默认的文件模式,当我们未指定文件模式时,就使用此默认模式。与ifstream关联的文件默认以in 模式打开;与 ofstream关联的文件默认以 out 模式打开;与fstream关联的文件默认以in 和 out 模式打开。

以out模式打开文件会丢失已有数据

默认情况下,当我们打开一个 ofstream 时,文件的内容会被丢弃。阻止一个 ofstream 清空给定文件内容的方法是同时指定 app 模式∶

// 在这几条语句中file1都被截断
ofstream out("file1");                    // 隐含以输出模式打开文件并截断文件                              
ofstream out2("file1", ofstream::out);    // 隐含地截断文件
ofstream out3("file1", ofstream::out | ofstream::trunc);
// 为保留文件内容,我们必须显式指定app模式
ofstream app("file2", ofstream::app);    // 隐含为输出模式
ofstream app2("file2", ofstream::out | ofstream::app);

每次调用open时都会确定文件模式

对于一个给定的流,每次打开文件时,都可以改变文件模式

ofstream out;                            // 未指定文件打开模式
out.open("scratchpad");                  // 模式隐含地设置为输出和截断
out.close();                             // 关闭out,以便用于其他文件
out.open("precious", ofstream::app);     // 模式为输出和追加
out.close();

第一个open调用未显式指定输出模式,文件隐式地以out 模式打开。

通常情况下,out模式意味着同时使用trunc模式。因此,当前目录下名为scratchpad的文件的内容将被清空。

当打开名为 precious 的文件时,我们指定了append模式。文件中已有的数据都得以保留,所有写操作都在文件末尾进行。

8.3 string流

sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,也可以从string读取数据,就像string是一个IO流一样。

istringstream从string读取数据,ostringstream向string写入数据,而头文件stringstream都可以。下列是sstream特有的成员。

sstream strm strm是一个未绑定的stringstream对象
sstream strm(s) strm是一个sstream对象,保存了string s的一个拷贝
strm.str() 返回strm所保存的string的拷贝,返回的是个string
strm.str(s) 将string s拷贝到strm中。返回void

标签:文件,primer,读书笔记,cin,C++,模式,strm,ofstream,out
来源: https://www.cnblogs.com/iubolgs/p/15599563.html