9、流类库与输入/输出
就像C语言一样,c++语言中也没有输入/输出语句。但c++编译系统带有一个面向对象的输入/输出软件包,它就是I/O流类库。
1、I/O流的概念及流类库结构
I/O流类库是C语言中I/O函数在面向对象的程序设计方法中的一个替换产品。
当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象。
流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。由于流对象是程序中的对象与文件对象进行交换的界面,对程序对象而言,文件对象有的特性,流对象也有,所以程序将流对象看作是文件对象的化身。
与输入输出设备交互也是通过I/O流类来实现的。流所涉及的范围远不止于此,凡是数据从一个地方传输到另一个地方的操作都是流的操作。像网络数据交换、进程数据交换等都是流操作。因此,一般意义下的读操作在流数据抽象中被称为从流中提取,写操作被称为向流中插入。
I/O流类库的基础是类模板,类模板提供了库中的大多数功能,而且可以作用于不同类型的元素,这些类模板都以"basic_"为前缀。
I/O流类库中有两组类模板实例:面向宽字符的和面向窄字符的。面向宽字符的类支持多字节的字符,面向窄字符的类支持单字节字符。头文件<iosfwd>中,有很多实例化类型。
在I/O流类库中,头文件<iostream>声明了8个预定义的流对象用来完成在标准设备上的输入/输出操作:cin、cout、cerr、clog、wcin、wcout、wcerr、wclog。
2、输出流
一个输出流对象是信息流动的目标,最重要的三个输出流是ostream,ofstream和ostringstream。
预先定义的ostream类对戏那个用来完成向标准设备的输出,包括:
cout标准输出
cerr标准错误输出,没有缓冲,发送给他的内容立即被输出
clog类似于cerr,但是有缓冲,缓冲区满时被输出。
ofstream类支持磁盘文件输出。如果你需要一个只输出的磁盘文件,可以构造一个ofstream类的对象。在打开文件之前或之后可以指定ofstream对象接受二进制或文本模式数据。很多格式化选项和成员函数可以应用于ofstream,包括基类ios和ostream的所有功能。
如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的。否则,可以在调用默认构造函数之后使用open成员函数打开文件,或者在一个由文件指示符标识的打开文件基础上构造一个ofstream对象。
2.1构造输出流对象
之前都是将信息输出到标准输出设备,使用的是cout。如果要使用文件流将信息输出到文件,便需要使用构造函数来建立流对象。
构造输出文件流的常用方法如下:
使用默认构造函数,然后调用open成员函数,例如:
ofstream myFile;//声明一个静态输出文件流对象
myFile.open("filename",iosmode);//打开文件,使流对象与文件建立联系
或:
ofstream * pmyFile=new ofstream;//建立一个动态的输出文件流对戏那个
pmyFile->open("filename",iosmode);//打开文件,使流对象与文件建立联系
在调用构造函数时指定文件名和模式:
ofstream myFile("filename",iosmode);
也可以使用同一个流先后打开不同的文件(在同一时刻只有一个是 打开的):
ofstream ofile;
ofile.open("FILE1",iosmode);//打开文件FILE1
//....向文件“FILE1”输出
ofile.close();//关闭FILE1
ofile.open("FILE2",iosmode);//打开文件FILE2
//....向文件“FILE2”输出
ofile.close();//关闭FILE2
//当对象ofile离开它的作用域时便消亡
2.2使用插入运算符和操纵符
介绍如何控制输出格式以及如何为自己的类建立插入运算符。插入(<<)运算符是所有标准c++数据类型预先设计的,用于传送字节到一个输出流对象。插入运算符与预先定义的操纵符一起工作,可以控制输出格式。
很多操纵符都定义在ios_base类中和<iomanip>头文件中。
1、输出宽度
可以通过在流中放入setw操纵符或调用width成员函数为每个项指定输出宽度。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】