c++输入输出流及文件操作详解.ppt

上传人:小飞机 文档编号:6154060 上传时间:2023-09-30 格式:PPT 页数:88 大小:1.77MB
返回 下载 相关 举报
c++输入输出流及文件操作详解.ppt_第1页
第1页 / 共88页
c++输入输出流及文件操作详解.ppt_第2页
第2页 / 共88页
c++输入输出流及文件操作详解.ppt_第3页
第3页 / 共88页
c++输入输出流及文件操作详解.ppt_第4页
第4页 / 共88页
c++输入输出流及文件操作详解.ppt_第5页
第5页 / 共88页
点击查看更多>>
资源描述

《c++输入输出流及文件操作详解.ppt》由会员分享,可在线阅读,更多相关《c++输入输出流及文件操作详解.ppt(88页珍藏版)》请在三一办公上搜索。

1、第7章 输入输出流,7.1 流类和流对象,7.2 标准IO流和流对象,7.3 格式控制,7.4 文件处理,本 章 内 容-第一讲,1、输入输出流的含义 流类与流对象2、标准输入输出流标准IO流对象 IO流成员函数-get(),getline()与-put(),流状态及函数 clear(),good(),eof(),本 章 内 容-第二讲,3、文件流及文件操作 文件的概念 数据流动方向,文本文件与二进制文件 文件流类与文件流对象 文件的打开与关闭 打开方式 顺序读写/随机读写操作 文件指针文件操作成员函数,put,get(),getline(),read(),write(),第7章 输入输出流,

2、流(stream)表示信息从源到目的端的流动,负责建立数据生产者和消费者之间的联系,数据按顺序从一个对象传送到另一对象。,C+中把数据之间的传输操作称作”流”,I/O系统的任务就是在内存和外部设备之间稳定可靠 地传输数据和解释数据。程序中,对数据的输入/输出是以字节流实现的 应用程序对字节序列作出各种数据解释.C+的输入输出流是指由若干字节组成的字节序列 流中的内容可以是ASCII字符、图形图像、数字音频视频等形式的信息。,7.1 IO流,7.1 IO流,I/O流类库提供对象之间的数据交互服务 输出流Output stream:数据从内存传送到某个载体或设备中;输入流 Input stream

3、:数据从某个载体或设备传送到内存中;,_内存_,输入数据,输出数据,7.1.1 缓冲区,缓冲区buffer是内存中的一个临时存储区,用来匹配不同部件数据传输率的差异。通过使用缓冲的方式可以更高效地处理输入输出,信息从设备和程序之间传输时可临时存储在缓冲区中,等待累积成数据块或合适的事机再传送的目的地。,在C+中输入输出流被定义为类,I/O库中的类称为流类,编译系统提供了用于输入输出的iostream类库。流类中的常用类的继承层次关系,7.1.2 流类,(1)标准流 提供通用输入输出操作,作为其他I/O流基类 系统指定的标准设备的I/O操作。(2)文件流 以外存中的文件为对象进行输入和输出。以文

4、件为对象的输入输出,包括从磁盘文件输入数据,或将数据输出到磁盘文件。(3)字符串流 对内存中指定空间进行输入和输出。通常指定一个字符数组作为存储空间。,7.1.2 流类,iostream.h 包含操作所有输入/输出流所需的基本信息 istream.h,ostream.h iomanip.h 包含格式化I/O操纵算子,用于指定数据输入输出的格式 fstream.h 处理文件信息,包括建立文件,读/写文件的各种操作接口 每一种C+版本通常还包含其他一些与I/O相关的库,提供特定系统的某些功能,7.1.2 头文件,I/O流类库预定义了一批流对象,连接常用的外部设备.程序员可以定义所需的I/O流对象,

5、使用流库提供的工作方式实现数据传输。流类对象可以建立和删除,可从流中获取数据和向流添加数据。,7.1.3 流对象,istream cin,ostream cout,输入流对象,_内存_,输出流对象,7.2 标准流对象及常用成员函数,标准流对象是在std命名空间中定义的流对象,提供内存与常用外部设备进行数据交互功能。声明在头文件iostream,7.2.1 标准输出流,cout ostream 类的对象(console output)通常连向显示器,可以重定向(关联至文件)在输出流类中重载的一组公用成员函数,实现安全便捷的输出基本数据类型,输出自定义类型对象需要单独重载 ostream&oper

6、ator(基本类型标识符);cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据。,流插入运算符,标准错误流对象cerr(console error)标准错误流对象clog(console log的)作用都是在标准输出设备上显示出错信息,两个对象一般关联显示进行器输出。区别是 cerr不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时输出。,7.2.1 标准输出流,cerr“Zero encountered.“endl;,7.2.1 标准输出流,ostream类的公有成员函数,ostream,7.2.2 标准输入流,cinistream类

7、的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取符“”从流中提取数据。,7.2.2 标准输入流,cinistream类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取符“”从流中提取数据。在istream流类重载中的一组公用成员函数 istream&operator(基本类型标识符&);流提取符从流中提取数据时通常跳过输入流中的空格、tab键、换行符等空白字符。只有在输入完数据再按回车键后,该行数据才被送入键盘缓冲区,形成输入流,提取运算符才能从中提取数据。,istream类的公有成员函数,流插入运算符,可用于输入基本类型数据,也可重载用于输出和输入用户自定义的

8、数据类型,7.2.3 重载流插入和流提取运算符,重载函数形式:ostream 注意:只能将重载“”和“”的函数作为友元函数。,自定义类,class Array public:Array(int size=1);Array();int,例 为数组类重载流插入运算符和提取运算符,Array a(5);cin a;cout a;,6.3.4 重载流插入和流提取运算符,ostream,使用重载版本访问对象 cout a endl;,cout 的别名,istream,返回流类引用,符合原语义cin arr1 arr2;,cin 的别名,istream类的公有成员函数,7.2.4 输入流操作,int is

9、tream:get();/char c=cin.get();istream get.cpp,istream类的公有成员函数,7.2.4 输入流操作,istream其作用是从输入流中读取n-1个字符,赋给指定的字符数组,如果在读取n-1个字符之前遇到指定的终止字符,则提前结束读取。如果读取成功则函数返回非0值(真),如失败(遇文件结束符)则函数返回0值(假)。读取完成后,从流中删除该终止符。Get_getline.cpp,7.2.4 输入流操作,/字符串的输入 char ch120,ch220,ch320,ch420;cinch1;coutch1endl;cin.get(ch2,10);cout

10、ch2endl;cin.get(ch3,20);coutch3endl;cin.get(ch4,20,.);coutch4endl;,istream,istream类的公有成员函数,7.2.4 输入流操作,7.2.5 流错误状态,所有流都把流的状态存储在状态字中不同标志位中存储不同的错误状态位包含在类ios的enum成员中,ios 处理流错误状态的公有成员函数,7.2.4 流错误状态,运行程序,观测结果 grade.cpp streamstate.cpp,ios提供直接设置标志字的控制格式函数 iostream和iomanip库还提供控制符简化I/O格式化操作(自学内容),7.3 格式控制,i

11、os类格式化标志,格式化标志是类定义的枚举集合,用来指定输入输出格式化和操作的不同选择。该枚举类型定义:enum skipws,left,right,internal,dec,oct,hex,showbase,showpoint,uppercase,showpos,scientific,fixed,unitbuf,stdio;引用格式化标志:ios:格式化标志,7.3.1 设置标志字,状态标志 值 含义 输入/输出skipws 0X0001跳过输入中的空白Ileft 0X0002左对齐输出Oright 0X0004右对齐输出Ointernal 0X0008在符号位和基指示符后填入字符Odec

12、0X0010转换基制为十进制I/Ooct 0X0020转换基制为八进制I/Ohex 0X0040转换基制为十六进制I/Oshowbase 0X0080在输出中显示基指示符Oshowpoint 0X0100输出时显示小数点Ouppercase 0X0200十六进制输出时一律用大写字母Oshowpos 0X0400正整数前加“+”号Oscientific 0X0800科学示数法显示浮点数Ofixed 0X1000定点形式显示浮点数Ounitbuf 0X2000输出操作后立即刷新流Ostdio 0X4000输出操作后刷新stdout 和 stdreeO,ios 的标志常量,7.3.1 设置标志字,i

13、os 控制格式的函数,/例4 设置输出宽度#include void main()char*s=Hello;cout.fill(*);/置填充符 cout.width(10);/置输出宽度 cout.setf(ios:left);/左对齐 cout s endl;cout.width(15);/置输出宽度 cout.setf(ios:right,ios:left);/清除左对齐标志位,置右对齐 cout s endl;,#include void main()int a,b,c;cout a;cout b;cout c;cout Output in decimal:n;cout.setf(io

14、s:dec,ios:basefield);cout a=a b=b c=c endl;cout.setf(ios:hex,ios:basefield);cout Output in hexadecimal:n;cout a=a b=b c=c endl;cout.setf(ios:oct,ios:basefield);cout Output in octal:n;cout a=a b=b c=c endl;,/置八进制输出,/置十六进制输出,/置十进制输出,/置八进制输入,/置十进制输入,/置十六进制输入,例5 不同基数形式的输入输出,#include void main()double x=

15、22.0/7;int i;cout output in fixed:n;cout.setf(ios:fixed|ios:showpos);/定点输出,显示+for(i=1;i=5;i+)cout.precision(i);cout x endl;cout output in scientific:n;/清除原有设置,科学示数法输出 cout.setf(ios:scientific,ios:fixed|ios:showpos);for(i=1;i=5;i+)cout.precision(i);cout x*1e5 endl;,例6 格式化输出浮点数,控制符是istream和ostream类定义了

16、一批函数,作为重载插入运算符的右操作数 控制I/O格式,7.3.2 格式控制符,7.3.2 格式控制符,iostream几个常用的控制符,例7 不同基数形式的输入输出,cin dec a;,cin hex b;,cin oct c;,cout octa=a b=b c=cendl;,cout a=a b=b c=cendl;,cout hexa=a b=b c=cendl;,7.3.2 格式控制符,iomanip的控制符,常用控制符与成员函数,/例8 整数的格式化输出#include#include using namespace std;void main()const int k=618;

17、cout setw(10)setfill(#)setiosflags(ios:right)k endl;cout setw(10)setbase(8)setfill(*)resetiosflags(ios:right)setiosflags(ios:left)k endl;,#include void main()double x=22.0/7;int i;cout output in fixed:n;cout.setf(ios:fixed|ios:showpos);/定点输出,显示+for(i=1;i=5;i+)cout.precision(i);cout x endl;cout outpu

18、t in scientific:n;/清除原有设置,科学示数法输出 cout.setf(ios:scientific,ios:fixed|ios:showpos);for(i=1;i=5;i+)cout.precision(i);cout x*1e5 endl;,例9 格式化输出浮点数,cout setiosflags(ios:fixed|ios:showpos);,cout resetiosflags(ios:fixed|ios:showpos)setiosflags(ios:scientific);,cout setprecision(i)xendl;,coutsetprecision(i

19、)x*1e5endl;,7.4 文件处理,ifstream、ofstream 和 fstream 类 用于内存与文件之间的数据传输,7.4 文件处理,数据的层次结构 Bit Byte Field Record File-DBMS,C+把文件看成有序的字节流,提供低级和高级的IO功能 编码方式:文本文件/二进制文件 存取方式:顺序读写文件/随机读写文件,文件的概念 存储在外部介质中的数据集合称为文件.,-内存-,ifstream fin,fstream finout,ofstream fout,读文件,写文件,读/写文件,10.5.1 文件和流,7.4.1 文件和流,文件流的概念 文件流是以外存

20、文件为输入输出对象的数据流,文件,7.4.1 文件和流,文件字节序号,文件结束符,文件长度=n,文件流的概念 文件流是以外存文件为输入输出对象的数据流 输出文件流:从内存流向磁盘文件的数据 输入文件流:从磁盘文件流向内存的数据 每个文件流都有一个内存缓冲区与之对应,文件对象,内存对象,ifstream fin,读文件,2 4 3 7 8,int a,b;fin a b;,10.5.3 文本文件,a 0X00f3,b 0X004e,7.4.1 文件和流,输入文件流对象,文件,写文件,10.5.3 文本文件,a 0X00f3,b 0X004e,7.4.1 文件和流,文件,int c;c=a+b;f

21、out c=c endl;,ofstream fout,c 0X0141,C=3 2 1,7.4.1 文件和流,streamclass fileObj(fileName,openMode);fileObj.open(fileName,openMode);,文件操作的基本步骤:打开文件读/写文件 关闭文件,get(),getline(),read(),fileObj.close();,7.4.2 打开和关闭文件,打开文件 建立文件流对象;流对象与磁盘文件关联;指定文件的打开方式 关闭文件 解除流对象与磁盘文件关联,1.打开文件,方法1 调用流类带参数的构造函数,建立流对象时连接外部文件流类 对象

22、名(文件名,方式);egifstream infile(datafile.dat,ios:in);ofstream outfile(d:newfile.dat,ios:out);,ifstream、ofstream 或 fstream,1.打开文件,方法2 先建立流对象,再调用fstream:open()函数连接外部文件流类 对象名;对象名.open(文件名,方式);,ifstream、ofstream 或 fstream,打开(创建)一个文件newfile.dat,准备写:ofstream outfile;/建立输出文件流对象 outfile.open(d:newfile.dat,ios:o

23、ut);,打开一个已有文件datafile.dat,准备读:ifstream infile;/建立输入文件流对象 infile.open(“datafile.dat”,ios:in);,open 函数原型,void open(const char*,int mode,int=filebuf:openprot);,1.打开文件,参数分别表示:文件名,文件的打开方式,文件的访问方式,egifstream infile(datafile.dat,ios:in);ofstream outfile(d:newfile.dat,ios:out);fstream rwfile(myfile.dat,ios:

24、in|ios:out);ofstream ofile(a:binary,ios:binary|ios:app);,用或运算符“|”连接两个表示打开方式的标识常量,1.打开文件,打开一个二进制文件进行追加操作,2.关闭文件,关闭文件操作包括把缓冲区数据完整地写入文件,添加文件结束标志,切断流对象和外部文件的连接当一个流对象的生存期结束,系统也会自动关闭文件;若流对象的生存期没有结束,用close()关闭文件后,该流对象可以重用,eg:ofstream ofile;/创建输出文件流 ofile.open(myfile1);/ofile流与文件“myfile1”相关联/访问文件“myfile1”of

25、ile.close();/关闭文件“myfile1”ofile.open(“myfile2”);/重用对象ofile,等价于使用构造函数:ofstream ofile(myfile1);,2.关闭文件,close()函数关闭文件但流对象仍然存在,3打开与关闭错误,if(!outfile)/outfile.open(“myfile2.dat”)cerr”ereor:unable to open file2!”;,检测文件是否成功打开,可在条件表达式中使用取反操作符(!)测试流状态,为了测试成功关闭文件,可以调用fail()函数,如,myfile2.close();if(myfile2.fail(

26、)cerr”Error to close myfile2!;”,使用流的磁盘文件I/O,File,Memory,ifstream,INPUT,get(),read(),OUTPUT,put(),write(),磁盘文件,目的地,源,ofstream,7.4.3 文本文件,文本文件 文件的每个字节都是用ASCII代码存放数据,即每个字节存放一个字符,这种文件又称字符文件 文件的默认打开方式为文本文件 文本文件是顺序存取文件 文本文件本身没有记录逻辑结构,通常一个逻辑记录用换行符分隔;数据项之间可以用空白符、换行符、制表符等分隔。,7.4.3 文本文件,使用完成文件读写 向文本文件中写入数据,并从

27、文件中读出数据 file1.cpp 练习:改写程序,将新的数据追加写入文件中 file2.cpp使用get(),put()完成文件读写 练习:将已有文件的内容复制到新的文件中 file3.cpp,#include#include void main()ofstream out(“test);if(!out)cout cannot open file.;return;out 10 123.45;out nThis is a short text file.;out.close();,例 将数据写入到文件 file1.cpp,对数值常量转换成字符,#include#include void mai

28、n()char ch;int i;float f;char str1 10,str2 10;ifstream in(test);if(!in)cout i f ch str1 str2;cout i“”f“”ch n;cout str1 str2 endl;in.close();,ifstream in,10.5.3 文本文件,例 从文件 读出数据 file1.cpp,#include#include void main()char ch;int i;float f;char str1 10,str2 10;ifstream in(test);if(!in)cout i f ch str1 s

29、tr2;cout i“”f“”ch n;cout str1 str2 endl;in.close();,int i 10,float f 123.45,char ch T,char str1 his,char str2 is,ostream cout,ifstream in,例 从文件 读出数据 file1.cpp,#include#include void main()ifstream f1(test);if(!f1)cout cannot open test for input.;return;ofstream f2(testnew);if(!f2)cout cannot open tes

30、tnew for ouput.;return;char ch;while(f1.get(ch)f2.put(ch);f1.close();f2.close();cout It is over!n;,ifstream f1,ofstream f2,10.5.3 文本文件,例 复制数据到文件 将文件test的内容复制到new 中,ch,7.4.3 文本文件,格式化文件读写-运算符字符的文件读写-get(),put()字符串文件写-get(),getline()无格式文件读写-read(),write(),无格式化提取操作成员函数:,istream,作用:从文本中提取指定个数的字符,在串数组末添加一

31、个空字符,示例 file4.cpp 向文件写入字符串,并从文件中读出多行文本,ostream 类中操作字节数据的成员函数,ostream 向流插入 buf 对象的由第二个参数指定数目的字节数据,文件无格式读写函数,istream 类中操作字节数据的成员函数,istream 从流中提取 n 个字节数据,更新对象 buf,ostream 类中写入字节数据的成员函数,ostream 向流插入 buf 对象的由第二个参数指定数目的字节数据,ofstream outf(test.dat);char str10=“Hello!”;outf.write(str,10);int a10=1,2,3,4,5;f

32、or(int i=0;i 10;i+)outf.write(char*)(,outf.write(reinterpret_cast(a),10*sizeof(int);,注意类型转换,文件读写练习 binaryFile 多条学生的记录包括学号、姓名和成绩等信息:输入多个学生记录 按格式化的方式将学生记录写入文本文件中 writeStu(Stu*s,int n,ofstream,7.4.4 二进制文件,二进制文件以基本类型数据在内存的二进制表示形式 存放数据,不对写入或读出的数据做格式转换;打开二进制文件用ios:binary方式;可以即为输出又为输入文件。二进制文件的读写方式由程序控制,常用随

33、机读写操作,示例:文件指针的移动与重新定位read_write.cpp,文件的顺序读写,文件结束,ios:beg,ios:cur,ios:end,ios:seek_dir 值:cur相对于当前读指针所指定的当前位置beg相对于流的开始位置end相对于流的结尾处enum ios:seek_dir beg=0;cur=1,end=2;,ios:beg,ios:cur,ios:end,ios:seek_dir 值:cur相对于当前读指针所指定的当前位置beg相对于流的开始位置end相对于流的结尾处enum ios:seek_dir beg=0;cur=1,end=2;,文件的随机读写,istream

34、 读指针从流的seek_dir位置移动 off 指定字节,istream 类操作流读指针的成员函数,10.5.4 二进制文件,7.4.4 二进制文件,istream 返回读指针当前所指位置值,Eg:istream input;input.seekg(-10,ios:cur);/读指针以当前位置为基准,向前移动 10 个字节,10.5.4 二进制文件,istream 类操作流读指针的成员函数,7.4.4 二进制文件,Eg:istream input;,input.seekg(10,ios:beg);/读指针从流的开始位置,向后移动 10 个字节,函数 seekg(n);等价 seekg(n,io

35、s:beg);,10.5.4 二进制文件,istream 类操作流读指针的成员函数,7.4.4 二进制文件,Eg:istream input;,input.seekg(-10,ios:end);/读指针从流的结尾,向前移动 10 个字节,istream 类操作流读指针的成员函数,7.4.4 二进制文件,Eg:istream input;long pos=input.tellg();/获取当前位置指针 input number;/读入一个整数,指针后移 4 字节 input.seekg(pos);/指针返回原来位置 input number;/重读该整数,i-1 i i+1,10.5.4 二进制

36、文件,200311,7.4.4 二进制文件,istream 类操作流读指针的成员函数,ostream 返回写指针当前所指位置值,ostream 类操作流写指针的成员函数,10.5.4 二进制文件,7.4.4 二进制文件,文件读写练习 binaryFile 多条学生的记录包括学号、姓名和成绩等信息:(1)输入多个学生记录(2)按二进制方式写到文件中:(3)从文件中读出成绩并求平均值;(4)对文件中按成绩排序再写回文件中.(5)查找一条学生记录,修改其中的属性.,模拟一个书店的销售账目 能够添加、删除书目,根据进货和销售数目更新库存数。账目结构:包含书号(TP)、书名(bookName)和库存量(

37、blance)。功能菜单:选择14分别调用函数Append(入库)、Sale(销售)、Inquire(查询)和CreateTxt(建立文本),选择0退出系统。,案例:简单事务处理应用程序,main函数打开文件booksFile.dat,通过流类参数,把流对象iof传递给各函数。文件流的读/写指针在字节流中移动,实现读/写操作。为建立格式化文本文件,用文本流的写方式打开booksFile.txt。文本流对象ftxt把从二进制文件读出的记录格式化地写入文本文件。BookSystem,简单事务处理应用程序,小组项目开发 1 图书馆管理系统定义类及其关系:Book,Reader,Manager,Dat

38、e等2.管理员拥有对图书信息的录入,查询,修改,增添与删除等权限;3.读者拥有查询图书和借阅历史的功能;4.用文件记录图书和用户信息;,小组项目开发2 试卷自动测验系统系统教师发布试题和标准答案,实现自动批阅试卷、成绩登记功能。并能查阅和统计得分情况。学生答题后察看自己得分情况。,要求:合理设计类及其关系,实现友好的交互界面,用文件相关信息,小组项目开发3 简单银行账户管理系统开发银行账户管理系统,实现增添账户,查询账户记录(余额及历史记录),存取款后修改余额等功能。普通用户可以进行自助查询,管理员可增删账户及存取款、转账及查询等操作。,要求:每组选择一个题目,6月14日前提交实验报告(电子版

39、)和实现代码,将压缩包上传到FTP上,报告中请给出规范额完整的UML类图,设计书,运行结果,分工及总结。,流对象是内存与文件(或字符串)之间数据传输的信道。数据流本身没有逻辑格式。数据的解释方式由应用程序的操作决定。流类库提供了格式化和非格式化的I/O功能。文本流I/O提供内存基本类型数据与文本之间的格式转换。处理用户定义的文件I/O要用文件流对象。,小结,根据代码方式分为文本文件和二进制文件,根据数据存取方式分为顺序存取文件和随机存取文件。文件操作的三个主要步骤是:打开文件;读/写文件;关闭文件流。文件的性质由打开文件的方式决定。移动流指针,可以对文件的任意位置进行读/写操作。,小结,文件读写作业 1.学生信息管理程序 一条学生的记录包括学号、姓名和成绩等信息,要求进行如下读写操作:(1)格式化输入多个学生记录;(cin,getline)(2)以清晰的格式写到文件stu.txt中;(cout,put()(3)按二进制方式写到文件stu.dat中;(write)writeStu(Stu s,ostream(5)对文件中按学号排序再写回文件中.(6)在文件中查找某个学生的信息,修改成绩并重新写入文件,建立一个文本文件,文件名由用户自定义,该文件包含学生学号、姓名、成绩。,文件名,学生记录,读文本文件。在屏幕显示学生记录,并显示最高分数、最低分数和平均分数。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号