第十一章 流类库与输入输出
- 格式:pps
- 大小:140.50 KB
- 文档页数:37
面向对象的程序设计(C++)教学大纲教学目的本课程为高级语言程序设计的入门课程,完全针对零起点的学生,可作为其他信息类相关课程的基础课。
目标是使学生通过本课程的学习,掌握面向对象程序设计的基本概念和方法、C++的基本语法和编程方法;学会使用集成开发环境;掌握程序调试方法;初步了解常用数据结构和非数值算法;初步了解C++标准模板库的使用方法。
教学任务完成《C++语言程序设计(第4版)》教材内容,及《C++语言程序设计(第4版)学生用书》中的实验内容,另有学生自主选题的大作业、选作的论文回报告。
学时:大课30、实验30、课外30、课外讨论10学时。
教学内容的结构课程由4个模块共12个教学单元组成,对应于《C++语言程序设计(第4版)》的十二章内容。
教学活动以及教学方法上的基本要求大课、实验、课外作业、自选题目的大作业、论文和报告结合,学时大课30、实验30、课外30。
另有课外讨论环节。
通过大课讲解基本原理和方法;通过实验课巩固大课内容,并在助教辅导下完成基础实验,当堂由助教验收;课外作业由学生独立完成,并提交清橙考试系统进行评分。
自选题目的大作业要在期中提交选题报告,逐一批改并给出评语,期末提交全部文档及程序并且逐一答辩。
答辩形式为:学生演示5分钟,教师提问5分钟,当即给出成绩。
论文和报告属于加分因素。
课外讨论安排在每次大课之后,加1学时,自愿参加,每人每学期至少参加一次。
内容为:教师对难点进行复习、讲解补充例题,学生提问和讨论。
模块及单元教学目标与任务模块1:程序设计基础单元1 绪论要点:●面向对象程序设计语言的产生和特点,面向对象方法的由来及其基本概念,面向对象的软件工程简介;●信息在计算机中的表示和存储,程序的开发过程。
教学任务:1.1计算机程序设计语言的发展1.2面向对象的方法1.3面向对象的软件开发1.4信息的表示与存储1.5程序的开发过程作业及实验:作业1、实验一单元2 C++简单程序设计要点:●C++语言的发展历史及其特点;●构成C++语句的基本部分—字符集、关键字、标识符、操作等;●C++的基本数据类型和自定义数据类型;●顺序、选择和循环结构。
C++:流类库与输⼊输出7.2.1 C++的输⼊输出流ios:流基类(抽象类)istream:通⽤输⼊流类和其他输⼊流的基类ostream:通⽤输出流类和其他输出类的基类iostream:通⽤输⼊输出流类和其他输⼊输出流类的基类(以下的派⽣类对象有cin、cout、cerr、clog)ifstream:输⼊⽂件流类ofstream:输出⽂件流类fstream:输⼊输出⽂件流istrstream:输⼊字符串流类ostrstream:输出字符串流类strstream:输⼊输出字符串类iostream_withassign: 通⽤输⼊输出流类和其他输⼊输出流类iostream的的派⽣类7.2.2 预定义的流对象C++中包含⼏个预定义的流对象,它们是标准输⼊流对象cin、标准输出流对象cout、⾮缓冲型的标准出错流对象ceer、缓冲型的标准出错流对象clogcin是istream的派⽣类istream_withassign的对象,它与标准输⼊设备(通常是键盘)相联系。
cout是ostream的派⽣类ostream_withassign的对象,它与标准输出设备(通常是显⽰器)相联系。
ceer是ostream的派⽣类ostream_withassign的对象,它与标准错误输⼊设备(通常是显⽰器)相联系。
clog是ostream的派⽣类ostream_withassign的对象,它与标准错误输⼊设备(通常是显⽰器)相联系。
由于istream和ostream类都在头⽂件iostream中声明的,因此只要在程序中包含头⽂件iostream.h,C++程序开始时这四个标准流对象的构造函数都被⾃动调⽤。
7.2.3 输⼊输出流的成员函数(1)put函数put函数⽤于输出⼀个字符格式:cout.put(char ch)例如:cout.put('A')===cout.put(65)===cout.put(25+40)(2)get函数get函数的功能与提取运算符>>类似,主要不同之处是get函数在读⼊数据时可以包括空⽩字符,⽽后者不可以。
流类库与输入/输出。
本章主要内容:a)I/O流的概念b)预定义的标准流与提取和插入运算符c)使用I/O成员函数输入流d)文件流2.概述a)输入/输出( input/output ) 是指程序与计算机的外部设备之间进行信息交换。
b)输入操作指从指定设备收取一个字符序列。
c)输出操作将一个对象转换为一个字符序列,输出到某一个设备;d)输入输出操作可以看成是字符序列在源和目的之间的流动。
将执行这个输入/输出操作的类体系称为流类,提供这个流类实现的系统称为流类库。
e)在C++中,没有专门的输入/输出语句,为了方便用户灵活地完成输入/输出,C+提供了功能强大的输入/输出流类库。
f)C++的I/O系统为了向程序员提供一个统一的接口,使程序的设计尽可能地与所访问的具体设备无关,在程序员与被使用的设备之间提供了一个抽象的概念——流。
g)读操作在流数据抽象中被称为(从流中)提取>>,h)写操作被称为(向流中)插入<<。
i)C++语言支持的外部设备是各种各样的,它将各设备都转换成一个称为流的逻辑设备,由流来完成对不同设备的具体操作。
对程序员而言,所有流的行为是一样的,所以一个用来进行磁盘文件写入操作的函数,也可以用来向显示器写信息。
3.使用流的优点:(与printf,scanf比较)a)(1)可以用其严格的类型检查机制减少因使用不当引起的程序错误;b)(2)流是面向对象的,可以利用类的继承性和多态性,给用户提供统一的接口,实现更多的功能。
4.C++中的流类体系在头文件“iostream.h”中作了说明。
a)*类ios是类istream和类ostream的虚基类;b)*streambuf不是ios类的派生类,类ios中有一个指c)针成员指向类streambuf的一个对象。
d)*类streambuf是用来管理一个流的缓冲区。
e)*类iostream是类istream和类ostream的公有派生,f)从而通过#include “iostream.h”可以完成输入操作和输出操作。
C++语言程序设计第十一章输入/输出本章主要内容●I/O流的概念及流类库结构●输出流●输入流●输入/输出流输入/输出(I/O)概述⏹输入/输出(简称I/O)是程序的一个重要组成部分:◆程序运行所需要的数据往往要从外设(如:键盘、文件等)得到◆程序的运行结果通常也要输出到外设(如:显示器、打印机、文件等)中去。
⏹在C++中,输入/输出不是语言定义的成分,但有一个I/O软件包,称为I/O流类库。
I/O流的概念⏹当程序与外界环境进行信息交换时,存在着两个对象,一个是程序中的对象,另一个是文件对象。
⏹流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。
⏹程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。
⏹读操作在流数据抽象中被称为(从流中)提取,写操作被称为(向流中)插入。
面向对象的输入/输出C++的I/O 流类库提供了以面向对象方式进行的输入/输出。
以下是I/O 类库中基本的I/O 类:iosistream (控制台输入)ostream (控制台输出)ifstream (文件输入)istrstream (字符串变量输入)ofstream (文件输出)ostrstream (字符串变量输出)iostream (输入/输出)fstream (文件输入/输出)strstream (字符串变量输入/输出)P482 图11-1和表11-1给出了I/O 流类层次和说明。
⏹在进行输入/输出时,首先创建一个I/O类的对象,然后,通过该对象(调用对象类的成员函数)进行输入/输出操作。
⏹istream类重载了操作符“>>”(抽取),用它可以进行基本类型数据的输入操作。
例如:istream in(...);in >> x; //x是一个变量in >> y; //y是一个变量或in >> x >> y;⏹ostream类重载了操作符“<<”(插入),用它可以进行基本数据类型数据的输出操作。
例如:ostream out(...);out << e1; //e1是一个表达式out << e2; //e2是一个表达式或I/O的分类⏹基于控制台的I/O:◆从标准输入设备(如:键盘)获得数据◆把程序结果从标准输出设备(如:显示器)输出⏹基于文件的I/O:◆输入:从外存文件获得数据◆输出:把程序结果保存到外存文件中控制台I/O⏹在I/O类库中预定义了四个I/O对象:cin、cout、cerr以及clog,可以直接利用这些对象进行控制台的输入/输出操作:◆cin属于istream类的对象,它对应着计算机系统的标准输入设备,如键盘;◆cout属于ostream类的对象,它对应着计算机系统的用于输出程序正常运行结果的标准输出设备,如显示器;◆cerr和clog属于ostream类的对象,它们对应着计算机系统的用于输出程序错误信息的设备,通常情况下它们都对应着显示器;⏹在进行控制台输入/输出时,程序中需要有下面的包含命令:#include<iostream>输出流⏹最重要的三个输出流是◆ostream◆ofstream◆ostringstream输出流对象⏹预先定义的输出流对象:◆cout 标准输出◆cerr 标准错误输出,没有缓冲,发送给它的内容立即被输出。
◆clog 类似于cerr ,但是有缓冲,缓冲区满时被输出。
输出流输出流对象⏹使用cout 可以进行标准输出,如果要将信息输出到文件,需要建立流对象。
⏹ofstream 类支持磁盘文件输出,常用方法:1.定义一个ofstream 类对象时指定一个文件名,则该文件在创建对象时自动打开:ofstream myFile("filename",iosmode);2.可以定义一个ofstream 类对象,然后使用open 成员函数打开一个文件:ofstream myFile;//定义一个静态文件输出流对象myFile.open("filename",iosmode);//打开文件,使流对象与文件建立联系输出流使用插入运算符和操纵符⏹插入(<<)运算符是所有标准C++数据类型预先设计的。
⏹用于传送字节到一个输出流对象。
输出流输出格式控制⏹控制输出宽度◆setw、width⏹控制对齐方式◆setiosflages(ios_base::left) 默认为右对齐文本⏹控制输出精度◆setprecision 浮点数输出精度默认值是6⏹控制输出数据的进制◆dec oct hex 默认是dec需要包含文件iomanip控制输出格式⏹控制输出宽度◆为了调整输出,可以通过在流中放入setw 操纵符或调用width 成员函数为每个项指定输出宽度。
⏹例11-1 使用width 控制输出宽度#include <iostream>using namespace std;int main(){ double values[] = {1.23,35.36,653.7,4358.24};for(int i=0;i<4;i++){ cout.width(10);cout << values[i] <<'\n';}}输出流输出结果(右对齐):1.2335.36653.7例:使用*填充#include <iostream> using namespace std; int main(){ double values[]={1.23,35.36,653.7,4358.24};for(int i=0; i<4; i++){ cout.width(10);cout.fill('*');cout<<values[i]<<'\n'; }}输出流输出结果:******1.23*****35.36*****653.7***4358.24例11-2使用setw 指定宽度#include <iostream> #include <iomanip> using namespace std;int main(){ double values[]={1.23,35.36,653.7,4358.24};char *names[]={"Zoot","Jimmy","Al","Stan"};for(int i=0;i<4;i++)cout<<setw(6)<<names[i]<<setw(10)<<values[i]<<endl; }输出流输出结果:Zoot 1.23Jimmy 35.36Al 653.7Stan 4358.24例11-3设置对齐方式#include <iostream>#include <iomanip>using namespace std;int main(){ double values[]={1.23,35.36,653.7,4358.24}; char *names[]={"Zoot","Jimmy","Al","Stan"}; for(int i=0;i<4;i++)cout<<setiosflags(ios::left)<<setw(6)<<names[i] <<resetiosflags(ios::left) <<setw(10)<<values[i] <<endl;}输出结果:Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24例11-4控制输出精度#include <iostream>#include <iomanip>using namespace std;int main(){ double values[]={1.23,35.36,653.7,4358.24}; char *names[]={"Zoot","Jimmy","Al","Stan"}; cout<<setiosflags(ios::scientific);for(int i=0;i<4;i++)cout<<setiosflags(ios::left)<<setw(6)<<names[i]<<resetiosflags(ios::left)<<setw(10)<<setprecision(1) << values[i]<<endl;}输出结果:Zoot 1.2e+000 Jimmy 3.5e+001 Al 6.5e+002 Stan 4.4e+003进制⏹dec 、oct 和hex 操纵符设置输入和输出的默认进制。
⏹默认进制是dec (十进制)。
输出流文件输出流成员函数⏹输出流成员函数有三种类型:◆与操纵符等价的成员函数。
◆执行非格式化写操作的成员函数。
◆其它修改流状态且不同于操纵符或插入运算符的成员函数。
输出流文件输出流成员函数⏹open 函数把流与一个特定的磁盘文件关联起来。
需要指定打开模式。
⏹close 函数关闭与一个输出文件流关联的磁盘文件⏹put 函数把一个字符写到输出流中。
⏹write 函数把内存中的一块内容写到一个输出文件流中⏹seekp 和tellp 函数操作文件流的内部指针⏹错误处理函数在写到一个流时进行错误处理输出流例11-5向文件输出#include <fstream>using namespace std;struct Date{ int mondy, day, year; };int main(){Date dt = {6, 10, 92};ofstream tfile("date.dat",ios::binary); tfile.write((char *) &dt,sizeof dt);tfile.close();}二进制输出文件⏹默认的输出模式是文本方式⏹可以用二进制模式输出◆其中所写的字符不转换◆需要在打开文件时设置打开模式为:Ios_base::binary字符串输出流ostringstream⏹用于构造字符串⏹功能◆支持ofstream 类的除open 、close 外的所有操作◆str 函数可以返回当前已构造的字符串⏹典型应用◆将数值转换为字符串输出流例11-6 字符串输出流应用#include <iostream>#include <sstream>#include <string>using namespace std;template <class T>inline string toString(const T &v) {ostringstream os;//创建字符串输出流os << v;//将变量v 的值写入字符串流return os.str();//返回输出流生成的字符串}int main() {string str1 = toString(5);cout << str1 << endl;string str2 = toString(1.2);cout << str2 << endl;输出流输出结果:51.2输入流⏹重要的输入流类:◆istream类最适合用于顺序文本模式输入。