流类库与输入输出
C第10章流类库和输入输出PPT课件

cout的重定向(*)
#include <iostream> using namespace std; int main() { cout<<"SEU\n"; cerr<<"NJU\n"; clog<<"PKU\n"; return 0; } //命令行方式下运行 **.exe >>**.txt
中插入一个字符序列。
重载插入和提取运算符
• 插入和提取运算符只能重载为类的友元函数 • 提取运算符重载格式:friend
istream&operator>>(istream&,className &);
• 插入运算符重载格式:friend
ostream&operator<<(ostream&,className &);
第10章 流类库和输入输出
本章要点
10.1 C++的基本流类体系
basic_ ios
basic_ streambuf
指针
basic_ istream
basic_ ostream
basic_ ifstream
basic_ iostream basic_ ofstream
basic_ fstream
else{ s.putback(c); //无括号,返回一个字符到输入缓冲区 s>>re; } //实数 if(s)a=Complex(re,im); return s;}
提取运算符重载:复数类
第11章流类库与输入输出

iomanip.h fstream.h
包含格式化I/O操纵符,用于指定数据输入输出的格式 处理文件信息,包括建立文件,读/写文件的各种操作接口
每种C++版本还包含其他一些与I/O相关的库,提供特定系统的某些功能
2
标准流和流操作
10.2.1 标准流
// 例11-1 重定向的演示 #include<iostream.h> cerr的输出 void fn( int a, int b ) { if ( b==0 ) cerr<<"Zero encountered. The message cannot be redirected.\n" ; else cout<<a<<'/'<<b<<'='<<a/b<<endl; } void main() { int m, n ; cout<<"one:\n"; cin>>m>>n; fn ( m, n ) ; cerr<<"two:\n"; fn ( 20, 0 ) ; }
10.2.1 标准流
// 例11-1 重定向的演示 不能重定向 #include<iostream.h> void fn( int a, int b ) { if ( b==0 ) cerr<<"Zero encountered. The message cannot be redirected.\n" ; else 可以重定向 cout<<a<<'/'<<b<<'='<<a/b<<endl; } void main() { int m, n ; cout<<"one:\n"; cin>>m>>n; fn ( m, n ) ; cerr<<"two:\n"; fn ( 20, 0 ) ; }
《C++程序设计》电子教案第10章 流类库与输入输出

C++中所有流都是相同的 , 但文件可以不同 。 中所有流都是相同的, 但文件可以不同。 中所有流都是相同的 使用流以后, 使用流以后 , 程序用流统一对各种计算机设备 和文件进行操作,使程序与设备、 和文件进行操作 , 使程序与设备 、 程序与文件 无关,从而提高了程序设计的通用性和灵活性。 无关 , 从而提高了程序设计的通用性和灵活性 。 也就是说, 也就是说 , 无论与流相联系的实际物理设备差 别有多大,流都采用相同的方式运行。 别有多大 , 流都采用相同的方式运行 。 这种机 制使得流可以跨越物理设备平台, 制使得流可以跨越物理设备平台 , 实现流的透 明运作,而与实际的物理设备无关。例如, 明运作 , 而与实际的物理设备无关 。 例如 , 往 显示器上输出字符和向磁盘文件或打印机输出 字符,尽管接受输出的物理设备不同, 字符 , 尽管接受输出的物理设备不同 , 但具体 操作过程是相同的。 操作过程是相同的。
返回本节
10.2 格式化 格式化I/O
10.2.1 10.2.2 10.2.3 10.2.4 ios类中的枚举常量 类中的枚举常量 使用ios成员函数 使用 成员函数 使用I/O操作符 使用 操作符 检测流操作的错误
返回首页
10.2.1 ios类中的枚举常量 类中的枚举常量
在根基类ios中定义有三个用户需要使用的枚举类型, 在根基类 中定义有三个用户需要使用的枚举类型,由 中定义有三个用户需要使用的枚举类型 于它们是在公用成员部分定义的, 于它们是在公用成员部分定义的,所以其中的每个枚举类 型常量在加上ios::前缀后都可以为本类成员函数和所有外 型常量在加上 前缀后都可以为本类成员函数和所有外 部函数访问。 部函数访问。 在三个枚举类型中有一个无名枚举类型, 在三个枚举类型中有一个无名枚举类型,其中定义的每个 枚举常量都是用于设置控制输入输出格式的标志使用的。 枚举常量都是用于设置控制输入输出格式的标志使用的。 该枚举类型定义如下: 该枚举类型定义如下: enum { skipws,left,right,internal,dec,oct,hex,sh owbase,showpoint, uppercase,showpos,scientific,fixed,unitbuf, stdio };
C++程序设计(第二版)第9章流类库与输入输出

9.3.3-1 标准输入流成员函数
函数原型 istream& getline(char* buf,int nCount,char delim=’\n’)
9.2.2 标准流对象
四个流对象均是文 本流对象,主要工 作是完成程序中的 数据与外部设备的 传输及数据格式的 转换。
键盘 istream cin
显示器 ostream cout
程序
9.3 标准设备的输入/输出
9.3.1 输入流 9.3.2 输出流 9.3.3 标准输入/输出函数成员 9.3.4数据流的错误检测
9.1 流的概念
C++语言本身并不包含输入输出功能,但C++标准库提 供了一系列输入输出流类,通过流类完成数据的输入输出。
在C++中,将数据从一个对象到另一个对象的传输抽象为 “流”。从流中获取数据的操作称为提取操作,向流中添 加数据的操作称为插入操作,数据的输入与输出就是通过 I/O流来实现的。
9.3.1 输入流
istream 类提供了格式化和非格式的输入功能。常用的 输入方法是在标准输入流对象cin上使用提取运算符”>>”。 从与键盘相连的标准输入流cin中提取数据并赋值给相应的 对象,提取运算符返回cin流对象的引用,因此提取运算符 可以连用。
cin>>变量名1>>变量名2…>>变量名n; 数据的提取是从输入回车开始的,提取运算符忽略了流 中的空格、制表符、Enter键等空白字符。
9.3.1 输入流
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函数在读⼊数据时可以包括空⽩字符,⽽后者不可以。
流类库与输入输出

广义文件 (标准设备、磁盘文件)
程序实现
系统实现
※
C++的流类体系
抽象类、虚析构 I/O格式、错误处理 指针成员
管理流 缓冲区
basic_ios
全局对象cin
basic_streambuf
全局对象cout、 cerr、clog
basic_istream
标准设备I/O
basic_ ostream
重载<<、>>运算符
第9章 流类库与输入输出(3)
1、C++中流的概念及流类体系
2、标准设备的输入输出
3、文件的输入输出
4、文件与对象
1、C++中流的概念及流类体系
※
流(stream)的概念
数据从一个对象到另一个对象的流动 抽象:实现数据流动的接口(流)
输入输出流类库(封装流对象)
输出 程序 (内存)
输入
流 (对象)
#include<iostream>
提示:自学了解basic_ios提供的格式化输入输出控制及其 一般使用方法
2、标准设备的输入输出
※
输入输出健壮性的控制*(了解)
basic_ios中定义了流操作状态及针对状态的操作函数,
用以对输入输出状态进行监控。
※
istream中的部分成员
int istream::get(); //提取一个字符,包括空格等 istream&istream::get(char &); istream&istream::get(unsigned char &);
istream&istream::get(char *,int,char=‟\n‟); istream&istream::get(unsigned char *,int,char=‟\n‟); istream&istream::getline(char *,int,char=‟\n‟); istream&istream::getline(unsigned char *,int,char=‟\n‟);
第十一章 流类库与输入输出

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类重载了操作符“<<”(插入),用它可以进行基本数据类型数据的输出操作。
第12章流类库和输入输出概论

第12章流类库和输入输出【内容提要】流的概念及流类库输入输出的格式控制输入与输出运算符的重载文件操作【重点与难点】12.1 流的概念及流类库12.1.1 流的概念C++中的流是指数据从一个对象传递到另一个对象的操作。
从流中读取数据称为提取操作,向流内添加数据称为插入操作。
流在使用前要建立,使用后要删除。
如果数据的传递是在设备之间进行,这种流就称为I/O流。
C++专门内置了一些供用户使用的类,在这些类中封装了可以实现输入输出操作的函数,这些类统称为I/O流类。
C++流预定义了4个标准流类对象,它们可以直接用来输入输出。
这些标准流类对象都包含在头文件iostream.h中。
istream cin; //与标准输入设备相关联的标准输入流。
ostream cout; //与标准输出设备相关联的标准输出流。
ostream cerr; //与标准错误输出设备相关联的非缓冲方式的标准输出流。
ostream clog; //与标准错误输出设备相关联的缓冲方式的标准输出流。
12.1.2 流类库C++的流类库有两个平行的基类streambuf和ios,其它的流类都是从这两个基类直接或间接派生的。
使用这些流类库时,必须包含相应的头文件。
ios类及其派生类为用户提供了使用流类的接口。
以下给出ios类及其派生类的层次结构图。
iosistreamifstreamistream_withassign iostreamistrstream fstreamostream strstreamofstream sdiostreamostream_withassignostrstream图12.1 ios类的层次关系12.2 输入输出的格式控制C++仍可使用C中的printf()和scanf()进行格式化控制,同时又提供了两种格式化控制的方法,一是使用ios类中的有关格式控制的成员函数,二是使用执行格式化输入/输出的格式控制符。
12.2.1 用ios类的成员函数进行格式控制使用这种方式进行格式控制主要是通过设置及清除格式状态标志、设置域宽、设置填充字符和设置输出精度的操作来完成的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三、文件输入输出
ASCII文件与二进制文件
ASCII文件提供了高级的输入输出功能,把若干个字节转换为一个有意 义的单位,然后以ASCII字符形式输入输出 二进制文件提供低级的输入输出功能,这种输入输出不经过转化,因此 效率较高,传输速度快,效率高
四、字符串流
将一组数据保存在字符数组中
using namespace std; struct student {int num; char name[20]; float score; } int main( ) {student stud[3]={1001,″Li″,78,1002,″Wang″,89.5,1004,″Fun″,90}; char c[50]; //用户定义的字符数组 ostrstream strout(c,50); //建立输出字符串流,与数组c建立关联,缓冲区长 30 for(int i=0;i<3;i++) //向字符数组c写3个学生的数据
c.将文件流与新文件重新关联: ifstream infile(“in”); infile.close(); infile.open(“next”);
东南大学软件学院(苏州 东南大学软件学院 苏州 ) C++程序设计 程序设计
三、文件输入输出
1. 对ASCII文件的操作 #include <fstream> using namespace std; int main( ) {int a[10]; ofstream outfile(″f1.dat″,ios::out); if(!outfile) {cerr<<″open error!″<<endl; exit(1); } cout<<″enter 10 integer numbers:″ <<endl; for(int i=0;i<10;i++) {cin>>a[i]; outfile<<a[i]<<″ ″;} outfile.close(); return 0; } #include <fstream> int main( ) {int a[10]; ifstream infile(″f1.dat″,ios::in|ios::noc reate); if(!infile) {cerr<<″open error!″<<endl; exit(1); } for(i=0;i<10;i++) {infile>>a[i cout<<a[i]<<″ “;} infile.close(); return 0; }
流类库与输入输出操作
东南大学软件学院(苏州 东南大学软件学院 苏州 ) C++程序设计 程序设计
四、字符串流
istrstream;由istream派生而来,从内存空间读取数据
字符串流类
ostrstream;由oftream派生而来,将数据流向内存空间 strstream;由oftream派生而来,向内存空间读写数据
东南大学软件学院(苏州 东南大学软件学院 苏州 ) C++程序设计 程序设计
三、文件输入输出
2. 对二进制文件进行读写 2.1 利用成员函数read和write读写二进制文件 istream .read(char *buf,int len) ostream .write(char *buf,int len) 2.2 与文件指针有关的流成员函数 成员函数 gcount() tellg() seekg(文件中位置) tellp( ) seekp(文件中的位置) 作用 返回最后一个输入所读入的字节数 返回输入文件指针当前的位置 将文件指针移到指定的位置 返回输出文件指针当前的位置 将输出文件指针移动到指定的位置
东南大学软件学院(苏州 东南大学软件学院 苏州 ) C++程序设计 程序设计
二、标准输入输出流
有一元二次方程ax2+bx+c=0,其一般解为x1,2=(-b±b2-4ac)/2a,但若 a=0,或b2-4ac<0时,用此公式出错。
#include <iostream> #include <cmath> using namespace std; int main( ) {float a,b,c,disc; cout<<″please input a,b,c:″; cin>>a>>b>>c; if (a==0)cerr<<″a is equal to zero,error!″<<endl; else if ((disc=b*b-4*a*c)<0) cerr<<″disc=b*b-4*a*c<0″<<endl; else { cout<<″x1=″<<(-b+sqrt(disc))/(2*a)<<endl; cout<<″x2=″<<(-b-sqrt(disc))/(2*a)<<endl;} return 0; }
三、文件输入输出
1.打开磁盘文件
方式一 ofstream outfile; outfile.open(″f1.dat″,ios::out); 方式 ios:out ios:in ios:app ios:ate ios:trunc ios:binary ios:nocreate ios:::in|ios::binary ios:in|ios:out 方式二 ofstream outfile(“f.dat”,”ios:out”); 作用 以输出方式打开文件 以输入方式打开文件 以输出方式打开文件,写的数据添加到末尾 打开一个已有文件,直接定位到末尾 打开一个文件,如果已经存在删除数据 已二进制形式打开一个文件 打开一个文件,如果不存在打开失败 以二进制输入方式打开二进制文件 以输入输出方式打开一个文件
东南大学软件学院(苏州 东南大学软件学院 苏州 ) C++程序设计 程序设计
三、文件输入输出
现有一批学生数据存储于(stuInfo.txt),数据成员包括(学号、姓名 性别),要求输入一条学生信息,写入文件后,显示其他所有学生的信息
东南大学软件学院(苏州 东南大学软件学院 苏州 ) C++程序设计 程序设计
东南大学软件学院(苏州 东南大学软件学院 苏州 ) C++程序设计 程序设计
三、文件输入输出
2.文件有效性检查及关闭
a.有效性检查: if(!infile){ cerr<<“error:unable to open input file”; exit(1) } b.关闭文件: infile.close();
二、标准输入输出流
标准输入输出流
cin:标准输入 istream类的对 象用来处理标准 输入,即键盘输 入。
cout:标准输出 ostream类的对 象,用来处理标 准输出,即屏幕 输出。
cerr:标准输出 ostream类的对 象,用来处理标 准出错信息,不 带缓冲区,发给 它内容立即输出
clog:标准输出 ostream类的对 象,用来处理标 出错信息,带缓 区,缓冲区满时 被输出
东南大学软件学院(苏州 东南大学软件学院 苏州 ) C++程序设计 程序设计
格式控制) 二、标准输入输出(格式控制 标准输入输出 格式控制
#include <iostream> 1.使用控制符控制格式 #include <iomanip>//不要忘记包含此头文件 using namespace std; int main()控制符 作用 {int a; dec 以十进制输出 cout<<″input a:″; 以十六进制输出 cin>>a; hex cout<<″dec:″<<dec<<a<<endl; //以十进制形式输出整数 oct 以八进制输出 cout<<″hex:″<<hex<<a<<endl; //以十六进制形式输出整数a setbase(n) 以n进制形式输出(n的取值,8,10,16) cout<<″oct:″<<setbase(8)<<a<<endl; //以八进制形式输出整数a setfill(c) 设置填充符c, c可以是常量或变量 char *pt=″China″; //pt指向字符串″China″ cout<<setw(10)<<pt<<endl; //指定域宽为10,输出字符串 setw(n) 设置字段宽度为n位 cout<<setfill(′*′)<<setw(10)<<pt<<endl; //指定域宽10,输出字符 setiosflags(ios:left) 输出数据左对齐 double pi=22.0/7.0; //计算pi值 setiosflags(ios:fixed) 设置浮点以固定的小数位数显示 cout<<setiosflags(ios::scientific)<<setprecision(8);//按指数形式输出, cout<<″pi=″<<pi<<endl; //输出pi值 setiosflags(ios:showpos) 输出时正数给出”+” cout<<″pi=″<<setprecision(4)<<pi<<endl; //改为4位小数 cout<<″pi=″<<setiosflags(ios::fixed)<<pi<<endl;//改为小数形式输出 注意:这些控制符号都在iomanip头文件中,使用时应在程序中包含相关 return 0; 头文件 }