最新3输入输出流与流类库ppt模版课件_第1页
最新3输入输出流与流类库ppt模版课件_第2页
最新3输入输出流与流类库ppt模版课件_第3页
最新3输入输出流与流类库ppt模版课件_第4页
最新3输入输出流与流类库ppt模版课件_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章 输入输出流与流类库,13:12:21,2/99,流的定义、C+的预定义流 标准输入输出的预定义流对象cin 、cout 、cerr和clog 格式化的I/O 输入流/输出流专门操作 文件与文件流 文件操作:打开和关闭、文件的定位与随机存取、文件的读写,13:12:21,3/99,当程序与外界环境进行信息交换时,存在着两种对象,一种是程序中的对象,另一种是文件对象。 流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。把数据的流动称为流。流在使用前要被建立,使用后要被删除,还要使用一些特定的操作,从流中获取数据或向流中添加数据。读操作在流数据抽象中被称为(从流中)提取,即输出,写操作被称为(向流中)插入,即输入。 程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。,13:12:21,4/99,iostream类库概述,输入/输出操作在C和C+中没有定义,所有的C+编译器绑定了iostream类,用于I/O操作。在iostream类中,“流(stream)”是其核心概念。我们可以认为流对象就象一个“杰出的文件”,是字节数据出入的源和目的地。,13:12:21,5/99,iostream类库中各类间的关系图,iostream类库概述,13:12:21,6/99,ios类,ios类用来提供流的高级I/O操作。它是一个虚基类。提供输入输出所需的公共操作。ios类包含一个指向streambuf的指针,提供格式化标志进行格式化I/O处理,对I/O的错误处理,设置文件模式以及提供建立相关流的方法。,iostream类库概述,13:12:21,7/99,streambuf类,streambuf类主要负责缓冲区的处理。它提供对缓冲区的低级操作,如设置缓冲区,对缓冲区指针进行操作,从缓冲区提取字节,向缓冲区插入字节等 filebuf, strstreambuf和stdiobuf都是streambuf的派生类 filebuf提供文件缓冲区的管理 strstreambuf使用字符串保存字符序列,提供在内存中提取和插入操作的缓冲区管理 stdiobuf提供标准I/O文件的缓冲区管理,iostream类库概述,13:12:21,8/99,ostream类及其派生类提供流的各种格式化、非格式化操作,对所有系统预定义的输出流重载运算符“”。它有3个派生类: ofstream 文件输出流类 ostrstream 串输出流类 ostream_withassign 为标准输出流cout, cerr, clog定义的输入流类,重载了赋值运算符,iostream类库概述,ostream类及其派生类,13:12:21,9/99,istream类及其派生类提供流的大部分输入操作。主要有对streambuf 进行插入时格式化、非格式化的转换,并对所有系统预定义的输入流重载运算符“”,它有3个派生类: ifstream 文件输入流类,用于对文件的提取操作 istrstream 串输出流类,用于对字符串的提取操作 istream_withassign 为标准输入流cin定义的输入流类,重载了赋值运算符。,iostream类库概述,istream类及其派生类,13:12:21,10/99,iostream由istream和ostream派生而来,综合了流的输入输出操作。它有3个派生类: 文件输入输出流类fstream 串输入输出流类strstream 标准输入输出流类 stdiostream ios类中的很多操纵符(以一个流引用作为其参数,并返回同一流的引用,故它可以嵌入到输入/输出操作的链中)都可以应用于输入流。 操作符是在头文件iostream.h中定义的,而操作函数是在iomanip.h中定义。,iostream类库概述,输入输出流类iostream,13:12:21,11/99,屏 幕 输 出,方法1:输出流 使用预定义的插入()运算符(ostream类中定义的运算符),是所有标准C+数据类型预先设计的 最重要的三个输出流是 ostream ofstream ostringstream,屏幕输出和键盘输入,13:12:21,12/99,屏 幕 输 出,预先定义的输出流对象: cout 标准输出 cerr 标准错误输出,没有缓冲,发送给它的内容立即被输出。 clog 类似于cerr,但是有缓冲,缓冲区满时被输出。,屏幕输出和键盘输入,13:12:21,13/99,屏 幕 输 出,格式: ostream,屏幕输出和键盘输入,13:12:21,14/99,ostream 功能:重载的操作符把对应的参数插入到输出流中,13:12:21,15/99,屏 幕 输 出,方法2: 使用成员函数put( ) 格式: ostream,屏幕输出和键盘输入,13:12:21,16/99,功能:从一缓冲区中把指定数量的字节数插入到输出流中。 例1 #include using namespace std; viod main( ) int a = 12; cout a “123“; cout.put( a ).put( b ).put( c ).put( n ); cout.write( “abcde“, 2 ).write( “qwer“, 2 ); ,13:12:21,17/99,提取运算符(),提取运算符()对于所有标准C+数据类型都是预先设计好的。cin标准输入。 是从一个输入流对象获取字节最容易的方法。 ios类中的很多操纵符都可以应用于输入流。但是只有少数几个对输入流对象具有实际影响,其中最重要的是进制操纵符dec、oct和hex。,屏幕输出和键盘输入,13:12:21,18/99,输入流成员函数,open()函数把该流与一个特定磁盘文件相关联。 get()函数的功能与提取运算符()很相像,主要的不同点是get函数在读入数据时包括空白字符。 getline()的功能是从输入流中读取多个字符,并且允许指定输入终止字符,读取完成后,从读取的内容中删除终止字符。 read()成员函数从一个文件读字节到一个指定的内存区域,由长度参数确定要读的字节数。如果给出长度参数,当遇到文件结束或者在文本模式文件中遇到文件结束标记字符时结束读取。,屏幕输出和键盘输入,13:12:21,19/99,输入流成员函数,seekg()函数用来设置输入文件流中读取数据位置的指针 tellg()函数返回当前文件读指针的位置 close()函数关闭与一个输入文件流关联的磁盘文件,屏幕输出和键盘输入,13:12:21,20/99,键 盘 输 入,方法1:输入流 重要的输入流类: istream类最适合用于顺序文本模式输入;cin是其派生类istream_withassign的对象 ifstream类支持磁盘文件输入 istringstream,屏幕输出和键盘输入,13:12:21,21/99,键 盘 输 入,使用提取运算符()的格式: istream,屏幕输出和键盘输入,13:12:21,22/99,istream 功能: 从流对象中提取数据。,13:12:21,23/99,键 盘 输 入,方法2: 使用成员函数get( ) 格式: int get(); istream,13:12:21,24/99,get()函数功能: int get() 不带参数的函数get从指定的输入流中提取一个 字符(包括空白字符),并返回该字符作为函数调用的值。当遇到文件结束 符时,返回系统常量EOF istream& get(char&rch) 从指定输入流中提取一个字符(包括空白字符),把该字符写入rch引用的对象。当遇到文件结束符时,该函数返回0,否则返回对istream对象的引用 istream& get(char * pch,int nCount, char delim=n)从当前字符开始,读取nCount-1个字符,或遇到指定分隔符delim结束。函数把读取的字符(不包括分隔符)写入数组pch中,并在字符串后添加 0,13:12:21,25/99,方法3: 使用成员函数read( ) 格式: istream 功能:从流读出的字节序列赋给pch(地址)所指内存字节序列,参数nCount指定提取字节数。,键 盘 输 入,13:12:21,26/99,例2 #include using namespace std; void main() int a; char p11; cin a; cin.get(p,10,a); cout a endl; / endl相当于 “ n “ cout p endl; cin.read(p, 4); /从输入流当前位置读取4个字节,写入到p中 cout p endl; ,因为endl包含在std中,所以如果用了using namespace std,那么就不用加头文件了。,为什么此处使用操纵符“endl ”时不用包含“iomanip.h“头文件?,13:12:21,27/99,输 出 宽 度,为满足用户对数据输入输出的格式化需要,ios提供直接设置标志字的控制格式函数 为了调整输出,可通过在流中放入setw操纵符或调用width成员函数为每个项指定输出宽度 int width(int nw)设置下一个输出项的显示宽度为nw。如果nw大于数据所需宽度,在没有特别指示时,数据以右对齐方式显示。如果nw 小于数据所需宽度,则nw无效,数据以默认格式输出。该函数设置没有持续性,输出一个项目后,恢复系统的默认设置,格式控制,13:12:21,28/99,例3 使用width控制输出宽度 #include 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 valuesi n; ,The output looks like this: 1.23 35.36 653.7 4358.24,13:12:21,29/99,设置填充字符函数 char fill(char cFill) 当设置宽度大于数据显示需要宽度时,空白位置以字符参数cFill填充。若数据 在宽度域左对齐,在数据右边填充,否则在左边填充。默认填充符为空白符。 如果要在同一行上为输出的数据设置宽度可以使用setw()函数,该函数在iomanip.h文件中做了声明,在使用该函数时,必须包括该头文件。,设置填充字符和设置显示宽度,格式控制,13:12:21,30/99,例4 使用*填充 #include using namespace std; void main() double values = 1.23, 35.36, 653.7, 4358.24 ; for( int i = 0; i 4; i+ ) cout.width( 10 ); cout.fill( * ); cout valuesi endl; ,The output looks like this: *1.23 *35.36 *653.7 *4358.24,13:12:21,31/99,例5 使用setw指定宽度 #include #include using namespace std; void 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 ) namesi setw( 10 ) valuesi endl; ,The output looks like this: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24,13:12:21,32/99,输出对齐默认是右对齐文本,如果要左对齐文本,可以使用setiosflags(ios:lFlags)函数,参数传入ios类中数据成员ios:left 为使前面例子中name中的字符串左对齐,value中的数值右对齐。修改循环段的内容如下: for ( int i = 0; i 4; i+ ) cout setiosflags( ios:left ) setw( 6 ) namesi resetiosflags( ios:left ) /*清除原有设置*/ setw( 10 ) valuesi endl;,输 出 对 齐,格式控制,输出结果如下: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24,13:12:21,33/99,在ios类中声明了一个数据成员,用于记录当前流的格式化状态,这个数据成员称为标志字。标志字的每一位用于记录一种格式。为便于记忆,每一种格式定义了对应的枚举常量。上例中只是使用了ios类中标志字ios:left 下表列出了常用的标志常量名及意义:,13:12:21,34/99,13:12:21,35/99,设置显示精度,系统提供显示精度的默认值是6。float类型最大设置示数精度是6位,double类型最大设置示数精度是15位 。我们可以根据需要设置示数精度 修改上例中循环部分内容如下: for ( int i = 0; i 4; i+ ) cout setiosflags( ios:left ) setw( 6 ) namesi resetiosflags( ios:left ) /*清除原有设置*/ setw( 10 ) setprecision( 1 ) valuesi endl;,格式控制,输出结果如下: Zoot 1 Jimmy 4e+001 Al 7e+002 Stan 4e+003,13:12:21,36/99,例6 控制输出精度 #include #include using namespace std; int main() double values =1.23,35.36,653.7,4358.24; char *names =“Zoot“,“Jimmy“,“Al“,“Stan“; coutsetiosflags(ios:scientific); for(int i=0;i4;i+) coutsetiosflags(ios:left) setw(6)namesi resetiosflags(ios:left) setw(10)setprecision(1) valuesiendl; ,The output looks like this: Zoot 1.2e+000 Jimmy 3.5e+001 Al 6.5e+002 Stan 4.4e+003,13:12:21,37/99,进 制,dec、oct和hex操纵符设置输入和输出的缺省进制,格式控制,13:12:21,38/99,文件(files),文件(File)是一个物理概念,代表存储着信息集合的某个外部介质,它是C+语言对具体设备的抽象。如磁盘文件,显示器,键盘。 所有流(类对象)的行为都是相同的,而不同的文件则可能具有不同的行为。如,磁盘文件可进行写也可进行读操作;显示器文件则只可进行写操作;而键盘文件只可进行读操作。 当程序与一个文件交换信息时,必须通过“打开文件”的操作将一个文件与一个流(类对象)联系起来。一旦建立了这种联系,以后对该流(类对象)的访问就是对该文件的访问,也就是对一个具体设备的访问。可通过“关闭文件”的操作将一个文件与流(类对象)的联系断开。,磁盘文件,13:12:21,39/99,文件操作处理流程,打开文件 读写操作 关闭文件,磁盘文件,13:12:21,40/99,C+文件流系统,在头文件“fstream.h”中说明(预定义)了一批文件流类,专用于磁盘文件: ifstream - 由istream派生,支持从磁盘文件中输入(读入)数据; ofstream - 由ostream派生,支持往磁盘文件中输出(写出)数据; fstream - 由iostream派生,支持对磁盘文件进行输入和输出数据的双向操作。 C+中没有预定义的文件流(类对象),程序中用到的所有文件流类对象都要进行自定义。,磁盘文件,13:12:21,41/99,输出文件流成员函数,输出流成员函数有三种类型: 与操纵符等价的成员函数 执行非格式化写操作的成员函数 其它修改流状态且不同于操纵符或插入运算符的成员函数,磁盘文件,13:12:21,42/99,输出文件流成员函数,open()函数 把流与一个特定的磁盘文件关联起来 需要指定打开模式 put()函数 把一个字符写到输出流中 write()函数 把内存中的一块内容写到一个输出文件流中 seekp()和tellp()函数 操作文件流的内部指针 close()函数 关闭与一个输出文件流关联的磁盘文件 错误处理函数 在写到一个流时进行错误处理,磁盘文件,13:12:21,43/99,文件的打开与关闭,磁盘文件的操作可使用文件流类ifstream、ofstream或fstream类的成员函数来完成。如果以读的方式打开文件,应使用ifstream;如果以写的方式打开文件,应使用ofstream;如果以读/写的方式打开文件,应使用fstream 操作过程如下:首先说明一个文件流类的对象,然后用成员函数open()打开文件,再使用成员函数对文件进行读/写操作,最后使用成员函数close()关闭文件 ofstream类支持磁盘文件输出 如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的: ofstream myFile(“filename“, iosmode);,磁盘文件,13:12:21,44/99,文件的打开与关闭,在调用默认构造函数后使用open成员函数打开文件: / 声明一个静态输出文件流对象 ofstream myFile; / 打开文件,使流对象与文件建立联系 myFile.open(“filename“, iosmode); /建立一个动态的输出文件流对象 ofstream* pmyFile = new ofstream; /打开文件,使流对象与文件建立联系 pmyFile-open(“filename“, iosmode); 注意:fstream派生于ifstream和ofstream,所以继承了它们的接口函数。以下示例都以fstream为例。,磁盘文件,13:12:21,45/99,格式:1、.open(,); 2、文件流 (, ); 打开方式: ios:in 读方式打开 ios: out 写方式打开 ios: app 追加方式 ios: ate 文件打开时,文件指针位于文件尾 ios: trunc 如果文件存在,清除原有内容。若文件 不存在,则创建 ios: binary 以二进制方式打开文件 ios: nocreate 打开已有的文件,如果文件不存在,则 打开失败 ios: noreplace 如果文件存在,除非设置ios:ate或 ios:app,否则打开失败,磁盘文件,文件的打开,13:12:21,46/99,“打开文件”通常通过构造函数自动完成(也可显式调用成员函数open完成)。“关闭文件”通常通过使用“.close();”来显式完成。 例1: ofstream outfile1(“myfile1.txt“); 创建ofstream类的对象outfile1;使流类对象outfile1与磁盘文件“myfile1.txt“相联系;并打开用于“写”的磁盘文件“myfile1.txt“。 例2: /创建ofstream类的对象outfile1 ofstream outfile1; /显式调用成员函数open来打开文件 outfile1.open(“myfile1.txt“);,文件的打开,13:12:21,47/99,1. ifstream:ifstream ifstream( const char* szName, int nMode = ios:in, int nProt = filebuf:openprot ); 参数: (1) szName :文件名; (2) nMode:打开文件的方式。 ios:in 以读(输入)为目的打开。 ios:nocreate 仅打开一个已存在文件。 ios:binary 打开二进制文件。 (3) nProt:指定所打开文件的保护方式。 filebuf:openprot表示兼容共享方式。,与创建流类对象相关的三个构造函数,13:12:21,48/99,2. ofstream:ofstream ofstream( const char* szName, int nMode = ios:out, int nProt = filebuf:openprot ); 参数: (1) szName:文件名; (2) nMode :打开文件的方式。 ios:out 以写(输出)为目的打开文件。 ios:trunc 若文件存在,则将文件长度截为0。 ios:binary 打开二进制文件。 ios:app 以追加方式打开。 . (3) nProt :指定所打开文件的保护方式。,与创建流类对象相关的三个构造函数,13:12:21,49/99,3. fstream:fstream fstream( const char* szName, int nMode, int nProt = filebuf:openprot ); 说明:参数含义和用法与ofstream构造函数处相同。,与创建流类对象相关的三个构造函数,13:12:21,50/99,1. ofstream:open void open( const char* szName, int nMode = ios:out, int nProt = filebuf:openprot ); 2. ifstream:open void open( const char* szName, int nMode = ios:in, int nProt = filebuf:openprot ); 3. fstream:open void open( const char* szName, int nMode, int nProt = filebuf:openprot );,与创建流类对象相关的三个open函数,13:12:21,51/99,例如: #include fstream f1; f1.open( “myfile.dat“, ios:out); 或: fstream f1( “myfile.dat“, ios:out); 关闭文件的格式如下: .close( ); 例如: f1.close( );,磁盘文件,文件的打开与关闭,13:12:21,52/99,对文件的“读写操作”通常使用预定义的类成员函数来实现(随后介绍),但也可使用继承而来的插入和提取运算符“”和“”,所以,ifstream流(类对象)可以使用预定义的算符“”来对自定义磁盘文件进行“读”操作(允许通过派生类对象直接调用其基类的公有成员函数); ofstream类由ostream类所派生,而ostream类中预定义了公有的运算符重载函数“operator ”,所以,ofstream流(类对象)可以使用预定义的算符“”来对自定义磁盘文件进行“写”操作;,读写操作,13:12:21,53/99,fstream类由iostream所派生,iostream类由istream与ostream类共同派生,所以,fstream流(类对象)可以使用预定义的运算符“”和“”来进行“读”操作时遇空格或换行均结束一个数据相呼应。 下述示例程序做了如下3件事:1) 往文件写数据;2) 往文件尾部追加数据; 3) 从文件读出数据并显示在屏幕上。,读写操作,13:12:21,54/99,#include int main() /1) 往文件写数据 ofstream outfile1(“myfile1.txt”); / 以“写”方式打开 outfile1 str1 str2; / 使用“”读(遇空格、换行均结束) infile1 x2 y2; infile1.close();,13:12:21,55/99,cout “str1=” str1 endl; cout “str2=” str2 endl; cout “x2=” x2 endl; cout “y2=” y2 endl; /程序执行后的显示结果如下: str1=Hello!.CHINA! str2=CUIT x2=1212 y2=6868,13:12:21,56/99,1 类成员函数get与put 2 类成员函数read与write 3 类成员函数getline,使用类成员函数对文件流进行操作,13:12:21,57/99,ostream 功能:从自定义文件中读出1个字符放入引用rch中。 注意,put实际上只是ostream类中定义的公有成员函数,当然通过其派生类ofstream的类对象也可以直接对它进行调用。同理,通过ifstream的类对象可以直接调用get。,用类成员函数get与put,13:12:21,58/99,程序示例 从键盘输入任一个字符串,通过put将其写到自定义磁盘文件“putgetfile.txt”中,而后再使用get从该文件中读出所写串并显示在屏幕上。 #include #include void main() /键盘输入字符串,通过put将其写到自定义磁盘文件中 char str80; cout “Input string: “ endl; gets(str); ofstream fout( “putgetfile.txt“ ); int i = 0; while ( stri ) fout.put(stri+); fout.close(); cout “-“ endl;,13:12:21,59/99,/而后使用get从文件中读出该串显示在屏幕上 char ch; ifstream fin( “putgetfile.txt“ ); fin.get(ch); while( !fin.eof() ) /从头读到文件结束(当前符号非文件结束符时继续) /注: 成员函数eof()在读到文件结束时方返回true cout ch; fin.get(ch); cout endl; fin.close(); / 程序执行后的显示结果如下: Input string: File operating - using put and get, OK! 12345 - File operating - using put and get, OK! 12345,13:12:21,60/99,程序示例 对指定文件进行拷贝 使用类成员函数get与put对指定文件进行拷贝。被拷贝的“源文件”以及拷贝到的“目的文件”的名字与路径均由命令行参数来提供。 程序执行结果(若提供的命令行参数为:mycopy.cpp res_1.cpp): Copy file from mycopy.cpp to res_1.cpp 程序执行结果(若提供的命令行参数个数不对时): ERROR ! - supplying 2 command-line argements ?!,13:12:21,61/99,#include void main(int argc, char* argv) if(argc != 3) / 命令行参数个数不对时 cout “ERROR ! - supplying 2 command-line argements ?! “ endl; exit (1); cout “ Copy file from “ argv1 “ to “ argv2 “ “ endl; ifstream fin(argv1); / 命令行参数1作为文件名 ofstream fout(argv2); / 命令行参数2作为文件名 char ch; fin.get(ch); while(!fin.eof() / 从头读到文件结束 fout.put(ch); fin.get(ch); fin.close(); fout.close(); ,13:12:21,62/99,类成员函数read与write,通常使用read与write对二进制文件(binary file)进行读写。 ostream 功能:从某个文件中读入nCount个字符放入pch缓冲区中(若读至文件结束尚不足nCount个字符时,也将立即结束本次读取过程)。 注意:使用write与read进行数据读写时,不必要在数据间再额外“插入”分割符,这是因为它们都要求提供第二实参来指定读写长度。,13:12:21,63/99,以下的示例程序先使用write往自定义二进制磁盘文件中写出如下3个“值”:字符串str的长度值Len(一个正整数)、字符串str本身、以及一个结构体的数据,而后再使用read读出这些“值”并将它们显示在屏幕上。 #include int main( ) char str20 = “Hello world!“; struct stu char name20; int age; double score; ss = “wu jun”, 19, 91.5;,13:12:21,64/99,cout “WRITE to wrt_read_file.bin“ endl; /打开用于“写”的二进制磁盘文件 ofstream fout(“wrt_read_file.bin“, ios:binary); int Len = strlen(str); fout.write( (char*)(,13:12:21,65/99,fin.read( (char*)( /程序执行后的显示结果如下: WRITE to wrt_read_file.bin - - READ it from wrt_read_file.bin - Len=12 str2=Hello world! ss=wu jun,19,91.5 -,13:12:21,66/99,最常用格式为: istream 功能:从某个文件中读出一行(至多nCount个字符)放入pch缓冲区中,缺省行结束符为n。 程序实例: 读出“getline.cpp”的各行并显示在屏幕上(如,可将本源程序存放在“getline.cpp“文件中)。,类成员函数getline,13:12:21,67/99,#include int main( ) char line81; ifstream infile(“getline.cpp”); / 打开文件用于读 / 读出一行(至多80个字符)放入line中 infile.getline(line, 80); while( !infile.eof() ) / 尚未读到文件结束则继续循环(处理) cout line endl; / 显示在屏幕上 infile.getline(line, 80); / 再读一行 infile.close(); ,13:12:21,68/99,text文件与binary文件 对text文件与binary文件的一般使用示例 采用binary文件形式对结构体数据进行存储与读写处理 - 对text文件与binary文件的一般使用示例 * 以text形式存储,优点是具有较高的兼容性。缺点是存储一批纯数值信息时,要在数据之间人为地添加分割符;输入输出过程中,系统要对内外存的数据格式进行相应转换;另外text文件不便于对数据实行随机访问。,13:12:21,69/99,* 以binary形式存储 优点是便于对数据实行随机访问(每一同类型数据所占磁盘空间的大小均相同,不必在数据之间人为地添加分割符);输入输出过程中,系统不对数据进行任何转换。缺点是兼容性低。 注:由程序员决定将数据存储为text文件或者binary文件两种形式之一。 缺省打开方式时,默认为text文件形式。若欲使用binary文件形式,要将打开方式设为“ios:binary”。 通常将纯文本信息(如字符串)以text文件形式存储,而将数值信息以binary文件形式存储。,13:12:21,70/99,示例1 对两种文件进行操作 将a数组中准备好的8个int型数据,分别通过算符“”依次写出到text文件ft.txt之中(注意各数据在文件中“长短”不一,且数据间必须加入分割符)。而且还通过使用类成员函数write将这相同的8个int型数据依次写出到binary文件fb.bin之中(注意各数据在文件中“长短”相同,且数据间不需要加入分割符)。 另外,程序中通过使用无参的成员函数“tellp()”来获取当前已写出到各文件的位置信息,以确认每一数据在文件中所占的字节数。 ostream:tellp之功能为:获取并返回“输出指针”的当前位置值(从文件首到当前位置的字节数)。,13:12:21,71/99,#include int main() int a8=0,1,-1,1234567890; for(int i=4; i8; i+) ai=876543210+i-4; /均由9位数字组成,在text文件中所占字节数也为9 ofstream ft(“ft.txt“); ofstream fb(“fb.bin“, ios:binary); for(i=0; i8; i+) ftai“ “; /数据间需要添加分割符 fb.write(char*)( ,13:12:21,72/99,/程序执行后的输出结果如下: ft.tellp()=2, fb.tellp()=4 ft.tellp()=4, fb.tellp()=8 ft.tellp()=7, fb.tellp()=12 ft.tellp()=18, fb.tellp()=16 ft.tellp()=28, fb.tellp()=20 ft.tellp()=38, fb.tellp()=24 ft.tellp()=48, fb.tellp()=28 ft.tellp()=58, fb.tellp()=32,13:12:21,73/99,示例2 使用read与write对text文件进行操作时可能出错 具体程序从略。 评注: (1)通常使用read与write对二进制文件进行操作,但若非要使用它们对文本文件进行操作时,系统在write时有可能多写出了一些东西(如,回车换行符号等)。这样将导致read时产生错误。 (2)read与write功能的进一步解释: istream:read Extracts bytes from the stream until the limit nCount is reached or until the end of file is reached. The read function is useful for binary stream input. ostream:write Inserts a specified number of bytes from a buffer into the stream. If the underlying file was opened in text mode, additional carriage return characters may be inserted. The write function is useful for binary stream output.,13:12:21,74/99,文本文件的读与写,例7 #include int main() int i,age; double score; char name8, buff20; fstream f1; f1.open(“f1.txt“,ios:out); if(!f1) / !是重载运算符 cout “Cant open file.n“; abort(); for( i=1; i = 2 ; i+) cin.getline(name,n) ; cin.getline(buff,n); age=atoi(buff); cin.getline(buff,n) ; score=atof(buff);,f1 name; while(!f1.eof() f1 age score; cout name; ,运行结果: a 19 90 b 20 88 文件内容: a 19 90 b 20 88,13:12:21,75/99,例8 /*使用put(),get()函数进行文件的读/写。*/ #include #include int main() fstream f1,f2; f1.open(“f1.txt“,ios:in); if (!f1) cout “Cant open file.n“; abort(); f2.open(“f2.txt“,ios:out); if (!f2) cout “Cant open file.n“; abort(); ,char c; f1.get(c); while(!f1.eof() f2.put(c); f1.get(c); f1.close(); f2.close(); ,文本文件的读与写,13:12:21,76/99,例9向文件输出 #include using namespace std; struct Date int mo,da,yr; ; int main( ) Date dt = 6,10,92; ofstream tfile(“date.dat“,ios:binary); tfile.write(char *) ,磁盘文件,13:12:21,77/99,二进制文件的读与写,对二进制文件进行读/写时,可用get()或put()这样的成员函数一次读写一个字节,也可使用write()和read()函数可一次读/写多个字节。,磁盘文件,13:12:21,78/99,二进制输出文件,以通常方式构造一个流,然后使用setmode成员函数,在文件打开后改变模式。 使用ofstream构造函数中的模式参数指定二进制输出模式 使用二进制操作符代替setmode成员函数:ofs binary;,磁盘文件,13:12:21,79/99,例10 #include #include using namespace std; int main() char buff20; struct person char name8; int age; double score; ; int i; fstream f1; f1.open(“f1.dat“,ios:out|ios:binary); struct person st; for( i=1; i 5 ; i+) cin.getline(,20) ; cin.getline(buff,20);,st.age=atoi(buff); cin.getline(buff,20) ; st.score=atof(buff); f1.write(char*) ,13:12:21,80/99,二进制文件的随机访问,二进制文件以基本类型数据在内存的二进制表示形式存放数据,二进制流不对写入或读出的数据进行格式转换。 文件打开后,系统自动生成两个隐含的流指针(读指针和写指针)。在进行读/写操作时,系统自动移动流指针。除此以外,istream和ostream分别提供对读指针和写指针的操作函数来改变读指针或写指针的位置。通过这些操作程序可以任意顺序对文件读出或写入数据。,磁盘文件,13:12:21,81/99,二进制文件的随机访问,enum seek_dirbeg = 0, cur = 1, end = 2 ; seek_dir 的常量值有如下含义: ios:cur /流指针的当前位置“后推”off字节处 ios:beg /流指针的开始位置“后推”off字节处 ios:end /流的尾部“前推”off字节处,磁盘文件,13:12:21,82/99,对数据文件进行随机访问,使用类成员函数write与read,并配合使用类成员函数seekp和seekg,就可以对文件进行“随机性”(非顺序性)的读写操作。 1) ostream:seekp ostream 功能:将“输出指针”的值置到一个新位置,使以后的输出从该新位置开始。新位置由参数off与dir的值确定: 当dir值为“ios:beg”时,新位置为:从文件首“后推”off字节处; 当dir值为“ios:cur”时,新位置为:从“输出指针”的当前位置“后推”off字节处; 当dir值为“ios:end”时,新位置为:从文件末“前推”off字节处。,13:12:21,83/99,2) istream:seekg istream 功能:获取“输出指针”的当前位置值。,13:12:21

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论