.IO流的概念及流类库结构
1、前言
当程序与外界环境进行信息交换时,存在两个对象:
一个是程序中的对象,另一个是文件对象。
其中文件对象可以是磁盘设备,也可以是外部设备,C++将输入输出设备当做文件处理。
流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。
2、流对象与文件操作
- 程序建立一个流对象;
- 指定这个流对象与某个文件对象建立连接
- 程序操作流对象
- 流对象通过文件系统对所连接的文件对象产生作用
3、c++中的流对象
.输出流
1、预先定义的输出流对象
cout 标准输出,通常输出正常输出东西
cerr 标准错误输出,没有缓冲,发送给它的内容立即被输出。
clog 类似于cerr,但是有缓冲,当缓冲区满是被输出
三个不同的输出流对象往往用于处理不同的信息,处理输出设备不同的信息
2、构造输出流对象
ofstream类支持磁盘文件输出
如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的
.ofstream myFile("filename");
可以在调用默认构造函数之后使用open成员函数打开文件
.ofsteam myFile;//声明一个静态文件输出流对象
.myFile.open("filename");//打开文件,使流对象与文件建立联系
在构造对象或用open打开文件时可以指定模式
.ofstream myFile("filename",ios_base::out|ios_base::binary);//以二进制模式打开某文件
文件输出流成员函数的三种类型
.与操作符等价的成员函数
.执行非格式化写操作的成员函数
.其它修改状态且不同于操作符或插入运算符的成员函数
3、常用的文件输出流成员函数
open函数
.把流与一个指定的磁盘文件关联起来;
.需要指定的打开模式
put函数
.把一个字符写到输出流中
write函数
.将内存中的一块内容写到一个文件输出流中
seekp和tell函数
.操作文件流的内部指针
.seekp可以移动文件内部的写指针
close函数
.关闭与一个文件输出流关联的磁盘文件
错误处理函数
.在写到一个流时进行错误处理
向文本文件输出
通常使用插入运算符“<<”
为所有标准c++数据类型预先设计的,用于传送字节到每一个输出流对象。
1、控制输出格式——操纵符(manipulator)
1)、插入运算符与操纵符一起工作
.控制输出格式
2)、很多操纵符都定义在
- .ios_base类中(如hex())、头文件(如setprecison())。
3)、控制输出宽度
.在流中放入setw操纵符或调用width成员hs为每个项指定输出宽度.
-
.setw():https://blog.csdn.net/fzk0813/article/details/88303902
-
.width():https://blog.csdn.net/qq_41289920/article/details/82949660
-
.setiosflags操纵符
.这个程序中,通过使用带参数的setiosflags操作符设置左对齐,setiosflags定义在头文件iomanip中
.参数ios_base::left是ios_base的静态常量,因此引用时必须包括ios_base::前缀。
.这里需要用resetiosflags操作符关闭左对齐标志。setiosflags不同于width和setw,它的影响是持久的,直到用resetiosflags重新恢复默认值时为止。
.setiosflags的参数数该流的各是标志值,可用按位或(|)运算符进行组合
4)、setw和width仅影响紧随其后的输出项,但其它流格式操纵符保持有效直到发生改变
5)、dec、oct和hex操纵符设置输入和输出的默认进制。
2、精度——setprecision()
如果不指定fixed或scientific,精度值表示有效数字位数。
如果设置了ios_base::fixed或ios_base::scientific精度值表示小数点之后的位数
向二进制文件输出
1、二进制文件流
- 使用ofsteam构造函数中的模式参量指定二进制输出模式
- 以通常方式构造一个流,然后使用setmode成员函数,在文件打开后改变模式;
- 通过二级制文件输出流对象完成输出
例子:
#include <fstream>
using namespace std;
//c++中不支持对象的序列化,因此使用构造体,只含有数据结构体可被存储到磁盘。
struct Date
{
int mon,day,year;
}
int main()
{
Date dt={6,10,92};
//建立文件输出流对象file,并与data.dat联系起来,且打开方式为二进制
ofstram file("data.dat",ios_base::binary);
file.write(reinterpret_cast<char*>(&dt),sizeof(dt));
file.close();
return 0;
}
向字符串输出
字符串输出流(ostringstream)
作用:用于构造字符串
功能:
1、支持ofstream类的除open、close外的所有操作
2、str函数可以返回当前已经构造的字符串
运用:
将数值转换为字符串
输入流
重要的输入流类:
1、istream类最适合用于顺序文本模式输入。cin是其实例
2、ifstream类支持磁盘文件输入
3、istringstream为字符串输入流类
1、构造输入流对象
1.如果在构造函数中指定一个文件名,在构造该对象时该文件便自动打开。
ifstream myFile("filename");
2、在调用默认构造函数之后使用open函数来打开文件。
ifstream myFile;//建立一个文件流对象
myFiile.open("filename");//打开文件“filename”
3、打开文件时可以指定模式
ifstream myFile("filename",ios_base::in|ios_base::binary);
使用提取运算符从文本文件输入——“>>”
1、提取运算符(<<)对于所有标准c++数据类型都是预先设计好的。
2、是从一个输入流对象获取字节最容易的方法。
3、ios类中的很多操纵符都可以应用于输入流。但是只有少数几个对输入流对象具有实际影响,其中最重要的是进制操纵符dec,oct和hex。
2、输入流相关函数
.open函数把该流与一个特定磁盘文件相关联。
.get函数的功能与提取运算符(>>)很相像,主要的不同点是get函数在读入数据时包括空白字符。
.getline的功能是从输入流中读取多个字符,并且允许指定输入终止符,读取完成后,从读取的内容中删除终止字符。
.read成员函数从一个文件读字节到一个指定的内存区域,由长度参数确定要读的字节数。当遇到文件结束或者在文本模式文件中遇到文件结束标记字符时结束读取。
seekg函数用来设置文件输入流中读取数据位置的指针。
tellg函数返回当前文件读指针的位置。
close函数关闭一个文件输入流关联的磁盘文件。