1、C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中基本概念基本概念 基本基本I/O流类流类 重载提取和插入运算符重载提取和插入运算符文件文件 教教 学学 内内 容容 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术
2、学院 徐振中 输入输入/ /输出输出(I/O):程序与外设之间的数据交换。):程序与外设之间的数据交换。 输入输入:程序从外设接收:程序从外设接收字节序列字节序列并转换为指定格式数据。并转换为指定格式数据。 输出输出:程序将数据转换为:程序将数据转换为字节序列字节序列输出到外设。输出到外设。 C/C+ 语言没有专门语言没有专门的的 I/O 语句。语句。 C 语言的编译系统提供语言的编译系统提供 I/O 函数库,支持函数库,支持 I/O 操作。操作。 C+ 语言的编译系统提供语言的编译系统提供 I/O 类库,支持类库,支持 I/O 操作。操作。 C+语言程序设计语言程序设计 第十三章第十三章 输
3、入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.1 基本概念基本概念 13.1.1 字节流字节流 字节流字节流 数据的字节序列。数据的字节序列。 字符流字符流(文本流)(文本流) 二进制流二进制流 将字节流的每个字节按将字节流的每个字节按ASCII码字符解释。码字符解释。 缺点缺点:在数据传输时需作转换,效率低。:在数据传输时需作转换,效率低。 优点优点:因:因ASCII码是标准的,故字符流可直接编码是标准的,故字符流可直接编 辑、显示和打印,通行于各类计算机。辑、显示和打印,通行于各类计算机。 源程序文件和文本文件都是。源程序文件和文本文件都是。 将字节流的每
4、个字节按二进制数解释。将字节流的每个字节按二进制数解释。 优点优点:在数据传输时不做转换,效率高。:在数据传输时不做转换,效率高。 缺点缺点:因二进制数据在各类计算机中的存放格式:因二进制数据在各类计算机中的存放格式 有差异,故其可移植性差,且难以阅读。有差异,故其可移植性差,且难以阅读。 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.1 基本概念基本概念 13.1.2 文件文件 文件:文件:相关数据的字节序列集合。相关数据的字节序列集合。 程序、数据、文档常以文件形式存于外存。程序、数据、文档常以文件形式存于
5、外存。 输入输入/输出设备具有字节流特征,也是文件。输出设备具有字节流特征,也是文件。 如:如:键盘是输入文件,显示器、打印机是输出文件。键盘是输入文件,显示器、打印机是输出文件。 不同的文件所允许的操作可能不同。不同的文件所允许的操作可能不同。 如:如:磁盘文件可写入磁盘文件可写入/取出;打印机文件只能写入。取出;打印机文件只能写入。 文件名:文件名:为文件取的名字,以别于其它文件。为文件取的名字,以别于其它文件。 程序可通过文件名来使用文件。程序可通过文件名来使用文件。 文件名通常使用标识符。文件名通常使用标识符。 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制
6、作:制作:山东经济学院计算机科学与技术学院 徐振中13.1 基本概念基本概念 13.1.3 缓冲缓冲 缓冲区缓冲区:系统在内存中开辟的、用来临时存放输入系统在内存中开辟的、用来临时存放输入/输出数输出数 据的区域。据的区域。 缓冲区的作用:缓冲区的作用:提高提高CPU的使用效率。的使用效率。 I/O 流分为缓冲流和非缓冲流。流分为缓冲流和非缓冲流。 缓冲流:缓冲流:仅当缓冲区满或当前送入的数据为新的一行字仅当缓冲区满或当前送入的数据为新的一行字 符时,才做处理(称为刷新)。符时,才做处理(称为刷新)。 较常用较常用。 非缓冲流:非缓冲流:一旦数据送入缓冲区,立即处理。一旦数据送入缓冲区,立即处
7、理。 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.2 基本基本I/O流类流类 C+ 的的 I/O 操作是以操作是以流流的形式实现的。在数据从一个对的形式实现的。在数据从一个对 象流动到另一个对象的过程中,无论是否对数据进行缓象流动到另一个对象的过程中,无论是否对数据进行缓 冲或对数据进行格式变换,这种流动都被抽象为冲或对数据进行格式变换,这种流动都被抽象为流流(程(程 序员与程序所访问的
8、设备之间的一个统一的接口,使程序员与程序所访问的设备之间的一个统一的接口,使程 序的输入输出设计尽可能地与具体设备无关)。序的输入输出设计尽可能地与具体设备无关)。 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.2 基本基本I/O流类流类 流在使用前要被建立,在使用后要被删除,使用特定的操流在使用前要被建立,在使用后要被删除,使用特定的操 作能从流中获取数据或向流中添加数据。从流中获取数据作能从流中获取数据或向流中添加数据。从流中获取数据 操作称为操作称为提取提取操作,向流中添加数据的操作称为操作,向流中添加数
9、据的操作称为插入插入操作。操作。 C+ 系统提供了一个用于输入系统提供了一个用于输入/输出操作的类体系:输出操作的类体系: 类体系提供了对预定义类型进行输入类体系提供了对预定义类型进行输入/输出操作的能力;输出操作的能力; 程序员可利用这个类体系进行自定义类型的程序员可利用这个类体系进行自定义类型的I/O出操作。出操作。 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中类类 istream 和和 ostream 的公有派生类,的公有派生类, 并未增加新成员,支持输入和输出操作。并未增加新成员,支持输入和输出操作。 类类
10、 ios 的公有派生类,的公有派生类, 提供输入操作。提供输入操作。类类 ios 的公有派生类,的公有派生类, 提供输出操作。提供输出操作。虚基类虚基类提供流的格式化提供流的格式化I/O和出错处理,和出错处理, 并通过指向类并通过指向类streambuf的对象的的对象的 指针成员来管理流缓冲区。指针成员来管理流缓冲区。 提供对流的提供对流的 缓冲支持。缓冲支持。 对文件进对文件进行提取和行提取和插入操作插入操作 对文件进对文件进行提取和行提取和插入操作插入操作 对文件进对文件进行提取和行提取和插入操作插入操作 对文件进对文件进行提取和行提取和插入操作插入操作 对文件进对文件进行提取和行提取和插
11、入操作插入操作 从序列中从序列中取字符或取字符或将字符放将字符放入序列中入序列中 13.2 基本基本I/O流类流类 公共基类公共基类 公共基类公共基类 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.2 基本基本I/O流类流类 13.2.1 预定义的标准流对象预定义的标准流对象 预定义的标准流对象:预定义的标准流对象:cin、cout、cerr、clog。 cin 为标准输入流对象,为标准输入流对象,用来处理标准输入即键盘输入用来处理标准输入即键盘输入。 cout为标准输出流对象,为标准输出流对象,用来处理标准输
12、出即屏幕输出用来处理标准输出即屏幕输出。 cerr为标准错误输出为标准错误输出流对象流对象,无缓冲。,无缓冲。 clog为标准错误输出为标准错误输出流对象流对象,有缓冲。,有缓冲。 例例:cout 是是 ostream 流类的对象,它在流类的对象,它在 iostream.h 头文件头文件 中作为全局对象定义:中作为全局对象定义:ostream cout(stdout); C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中#include using namespace std; void main( ) float a,
13、b;cerr请输入请输入 a 和和 b 的值:的值:ab; if (b) couta/b=a/bendl; else cerr除数为零!除数为零!endl; 13.2 基本基本I/O流类流类 13.2.1 预定义的标准流对象预定义的标准流对象 friend ostream & operator(istream&, float) friend ostream & operator(ostream&, float) C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.2 基本基本I/O流类流类 13.2.2 I/O流的状
14、态检测流的状态检测 检测检测I/O流操作状态的流操作状态的I/O流类的成员函数:流类的成员函数: int rdstate():读取:读取I/O状态字。状态字。 int bad():若非法操作,返回非零,否则返回:若非法操作,返回非零,否则返回 0。 void clear(int=0):清除流中的错误。:清除流中的错误。 int eof():到文件尾,返回非零,否则返回:到文件尾,返回非零,否则返回 0。 int fail():I/O操作错,返回非零,否则返回操作错,返回非零,否则返回 0。 int good():I/O操作正常,返回非零,否则返回操作正常,返回非零,否则返回 0。 在在I/O操
15、作后,应及时检测是否发生操作后,应及时检测是否发生I/O错误。在处理错误。在处理I/O 错误后,应使用错误后,应使用 clear 函数清除流中的错误,以便进行后函数清除流中的错误,以便进行后 续续I/O操作。操作。 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中回顾回顾 #include using namespace std; void main( ) float X, Y; cinXY; c
16、outX,Yendl; coutABCDEFendl; C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.3 重载提取和插入运算符重载提取和插入运算符 #include using namespace std; class Point float X, Y; public: Point(float x=0, float y=0) X=x; Y=y; ; void main( ) Point p1, p2; coutp1p2endl; no operator defined which takes a right-h
17、and operand of type class Point (or there is no acceptable conversion) C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.3 重载提取和插入运算符重载提取和插入运算符 #include using namespace std; class Point float X, Y; public: Point(float x=0, float y=0) X=x; Y=y; ; ostream & operator(ostream& os, Point&
18、p) osp.X; osp.Y; return os; void main( ) Point p1, p2; coutp1p2endl; cannot access private member declared in class Point C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.3 重载提取和插入运算符重载提取和插入运算符 #include using namespace std; class Point public: float X, Y; Point(float x=0, float y=0)
19、X=x; Y=y; ; ostream & operator(ostream& os, Point& p) osp.X; osp.Y; return os; void main( ) Point p1, p2; coutp1p2endl; 运行结果:运行结果: 0000 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.3 重载提取和插入运算符重载提取和插入运算符 #include using namespace std; class Point float X, Y; public: Point(float x=
20、0, float y=0) X=x; Y=y; ostream & operator(ostream& os, Point& p) osp.X; osp.Y; return os; ; void main( ) Point p1, p2; coutp1p2endl; operator has too many parameters C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.3 重载提取和插入运算符重载提取和插入运算符 #include using namespace std; class Point flo
21、at X, Y; public: Point(float x=0, float y=0) X=x; Y=y; friend ostream & operator(ostream& os, Point& p) osp.X; osp.Y; return os; ; void main( ) Point p1, p2; coutp1p2endl; 运行结果:运行结果: 0000 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.3 重载提取和插入运算符重载提取和插入运算符 例例13.2:重载提取和插入运算符,直接输入:重
22、载提取和插入运算符,直接输入/输出对象。输出对象。 #include using namespace std; class Point float X, Y; public: Point(float x=0, float y=0) X=x; Y=y; friend istream & operator(istream&, Point&); friend ostream & operator(ostream&, Point&); ; void main( ) Point p1, p2; coutp1p2; coutp1,p2(istream& is, Point& p) isp.Xp.Y; re
23、turn is; ostream & operator(ostream& os, Point& p) ps(p.X,p.Y); return os; 运行结果:运行结果: 1 2 3 4 12,34 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中 标准流只能直接输入标准流只能直接输入/输出基本类型的数据,自定义类型的数输出基本类型的数据,自定义类型的数 据只有转化成基本类型的数据后才可使用标准流。据只有转化成基本类型的数据后才可使用标准流。 直接输入直接输入/输出类类型的数据,需重载输出类类型的数据,需重载“”运算符
24、。运算符。 重载提取运算符的格式:重载提取运算符的格式: friend istream & operator(istream&, ClassName&); 重载插入运算符的格式:重载插入运算符的格式: friend ostream & operator”运算。运算。 13.3 重载提取和插入运算符重载提取和插入运算符 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.4 文件文件 根据对字节内
25、容的不同解释,文件可分为:根据对字节内容的不同解释,文件可分为: 文本文件文本文件(ASCII码文件)码文件) :每个字节为字符。:每个字节为字符。 二进制文件二进制文件:每个字节为二进制数据。:每个字节为二进制数据。 例:例:10000 若解释为若解释为short类型数据,则占类型数据,则占 2 个字节。个字节。 若解释为字符数据,则占若解释为字符数据,则占 5 个字节。个字节。 文件流类:文件流类: ifstream:输入文件流类,用于文件输入;:输入文件流类,用于文件输入; ofstream:输出文件流类,用于文件输出;:输出文件流类,用于文件输出; fstream:输入:输入/输出文件
26、流类,用于文件输入输出文件流类,用于文件输入/输出。输出。 文件流对象:文件流对象:与预定义的标准流对象相似。区别在于:与预定义的标准流对象相似。区别在于: 文件流对象需用户定义后方可使用。文件流对象需用户定义后方可使用。 文件流对象可与用户指定的文件关联文件流对象可与用户指定的文件关联。 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中文件流对象文件流对象 的成员函数的成员函数 13.4 文件文件 13.4.1 文件流的用法文件流的用法 包含头文件包含头文件 ifstream、ofstream 或或 fstream。
27、 建立流,即声建立流,即声明一个文件流对象。明一个文件流对象。 例例:ofstream out; ifstream in; fstream iofile; 用用 open( ) 函数或构造函数,打开指定文件。函数或构造函数,打开指定文件。 例:例:out.open(f1.txt); /使文件使文件 f1.txt 与流对象与流对象 out 相联系。相联系。 用文件流对象的提取、插入运算符或成员函数读写文件。用文件流对象的提取、插入运算符或成员函数读写文件。 例:例:inch; 文件使用结束,用文件使用结束,用 open( ) 函数关闭文件。函数关闭文件。例:例:in.close( ); 文件流对
28、象文件流对象 的成员函数的成员函数 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中文件的打开方式:文件的打开方式:缺省值:缺省值: 输入文件流:输入文件流:ios_base:in 输出文件流:输出文件流: ios_base:out| ios_base:trunc 输入输出文件流:输入输出文件流: ios_base:in| ios_base:out 13.4 文件文件 13.4.2 文件的打开文件的打开 用文件流类的成员函数用文件流类的成员函数 open( ) 打开文件:打开文件: open( ) 函数原型:函数原型:
29、 void open(const unsigned char *filename, int ios_base:openmode mode, int access=filebuf:openprot); 指定文件名:指定文件名: 可含盘符和路径可含盘符和路径 如如:d:tf1.dat 文件的访问方式:文件的访问方式: 0普通文件普通文件 1只读文件只读文件 2隐含文件隐含文件 4系统文件系统文件 8备份文件备份文件 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中作用作用 方式方式 二进制方式打开文件。与输入或输出方二进制
30、方式打开文件。与输入或输出方 式组合使用。式组合使用。 ios_base:binary 清空文件。单用时与清空文件。单用时与ios_base:out等价等价 ios_base:trunc 输出方式打开文件。若文件不存在,则输出方式打开文件。若文件不存在,则 产生一新文件;若存在,则清空文件。产生一新文件;若存在,则清空文件。 ios_base:out 输入方式打开文件。若文件不存在,则输入方式打开文件。若文件不存在,则 打开出错。打开出错。 ios_base:in 添加输出方式打开文件后,文件指针添加输出方式打开文件后,文件指针最最 初初指向文件尾,但随后可改变指向。指向文件尾,但随后可改变指
31、向。 ios_base:ate 追加输出方式打开文件后,文件指针追加输出方式打开文件后,文件指针始始 终终指向文件尾,所有输出写入文件尾。指向文件尾,所有输出写入文件尾。 若文件不存在,则产生一个新文件。若文件不存在,则产生一个新文件。 ios_base:app 表表13-1 文件的打开方式文件的打开方式 文件指针初值文件指针初值文件尾文件尾 文件尾文件尾 0 文件头文件头 0 0 0 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中文件打开方式说明:文件打开方式说明: 若不矛盾,则可用位或运算若不矛盾,则可用位或运算
32、“|”将几种打开方式组合使用。将几种打开方式组合使用。 不以二进制方式打开的文件,都是文本文件。不以二进制方式打开的文件,都是文本文件。 文件指针从文件指针从 0 开始连续编号(开始连续编号( 0 代表文件头),以字节为单代表文件头),以字节为单 位,用于指示文件的读位,用于指示文件的读 / 写位置。文件每读写位置。文件每读 / 写一个字节,文写一个字节,文 件指针就后移一个字节。文件指针的初值由文件打开方式指件指针就后移一个字节。文件指针的初值由文件打开方式指 定。若文件打开方式含定。若文件打开方式含 ios_base:app 或或 ios_base:ate,则文,则文 件指针指向文件尾,否
33、则指向文件头。件指针指向文件尾,否则指向文件头。 13.4 文件文件 13.4.2 文件的打开文件的打开 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.4 文件文件 13.4.2 文件的打开文件的打开 用文件流类的构造函数用文件流类的构造函数打开文件:打开文件: 文件流类文件流类 ifstream、ofstream、fstream 的构造函数的构造函数所带参所带参 数与其成员函数数与其成员函数 open( ) 所带参数完全相同。所带参数完全相同。 因此,在说因此,在说 明这三种文件流类的对象时,通过调用各自的构
34、造函数,明这三种文件流类的对象时,通过调用各自的构造函数, 也能打开文件。也能打开文件。 读方式打开文件:读方式打开文件:ifstream f1(file1.dat); 写方式打开文件:写方式打开文件:ofstream f2(file2.txt); 读方式打开文件:读方式打开文件:fstream f3(file3.dat, ios_base:in); 等价于:等价于:fstream f3; f3.open(file3.dat, ios_base:in); C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中因在因在 ios
35、 类中重载了取反运算符类中重载了取反运算符“!”: int ios:operator!( ) return fail(); 这样,若文件打开成功,则这样,若文件打开成功,则“!f1”为为 0,否则为非,否则为非0。此处亦可用。此处亦可用 f1.fail()。 13.4 文件文件 13.4.2 文件的打开文件的打开 文件打开与否的判断文件打开与否的判断: 文件打开后,应判断打开是否成功。若不成功,则后续的文文件打开后,应判断打开是否成功。若不成功,则后续的文 件读件读 / 写操作就没有实际意义。写操作就没有实际意义。 例例:ifstream f1(C:myfile.dat); if(!f1) c
36、out”和插入运算符和插入运算符“ch的返回值为的返回值为in,成,成 为为 while 语句的条件。因语句的条件。因 不是基本类型数据,无法不是基本类型数据,无法 直接运算,除非做类型转直接运算,除非做类型转 换。换。ios类仅重载了一个类类仅重载了一个类 型转换函数:型转换函数: operator void*( ) return fail()?0:this; 隐式类型转换:隐式类型转换: (void*)infail()?0:this 例例13.3:复制源文件到目标文件。:复制源文件到目标文件。 #include #include using namespace std; void main
37、() char ch, f1256, f2256; coutf1; coutf2; ifstream in(f1); ofstream out(f2); if(!in) coutn不能打开源文件:不能打开源文件:f1;return 1; if(!out) coutn不能打开目标文件:不能打开目标文件:noskipws; while(inch) outch; in.close();out.close(); C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中例例13.4:设文本文件:设文本文件data.txt中有若干实数,每
38、个实数之间用空中有若干实数,每个实数之间用空 格或换行符隔开。求出文件中的这些实数的平均值。格或换行符隔开。求出文件中的这些实数的平均值。 #include #include using namespace std; int main() float sum=0, t; int count=0; ifstream in(data.txt); if(!in) coutt) sum+=t, count+; cout实数的平均值实数的平均值=sum/count ,实数的个数实数的个数=countendl; in.close(); return 0; C+语言程序设计语言程序设计 第十三章第十三章 输
39、入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.4 文件文件 13.4.5 二进制文件的使用二进制文件的使用 用二进制文件方式读用二进制文件方式读 / / 写数据时,数据不做变换直接传送。写数据时,数据不做变换直接传送。 二进制文件的读二进制文件的读 / / 写操作:写操作: 使用读使用读 / 写字符的文件流的成员函数。写字符的文件流的成员函数。 使用文件流的成员函数使用文件流的成员函数 read() 和和 write()。 成员函数成员函数 read() 的原型:的原型: istream & istream:read(char*t, int n); istre
40、am & istream:read(unsigned char*t, int n); istream & istream:read(signed char*t, int n); 成员函数成员函数 write() 的原型:的原型: istream & istream:write(char*t, int n); istream & istream:write(unsigned char*t, int n); istream & istream:write(signed char*t, int n); 功能:功能:从二进制从二进制 文件中读取文件中读取 n 个个 字节数据到字节数据到 t 指指 针所
41、指内存。针所指内存。 功能:将功能:将 t 所指所指 内存的前内存的前 n 个字个字 节数据写入二进节数据写入二进 制文件。制文件。 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中例例13.5:将:将150 之间的所有偶数存入二进制文件之间的所有偶数存入二进制文件data.dat 中中。 #include #include using namespace std; int main() ofstream out(data.dat, ios_base:out | ios_base:binary); if(!out) c
42、out不能打开不能打开 data.dat:n; return 1; for(int i=2; i50; i+=2) out.write(char*)&i, sizeof(int); out.close(); return 1; C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中例例13.6:从例:从例13.5产生的数据文件产生的数据文件 data.dat 中中读取二进制数据,读取二进制数据, 按每行按每行10个数的形式显示。个数的形式显示。 #include #include using namespace std; i
43、nt main() ifstream in(data.dat, ios_base:in | ios_base:binary); if(!in) cout不能打开不能打开 data.dat:n; return 1; for(int a, i=1; in.read(char*)&a, sizeof(int); i+) coutat; if(i%10=0) coutendl; in.close(); return 1; C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.4 文件文件 13.4.5 二进制文件的使用二进制文
44、件的使用 随机读写文件的函数随机读写文件的函数: 顺序读写顺序读写:按先后顺序读按先后顺序读/写文件中的数据。写文件中的数据。 随机读写随机读写:从文件的任何指定位置读从文件的任何指定位置读/写数据,主要用于写数据,主要用于 二进制文件。随机读二进制文件。随机读/写的前提是移动文件指针。写的前提是移动文件指针。 移动输入流文件指针的成员函数移动输入流文件指针的成员函数: istream & seekg(streampos);/参考点为文件头参考点为文件头 istream & seekg(streamoff, ios:seek_dir dir); 文件指针移动:文件指针移动: 设有二进制输入文件
45、流对象设有二进制输入文件流对象 f。 f.seekg(-50, ios:cur); /指针从当前位置前移指针从当前位置前移50个字节。个字节。 f.seekg(50, ios:cur); /指针从当前位置后移指针从当前位置后移50个字节。个字节。 f. seekg(-50, ios:end); /指针从文件尾前移指针从文件尾前移50个字节。个字节。 streampos 和和 streamoff 为为 long 型。型。 pos 和和off指定文件指针指定文件指针 相对于参考点的移动值。相对于参考点的移动值。若为负值,则前移,否若为负值,则前移,否 则后移。文件头为前,则后移。文件头为前, 文件
46、尾为后。文件尾为后。 seek_dir 是是 ios 类中定类中定 义的公有枚举类型:义的公有枚举类型: enum seek_dir /参考点参考点 beg=0, /文件头文件头 cur=1, /当前位置当前位置 end=2 /文件尾文件尾 ; dir 指定文件指针移动的指定文件指针移动的 参考点。参考点。 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中13.4 文件文件 13.4.5 二进制文件的使用二进制文件的使用 在移动指针时,必须保证移动后的指针值大于等于在移动指针时,必须保证移动后的指针值大于等于 0 且且
47、 小于等于文件尾字节编号,否则将导致后续读小于等于文件尾字节编号,否则将导致后续读/写出错。写出错。 移动输出流文件指针的成员函数:移动输出流文件指针的成员函数: ostream & seekp(streampospos); ostream & seekp(streamoffoff, ios:seek_dir dir); 获取文件指针值的成员函数:获取文件指针值的成员函数: streampos istream:tellg(); /输入流输入流 streampos ostream:tellg(); /输出流输出流 功能:功能:返回当前文件指针值(相对于文件头)。返回当前文件指针值(相对于文件头)
48、。 随机文件的读写分两步:随机文件的读写分两步: n 先将文件指针移到开始读写的位置;先将文件指针移到开始读写的位置; n 再用文件读再用文件读/写函数读写函数读/写数据。写数据。 C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中例例13.7:从例:从例 13.5 的的 data.dat 中中读取第读取第 3、5、7、9 个数据。个数据。 #include #include using namespace std; int main() int i,x; ifstream f(data.dat, ios_base:in
49、 | ios_base:binary); if(!f) cout不能打开不能打开 data.dat:n; return 1; f.seekg (2* sizeof(int);/文件指针移到第文件指针移到第 3 个数据个数据 for(i=3; i9 & f.read(char*)&x, sizeof(int); i+=2) f.seekg (sizeof(int), ios:cur); /文件指针后移文件指针后移 1 个数据个数据 coutxt; f.close(); return 0; C+语言程序设计语言程序设计 第十三章第十三章 输入输入/输出流输出流 制作:制作:山东经济学院计算机科学与技术学院 徐振中