![第九章流类库与输入输出_教程_第1页](http://file3.renrendoc.com/fileroot3/2021-11/11/2f75b9dc-5eb9-4201-bb97-873e8a043e40/2f75b9dc-5eb9-4201-bb97-873e8a043e401.gif)
![第九章流类库与输入输出_教程_第2页](http://file3.renrendoc.com/fileroot3/2021-11/11/2f75b9dc-5eb9-4201-bb97-873e8a043e40/2f75b9dc-5eb9-4201-bb97-873e8a043e402.gif)
![第九章流类库与输入输出_教程_第3页](http://file3.renrendoc.com/fileroot3/2021-11/11/2f75b9dc-5eb9-4201-bb97-873e8a043e40/2f75b9dc-5eb9-4201-bb97-873e8a043e403.gif)
![第九章流类库与输入输出_教程_第4页](http://file3.renrendoc.com/fileroot3/2021-11/11/2f75b9dc-5eb9-4201-bb97-873e8a043e40/2f75b9dc-5eb9-4201-bb97-873e8a043e404.gif)
![第九章流类库与输入输出_教程_第5页](http://file3.renrendoc.com/fileroot3/2021-11/11/2f75b9dc-5eb9-4201-bb97-873e8a043e40/2f75b9dc-5eb9-4201-bb97-873e8a043e405.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+程序设计教程,郑莉,清华大学第八章编程测试题 1. 对Point类重载+(自增),-(自减)运算符,要求同时重载前置和后置形式。Point类的数据成员:x, y;成员函数:Getx(), Gety(),构造、析构函数以及运算符重载函数。程序包括Point类的声明和实现的代码以及测试成员函数功能的主程序。 2. 定义一个基类BaseClass,从它派生出DerivedClass类,BaseClass和DerivedClass都有成员函数fun1(), fun2(),其中fun1()为虚函数,在主函数程序中声明一个DerivedClass对象,分别用BaseClass和DerivedClass
2、的指针指向DerivedClass对象,并通过指针调用fun1(),fun2()。1C+程序设计教程第九章 流类库与输入/输出清华大学 郑 莉C+程序设计教程,郑莉,清华大学目录9.1 I/O流的概念及流类库结构9.2 输出流9.3 输入流9.4 输入/输出流9.5 综合实例对个人银行账户管理程序的改进9.6 小结3C+程序设计教程,郑莉,清华大学9.1 I/O流的概念及流类库结构 当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象。 流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。 程序建立一个流对象,并指定这个流对象与某个文
3、件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。 读操作在流数据抽象中被称为(从流中)提取,写操作被称为(向流中)插入。4C+程序设计教程,郑莉,清华大学流类库结构59.1 I/O流的概念及流类库结构C+程序设计教程,郑莉,清华大学9.2 输出流 最重要的三个输出流是 ostream ofstream ostringstream6C+程序设计教程,郑莉,清华大学9.2.1 构造输出流对象 预先定义的输出流对象: cout 标准输出 cerr 标准错误输出,没有缓冲,发送给它的内容立即被输出。 clog 类似于cerr,但是有缓冲,缓冲区满时被输出。79.2 输出流
4、C+程序设计教程,郑莉,清华大学9.2.1 构造输出流对象(续) ofstream类支持磁盘文件输出 如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的 ofstream myFile(filename); 可以在调用默认构造函数之后使用open成员函数打开文件ofstream myFile; /声明一个静态文件输出流对象声明一个静态文件输出流对象myFile.open(filename); /打开文件,使流对象与文件建立联系打开文件,使流对象与文件建立联系 在构造对象或用open打开文件时可以指定模式 ofstream myFile(filename, ios_base:ou
5、t | ios_base:binary);89.2 输出流C+程序设计教程,郑莉,清华大学9.2.2使用插入运算符和操纵符(manipulator) 插入()运算符是所有标准C+数据类型预先设计的,用于传送字节到一个输出流对象。 控制输出宽度(setw, width() 为了调整输出宽度,可以通过在流中放入setw操纵符或调用width成员函数为每个项指定输出宽度。 dec、oct和hex操纵符设置输入和输出的默认进制。99.2 输出流C+程序设计教程,郑莉,清华大学例9-1 使用width控制输出宽度#include using namespace std; int main() doubl
6、e values = 1.23, 35.36, 653.7, 4358.24 ;for(int i = 0; i 4; i+) cout.width(10);cout valuesi endl;return 0;109.2 输出流 9.2.2使用插入运算符和操纵符(manipulator)输出结果输出结果: : 1.23 1.23 35.36 35.36 653.7 653.7 4358.24 4358.24C+程序设计教程,郑莉,清华大学例9-2使用setw操纵符指定宽度/9_2.cpp#include #include #include using namespace std; int m
7、ain() double values = 1.23, 35.36, 653.7, 4358.24 ;string names = Zoot, Jimmy, Al, Stan ;for (int i = 0; i 4; i+)cout setw(6) namesi setw(10) valuesi endl;return 0;119.2 输出流 9.2.2使用插入运算符和操纵符(manipulator)输出结果: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24C+程序设计教程,郑莉,清华大学例9-3设置对齐方式/9_3.cpp#include #incl
8、ude #include using namespace std; int main() double values = 1.23, 35.36, 653.7, 4358.24 ;string names = Zoot, Jimmy, Al, Stan ;for (int i=0;i4;i+)cout setiosflags(ios_base:left) setw(6) namesi resetiosflags(ios_base:left) setw(10) valuesi endl;return 0;129.2 输出流 9.2.2使用插入运算符和操纵符(manipulator)输出结果:Zo
9、ot 1.23Jimmy 35.36Al 653.7Stan 4358.24C+程序设计教程,郑莉,清华大学例9-4控制输出精度/9_4.cpp#include #include #include using namespace std; int main() double values = 1.23, 35.36, 653.7, 4358.24 ;string names = Zoot, Jimmy, Al, Stan ;for (int i=0;i4;i+)cout setiosflags(ios_base:left) setw(6) namesi resetiosflags(ios_ba
10、se:left) setw(10) setprecision(1) valuesi endl;return 0;139.2 输出流 9.2.2使用插入运算符和操纵符(manipulator)输出结果:Zoot 1Jimmy 4e+001Al 7e+002Stan 4e+003C+程序设计教程,郑莉,清华大学9.2.3文件输出流成员函数 输出流成员函数有三种类型: 与操纵符等价的成员函数。 执行非格式化写操作的成员函数。 其它修改流状态且不同于操纵符或插入运算符的成员函数。149.2 输出流C+程序设计教程,郑莉,清华大学9.2.3文件输出流成员函数(续) open函数把流与一个特定的磁盘文件关
11、联起来。需要指定打开模式。ofstream file(“filename”, ios_base:out|ios_base:binary);ofstream file;file.open(“filename”, ios_base:out|ios_base:binary); put函数把一个字符写到输出流中。cout.put(A);coutA;159.2 输出流C+程序设计教程,郑莉,清华大学9.2.3文件输出流成员函数(续) write函数把内存中的一块内容写到一个文件输出流中 seekp和tellp函数一个文件输出流保存一个内部指针,该指针指出下一次写数据的位置;seekp()设置该指针;te
12、llp()返回该文件位置指针值。 close函数关闭与一个文件输出流关联的磁盘文件 错误处理函数(bad,fail,good,eof,clear,rdstate)在写到一个流时进行错误处理169.2 输出流C+程序设计教程,郑莉,清华大学例9-5 向文件输出(write()/9_5.cpp#include using namespace std;struct Date int mondy, day, year; ;int main() Date dt = 6, 10, 92 ;ofstream file(date.dat, ios_base:binary);file.write(reinter
13、pret_cast(&dt), sizeof(dt);file.close();return 0;179.2 输出流 9.2.3 文件输出流成员函数C+程序设计教程,郑莉,清华大学9.2.4 二进制输出文件 以通常方式构造一个流,然后使用setmode成员函数,在文件打开后改变模式。 使用ofstream构造函数中的模式参量指定二进制输出模式189.2 输出流C+程序设计教程,郑莉,清华大学9.2.4 二进制输出文件#include#includeusing namespace std;using namespace std;int array2=99,10;int array2=99,10;
14、int main()int main() ofstream os(“test.dat”, ofstream os(“test.dat”, ios_base:out| ios_base:out|ios_base:binaryios_base:binary);); os.write(reinterpret_castchar os.write(reinterpret_cast(array),(array), sizeof(array); sizeof(array);return 0; return 0; 199.2 输出流C+程序设计教程,郑莉,清华大学9.2.5 字符串输出流( ostringst
15、ream ) 用于构造字符串 功能 支持ofstream类的除open、close外的所有操作 成员函数str函数返回一个string对象,表示用该输出流所产生的字符串。 典型应用 将数值转换为字符串209.2 输出流C+程序设计教程,郑莉,清华大学例9-6用ostringstream将数值转换为字符串/9_6.cpp#include #include #include using namespace std; template /函数模板inline string toString(const T &v) ostringstream os;/创建字符串输出流os v;/将变量v的值写入字符串
16、流return os.str();/返回输出流生成的字符串 int main() string str1 = toString(5);cout str1 endl;string str2 = toString(1.2);cout str2 )对于所有标准C+数据类型都是预先设计好的。 是从一个输入流对象获取字节最容易的方法。 ios类中的很多操纵符都可以应用于输入流。但是只有少数几个对输入流对象具有实际影响,其中最重要的是进制操纵符dec、oct和hex。249.3 输入流C+程序设计教程,郑莉,清华大学9.3.4输入流相关函数 open函数把该流与一个特定磁盘文件相关联。 get函数的功能与
17、提取运算符()很相像,主要的不同点是get函数在读入数据时包括空白字符。(第6章介绍过) getline的功能是从输入流中读取多个字符,并且允许指定输入终止字符,读取完成后,从读取的内容中删除终止字符。(第6章介绍过) read成员函数从一个文件读字节到一个指定的内存区域,由长度参数确定要读的字节数。如果给出长度参数,当遇到文件结束或者在文本模式文件中遇到文件结束标记字符时结束读取。259.3 输入流C+程序设计教程,郑莉,清华大学9.3.4输入流相关函数(续) seekg函数用来设置文件输入流中读取数据位置的指针。 tellg函数返回当前文件读指针的位置。 close函数关闭与一个文件输入流
18、关联的磁盘文件。269.3 输入流C+程序设计教程,郑莉,清华大学例9-7 get函数应用举例/9_7.cpp#include using namespace std;int main() char ch;while (ch = cin.get() != EOF)cout.put(ch);return 0;279.3 输入流 9.3.4 输入流相关函数C+程序设计教程,郑莉,清华大学例9-8为输入流指定一个终止字符:/9_8.cpp#include #include using namespace std;int main() string line; cout Type a line ter
19、minated by t endl; getline(cin, line, t); cout line endl;return 0;289.3 输入流 9.3.4 输入流相关函数C+程序设计教程,郑莉,清华大学例9-9从一个payroll文件读一个二进制记录到一个结构中/9_9.cpp#include #include #include using namespace std;struct SalaryInfo unsigned id;double salary; int main() SalaryInfo employee1 = 600001, 8000 ;ofstream os(payro
20、ll, ios_base:out | ios_base:binary);os.write(reinterpret_cast(&employee1), sizeof(employee1);os.close();299.3 输入流 9.3.4 输入流相关函数C+程序设计教程,郑莉,清华大学例9-9(续)ifstream is(payroll, ios_base:in | ios_base:binary);if (is) SalaryInfo employee2;is.read(reinterpret_cast(&employee2), sizeof(employee2);cout employee
21、2.id employee2.salary endl; else cout ERROR: Cannot open file payroll. endl; is.close(); return 0; 309.3 输入流 9.3.4 输入流相关函数C+程序设计教程,郑莉,清华大学例9-10用seekg函数设置位置指针/9_10.cpp, 头部分省略int main() int values = 3, 7, 0, 5, 4 ;ofstream os(integers, ios_base:out | ios_base:binary);os.write(reinterpret_cast(values),
22、 sizeof(values);os.close(); ifstream is(integers, ios_base:in | ios_base:binary);if (is) is.seekg(3 * sizeof(int);int v;is.read(reinterpret_cast(&v), sizeof(int);cout The 4th integer in the file integers is v endl; else cout ERROR: Cannot open file integers. endl; return 0; 319.3 输入流 9.3.4 输入流相关函数C+
23、程序设计教程,郑莉,清华大学例9-11读一个文件并显示出其中0元素的位置/9_11.cpp, 头部分省略int main() ifstream file(integers, ios_base:in | ios_base:binary);if (file) while (file) streampos here = file.tellg(); int v; file.read(reinterpret_cast(&v), sizeof(int); if (file & v = 0) cout Position here is 0 endl; else cout ERROR: Cannot open
24、 file integers. endl; file.close();return 0; 329.3 输入流 9.3.4 输入流相关函数C+程序设计教程,郑莉,清华大学9.3.5 字符串输入流( istringstream) 用于从字符串读取数据 在构造函数中设置要读取的字符串 功能 支持ifstream类的除open、close外的所有操作 典型应用 将字符串转换为数值339.3 输入流C+程序设计教程,郑莉,清华大学例9-12用ostringstream将字符串转换为数值/9_12.cpp, 头部分省略template inline T fromString(const string &s
25、tr) istringstream is(str);/创建字符串输入流T v;is v;/从字符串输入流中读取变量vreturn v;/返回变量v int main() int v1 = fromString(5);cout v1 endl;double v2 = fromString(1.2);cout v2 ”、“”运算符,对账户信息重载“”运算符。36C+程序设计教程,郑莉,清华大学例9-13 个人银行账户管理程序 程序分为6个文件: date.h是日期类头文件 date.cpp是日期类实现文件 accumulator.h为按日将数值累加的Accumulator类的头文件 account
26、.h是各个储蓄账户类定义头文件 account.cpp是各个储蓄账户类实现文件 9_13.cpp是主函数文件。379.5综合实例对个人银行账户管理程序的改进C+程序设计教程,郑莉,清华大学/date.h#ifndef _DATE_H_#define _DATE_H_#include class Date /日期类/Date类中不再有静态成员函数read,其它内容与例10-24完全相同,;std:istream & operator (std:istream &in, Date &date);std:ostream & operator (istream &in, Date &date) int
27、 year, month, day;char c1, c2;in year c1 month c2 day; / 以“2008-11-1”输入date = Date(year, month, day);return in;ostream & operator (ostream &out, const Date &date) out date.getYear() - date.getMonth() - date.getDay();return out;389.5综合实例对个人银行账户管理程序的改进例9-13(续)C+程序设计教程,郑莉,清华大学/account.h#ifndef _ACCOUNT
28、_H_#define _ACCOUNT_H_#include date.h#include accumulator.h#include #include #include class Account /账户类/Account类中为以下函数增加了一个参数,其它成员与例10-24完全相同virtual void show(std:ostream &out) const;inline std:ostream & operator (std:ostream &out, const Account &account) account.show(out);return out;class CreditAc
29、count : public Account /信用账户类/ CreditAccount类中为以下函数增加了一个参数,其它成员与例10-24完全相同virtual void show(std:ostream &out) const;/account.h中其它类的定义与例10-24完全一样#endif /_ACCOUNT_H_399.5综合实例对个人银行账户管理程序的改进例9-13(续)C+程序设计教程,郑莉,清华大学/account.cpp中,只有以下几个成员函数的实现有所改变,其它内容与例10-24完全相同void AccountRecord:show() const cout date t
30、# getId() t amount t balance t desc endl;Account:Account(const Date &date, const string &id) : id(id), balance(0) cout date t# id created endl;void Account:show(ostream &out) const out id tBalance: balance;void CreditAccount:show(ostream &out) const Account:show(out);out tAvailable credit: getAvaila
31、bleCredit();409.5综合实例对个人银行账户管理程序的改进例9-13(续)C+程序设计教程,郑莉,清华大学/9_13.cpp#include account.h#include #include #include #include #include #include using namespace std;struct deleter template void operator () (T* p) delete p; ;class Controller /控制器,用来储存账户列表和处理命令private:Date date;/当前日期vector accounts;/账户列表bo
32、ol end;/用户是否输入了退出命令public:Controller(const Date &date) : date(date), end(false) Controller();const Date &getDate() const return date; bool isEnd() const return end; /执行一条命名,返回该命令是否改变了当前状态(即是否需要保存该命令)bool runCommand(const string &cmdLine);419.5综合实例对个人银行账户管理程序的改进例9-13(续)C+程序设计教程,郑莉,清华大学Controller:Cont
33、roller() for_each(accounts.begin(), accounts.end(), deleter();bool Controller:runCommand(const string &cmdLine) istringstream str(cmdLine);char cmd, type;int index, day;double amount, credit, rate, fee;string id, desc;Account* account;Date date1, date2;str cmd;switch (cmd) case a:/增加账户/ 对a(增加账户)、d(存
34、款)、w(取款)、s(查询账户信息)、c(改变日期)、/ n(进入下个月)的处理,与例10-24基本相同,只是把读入参数的输入流由cin改为了/ str,并且在每种情况后直接return,其中对s命令返回false,其它皆返回true。case q:/查询一段时间内的账目str date1 date2;Account:query(date1, date2);return false;case e:/退出end = true;return false;cout Inavlid command: cmdLine endl;return false;429.5综合实例对个人银行账户管理程序的改进例9
35、-13(续)C+程序设计教程,郑莉,清华大学int main() Date date(2008, 11, 1);/起始日期Controller controller(date);string cmdLine;const char *FILE_NAME = commands.txt;ifstream fileIn(FILE_NAME); /以读模式打开文件if (fileIn) /如果正常打开,就执行文件中的每一条命令while (getline(fileIn, cmdLine)controller.runCommand(cmdLine);fileIn.close(); /关闭文件ofstream fileOut(FILE_NAME, ios_base:app);/以追加模式打开文件cout (a)add account (d)deposit (w)withdraw (s)show (c)change day (n)next month (q)query (e)exit endl;while (!controller.isEnd() /从标准输入读入命令并执行,直到退出cout controller.getDate() tTotal: Account:getT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《大学物理(下册)》课件-第16章
- 融资融券业务操作方法及技巧介绍
- 2025年全球及中国自主机器人街道吸尘器行业头部企业市场占有率及排名调研报告
- 2025年全球及中国商店可视化工具行业头部企业市场占有率及排名调研报告
- 2025年全球及中国数通硅光芯片行业头部企业市场占有率及排名调研报告
- 2025年全球及中国固体葡萄糖浆行业头部企业市场占有率及排名调研报告
- 2025年全球及中国房屋装修和翻新行业头部企业市场占有率及排名调研报告
- 2025年全球及中国立式高温反应釜行业头部企业市场占有率及排名调研报告
- 2025年全球及中国输注穿刺耗材行业头部企业市场占有率及排名调研报告
- 2025年全球及中国微波波导衰减器行业头部企业市场占有率及排名调研报告
- 《中国心力衰竭诊断和治疗指南(2024)》解读完整版
- 《档案管理课件》课件
- 2024年度中国共产主义共青团团课课件版
- 2025年中考物理终极押题猜想(新疆卷)(全解全析)
- 胫骨骨折的护理查房
- 抽水蓄能电站项目建设管理方案
- 电动工具培训课件
- 《智能网联汽车智能传感器测试与装调》电子教案
- 视频会议室改造方案
- 【中考真题】广东省2024年中考语文真题试卷
- GB/T 32399-2024信息技术云计算参考架构
评论
0/150
提交评论