C语言大学教程C++语言第23章_第1页
C语言大学教程C++语言第23章_第2页
C语言大学教程C++语言第23章_第3页
C语言大学教程C++语言第23章_第4页
C语言大学教程C++语言第23章_第5页
已阅读5页,还剩117页未读 继续免费阅读

下载本文档

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

文档简介

1、第第2323章章 输入与输出流输入与输出流提纲提纲l输出流和输入流的常用成员函数l流操纵符l流的错误状态l文件和流l文件操作打开文件打开文件读读 / / 写文件写文件关闭文件关闭文件23.1 C+的输入和输出(I/O)n 输入和输出,要看以什么为对象 n 以标准I/O设备为对象n从键盘、鼠标得到的数据是进入从键盘、鼠标得到的数据是进入内存内存的,该数据是输入数据。的,该数据是输入数据。n将数据从将数据从内存内存送到显示器、打印机等,该数据是输出数据。送到显示器、打印机等,该数据是输出数据。n 以外存磁盘文件为对象n内存中的数据内存中的数据存储到磁盘文件中,叫输出文件;存储到磁盘文件中,叫输出文

2、件;n从磁盘文件中的数据装载入从磁盘文件中的数据装载入内存中内存中,叫输入文件。,叫输入文件。n 以内存中指定的空间作为对象n常指定一个字符数组作为存储空间,这种常指定一个字符数组作为存储空间,这种I/O称为字符串的输入称为字符串的输入输出。输出。n C+采取不同的方法实现以上三种采取不同的方法实现以上三种I/O。标准标准I/O文件文件I/O串串I/On数据之间的传输过程称作流(stream)n 输入流输入流表示数据从某个载体或设备传送到表示数据从某个载体或设备传送到内存内存n 输出流输出流表示数据从内存传送到某个载体或表示数据从内存传送到某个载体或设备设备C+的输入输出流内内存存键盘键盘文件

3、文件光笔光笔.输入流输入流显示器显示器文件文件打印机打印机.输出流输出流n在进行I/O操作时n 首先进行首先进行“打开打开”操作,使流和文件发生联系操作,使流和文件发生联系n 建立联系后的文件才允许数据流入或流出建立联系后的文件才允许数据流入或流出n I/O结束后,使用结束后,使用“关闭关闭”操作使文件与流断开联系。操作使文件与流断开联系。nC+将I/O流定义为类流类。属于流类的对象是流对象n 系统已经以系统已经以运算符或函数运算符或函数的形式做好了对标准外设的形式做好了对标准外设(键盘、显示器、打印机、键盘、显示器、打印机、文件文件)的接口,使用时只需的接口,使用时只需按照要求的格式调用即可

4、。按照要求的格式调用即可。n 如:如:cin 标准输入流对象。标准输入流对象。 cout 标准输出流对象。标准输出流对象。C+的输入输出流I/OI/O流模板层次部分流模板层次部分C+的各种I/O流类库nC+为实现数据的I/O定义了一个庞大的类库。它包括的类主要有输出char *变量的地址值lchar * p=“asd”;lcoutpendl;lcoutstatic_cast(p);输入和输出流对象输入和输出流对象l预先定义的输出和输入流对象:cout 标准输出cerr 标准错误输出,没有缓冲,发送给它的内容立即被输出。clog 类似于cerr,但是有缓冲,缓冲区满时被输出。cin标准输入23.

5、2 标准输出流 n标准输出流流向标准输出设备(显示器)的数据 ncout流对象在控制台(显示器)输出n 用用流插入运算符流插入运算符“”向向cout输出数据输出数据.n 如: cout “a=” a endl; cout 数据数据1 数据数据2 数据数据3;ncerr流对象在控制台(显示器)输出错误信息n 用用流插入运算符流插入运算符“”向向cerr输出数据输出数据.n 如: cerr “除数为除数为0, 出错出错!” endl; cerr的用法与的用法与cout类似类似.ncout流对象与cerr流对象的不同之处n cout的输出默认是显示器的输出默认是显示器,但可以被重定向为输出到磁盘但可

6、以被重定向为输出到磁盘文件文件n cerr只能定向输出到显示器只能定向输出到显示器 例23.1 解一元二次方程ax2+bx+c=0 的解void main( ) float a, b, c, disc; cout a b c; if (a=0) cerr “ a=0, 不是二次方程,出错!不是二次方程,出错!”endl; else disc=b*b-4*a*c; if (disc0) cerr“二次方程无实根。二次方程无实根。”endl; else cout“x1=”(-b+sqrt(disc)/(2*a)endl; cout “x2=”(-b-sqrt(disc)/(2*a)endl; 标准

7、输出流n 标准输出流流向标准输出设备(显示器)的数据n clog流对象在控制台(显示器)输出错误信息.n 用用流插入运算符流插入运算符“”向向clog输出数据输出数据.n 如如: clog “除数为除数为0, 出错出错!” endl;n clog的用法与的用法与cerr类似类似.n clog流对象与cerr流对象的不同之处n cerr是不经过缓冲区,直接向显示器输出有关信息。是不经过缓冲区,直接向显示器输出有关信息。n clog的输出先存储在缓冲区,遇到缓冲区满或遇到的输出先存储在缓冲区,遇到缓冲区满或遇到endl时才向显时才向显示器输出。示器输出。用流对象的成员控制格式输出说明:cout.w

8、idth(n) 与格式控制符与格式控制符setw(n)相似相似cout.fill(c) 与格式控制符与格式控制符setfill(c)相似相似cout.setf(ios:dec); cout.unsetf(ios:hex);/#include using namespace std;int main()int a=21; cout.setf(ios:showbase); coutdec:aendl; cout.unsetf(ios:dec); cout.setf(ios:hex); couthex:aendl; cout.unsetf(ios:hex); cout.setf(ios:oct);

9、coutoct:aendl; char *pt=China; cout.width(10); coutptendl; cout.width(10); cout.fill(*); coutptendl; double pi=22.0/7.0; cout.setf(ios:scientific); coutpi=; cout.width(14); coutpiendl; cout.unsetf(ios:scientific); cout.setf(ios:fixed); cout.width(12); cout.setf(ios:showpos); cout.setf(ios:internal);

10、 cout.precision(6); coutpiab; / 从键盘输入2个整数n当输入时n 遇到无效的字符遇到无效的字符n 或遇到文件结束符或遇到文件结束符 ctrl+z 时时 cin处于出错状态,无法正常提取数据(cin=false). if (!cin) cout“输入出错输入出错”;21 abc #include using namespace std;int main( )float grade; coutgrade) /能从cin流读取数据if(grade=85) coutgradeGOOD!endl;if(grade60) coutgradefail!endl;coutente

11、r grade:; coutThe end.endl; return 0;函数函数功能功能read无格式输入指定字节数无格式输入指定字节数get从流中提取字符,包括空格从流中提取字符,包括空格getline从流中提取一行字符从流中提取一行字符ignore提取并丢弃流中指定字符提取并丢弃流中指定字符peek返回流中下一个字符,但不从流中删除返回流中下一个字符,但不从流中删除gcount统计最后输入的字符个数统计最后输入的字符个数eatwhite忽略前导空格忽略前导空格seekg移动输入流指针移动输入流指针tellg返回输入流中指定位置的指针值返回输入流中指定位置的指针值istreamistrea

12、m类的公有成员函数类的公有成员函数 输出流和输入流的常用成员函数输出流和输入流的常用成员函数int get();istream& get( char& rch );istream& get( char* pch, int nCount, char delim = n );istream& read ( char* pch, int nCount );读取一个字符读取一个字符,不跳过空白字符不跳过空白字符读取一行字符,读取一行字符,不提取不提取n函数函数功能功能read无格式输入指定字节数无格式输入指定字节数get从流中提取字符,包括空格getline从流中提取一

13、行字符ignore提取并丢弃流中指定字符提取并丢弃流中指定字符peek返回流中下一个字符,但不从流中删除gcount统计最后输入的字符个数统计最后输入的字符个数eatwhite忽略前导空格seekg移动输入流指针tellg返回输入流中指定位置的指针值istream& ignore( int nCount = 1, int delim = EOF );istreamistream类的公有成员函数类的公有成员函数 int gcount() const;输出流和输入流的常用成员函数输出流和输入流的常用成员函数函数函数功能功能putostream& put( char ch );无格式

14、无格式, ,插入一个插入一个字节字节writeostream& write( const char* pch, int nCount );从无格式从无格式, ,插入一字节序列插入一字节序列flush刷新输出流刷新输出流seekp移动输出流指针移动输出流指针tellp返回输出流中指定位置的指针值返回输出流中指定位置的指针值ostreamostream类的公有成员函数类的公有成员函数 用于字符输入的流成员函数l不带参数的get函数 cin.get( ) n功能功能n从输入流提取从输入流提取1个字符个字符; n函数返回值就是该字符函数返回值就是该字符.n若遇到若遇到文件结束符文件结束符,则返

15、回值为则返回值为EOF,即即 -1.n如: char ch; while ( (ch=cin.get()!=EOF) cout.put(ch); 键盘输入键盘输入: 显示显示: 键盘输入键盘输入:I study C+. (程序结束程序结束)I study C+. Ctrl+ZEOFEnd Of File字符输出的流成员函数,字符输出的流成员函数,功功能能在显示器上显示一个在显示器上显示一个字符字符用于字符输入的流成员函数2. 带1 个参数的get函数 cin.get(ch) n功能功能n从输入流提取从输入流提取1个字符放入个字符放入ch; n函数返回值就是非函数返回值就是非0值值n若遇到若遇到

16、文件结束符文件结束符,则返回值为则返回值为0n如: char ch; while ( cin.get(ch)!=0) cout.put(ch); 键盘输入键盘输入: 显示显示: 键盘输入键盘输入:I study C+. (程序结束程序结束)I study C+. Ctrl+Z用于字符输入的流成员函数3. 带3 个参数的get函数 cin.get(字符字符数组数组, 字符个数字符个数n, 终止字符终止字符)或或 cin.get(字符字符指针指针, 字符个数字符个数n, 终止字符终止字符)n功能功能n从输入流提取从输入流提取n-1个字符放入数组个字符放入数组; n函数返回值就是非函数返回值就是非0

17、值值n若遇到若遇到文件结束符文件结束符,则返回值为则返回值为0n如 char str20; cin.get(str, 10,“n”); coutstr; 键盘输入键盘输入: 显示显示: I study CI study C+. cin.get() 与 cin.getline() 的比较 cin.get(字符数组字符数组, 字符个数字符个数n, 终止字符终止字符) cin.getline(字符指针字符指针, 字符个数字符个数n, 终止字符终止字符)n相同之处:n从输入流提取从输入流提取n-1个字符放入数组个字符放入数组, n函数返回值是非函数返回值是非0值值.n若遇到文件结束符若遇到文件结束符,

18、则返回值为则返回值为0.n不同之处:n当读到终止字符时,当读到终止字符时,ncin.getline()将指针移到将指针移到终止字符之后终止字符之后。ncin.get() 将指针移到将指针移到终止字符处终止字符处。n则下次继续读取时的位置就不同。void main( ) char c1, c2, c3; char str180, str2100; cout输入三个字符输入三个字符:; c1=cin.get( ); cin.get(c2); cin.get(c3); cin.get( ); cout输入第一行字符串输入第一行字符串:; cin.get(str1,80); cin.get( ); c

19、out输入第二行字符串输入第二行字符串:; cin.getline(str2,80);cout.put(c1).put(c2). put(c3).put(n);cout.write(str1, 3); cout.write(str2, strlen(str2); cout.put(n); 输入形式如下:WEAbcdefAbcdefg输出结果?标识常量标识常量值值意义意义ios: goodbit0 x00状态正常状态正常ios: eofbit0 x01文件结束符,当文件结尾时设置该标志文件结束符,当文件结尾时设置该标志ios: failbit0 x02I/O操作失败,数据未丢失,可以恢复操作失败

20、,数据未丢失,可以恢复ios: badbit0 x04非法操作,数据丢失,不可恢复非法操作,数据丢失,不可恢复0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 1 00 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0流错误状态流错误状态所有流都把流的状态存储在状态字中所有流都把流的状态存储在状态字中不同标志位中存储不同的错误状态位不同标志位中存储不同的错误状态位包含在类包含在类iosios的的enumenum成员中成员中 ios ios 处理流错误状态的

21、公有成员函数处理流错误状态的公有成员函数 函数函数功能功能int eof() const;返回返回eofbit状态值。文件结束符时返回状态值。文件结束符时返回1,否则返回,否则返回0 int fail() const;返回返回failbit状态值状态值int good() const; eofbit、failbit和和badbit都没有被设置,则返回都没有被设置,则返回1 int bad() const;badbit被设置,则返回被设置,则返回1 (当发生严重错误:如数据(当发生严重错误:如数据丢失)丢失)int rdstate() const;返回状态字返回状态字void clear( in

22、t nState = 0 );恢复或设置状态字例如:恢复或设置状态字例如:clear(ios:failbit)流错误状态流错误状态#includeusing namespace std; int integerValue; / display results of cin functions cout Before a bad input operation: ncin.rdstate(): cin.rdstate() n cin.eof(): cin.eof() n cin.fail(): cin.fail() n cin.bad(): cin.bad() n cin.good(): cin

23、.good() integerValue; / enter character value cout endl; / display results of cin functions after bad input cout After a bad input operation: ncin.rdstate(): cin.rdstate() n cin.eof(): cin.eof() n cin.fail(): cin.fail() n cin.bad(): cin.bad() n cin.good(): cin.good() endl endl; cin.clear(); / clear

24、stream / display results of cin functions after clearing cin cout After cin.clear() ncin.fail(): cin.fail() ncin.good(): cin.good() xcoutxoutfile a b ;10.5.3 文本文件a 0X00f3b 0X004e文件和流文件和流0 1 2 3 4 5 2 4 3 7 8 a 0X00f3b 0X004eint c ;c = a + b ;fout c= c a b ;写文件写文件c 0X0141c = 3 2 1 n 文件和流文件和流文件操作文件操作文

25、件操作的基本步骤:文件操作的基本步骤:定义一个文件流对象定义一个文件流对象打开文件打开文件读读 / / 写文件写文件关闭文件关闭文件 使用文件流类,使用文件流类,必须包含头文件必须包含头文件#include文件操作文件操作 - -定义一个文件流对象定义一个文件流对象 如:如: /用于与一个用于与一个输入输入文件建立联系文件建立联系 ifstream infile; ifstream infile; / /用于与一个用于与一个输出输出文件建立联系文件建立联系 ofstream outfile; ofstream outfile; /用于与一个用于与一个输入输出输入输出文件建立联文件建立联 fst

26、ream iofile; fstream iofile; 文件操作文件操作- -打开文件打开文件 与外部文件关联;与外部文件关联; 指定文件的打开方式;指定文件的打开方式;有两种方式打开文件有两种方式打开文件方法方法1 1: 调用流类带参数的构造函数调用流类带参数的构造函数 建立流对象时连接外部文件建立流对象时连接外部文件 流类流类 对象名对象名 ( ( 文件名文件名 , , 方式方式 ) ;) ;文件操作文件操作- -打开文件打开文件 ifstream、ofstream 或或 fstream第二个参数表示文件的打开方式标识常量标识常量意义意义ios:in读方式打开文件读方式打开文件ios:o

27、ut写方式打开文件写方式打开文件ios:ate打开文件时,指针指向文件尾打开文件时,指针指向文件尾ios:app追加方式追加方式ios:trunc删除文件现有内容删除文件现有内容ios:binary二进制方式打开,默认为文本方式二进制方式打开,默认为文本方式ios:in|ios:out以输入和输出方式打开文件,文件可读以输入和输出方式打开文件,文件可读写写ios:out|ios:binary或者或者ios:in|ios:binary以二进制方式打开一个输出(或者输入)以二进制方式打开一个输出(或者输入)文件文件10.5.2 打开和关闭文件文件操作文件操作- -打开文件打开文件例如:例如:ifs

28、tream infile ( datafile.dat , ios:in ) ; ofstream outfile ( d:newfile.dat , ios:out );fstream rwfile ( myfile.dat , ios:in | ios:out ) ; ofstream ofile ( a:binary , ios : binary | ios : app ) ;用用 “| |”(或运算符)连接两(或运算符)连接两个表示打开方式的标识常量个表示打开方式的标识常量10.5.2 打开和关闭文件打开一个二进制文件进行追加操作打开一个二进制文件进行追加操作文件操作文件操作- -打开

29、文件打开文件 文件操作文件操作- -打开文件打开文件方法方法2 2 先建立流对象,后调用先建立流对象,后调用fstream:open()fstream:open()函函数连接外部文件数连接外部文件 流类流类 对象名对象名 ; ; 对象名对象名.open ( .open ( 文件名文件名 , , 方式方式 ) ;) ;打开文件成员函数打开文件成员函数 格式:格式:void fstream:open(const char *, int, int=filebuf:openprot);void ifstream:open(const char *, int=ios:in, int=filebuf:op

30、enprot);void ofstream:open(const char *, int=ios:out, int=filebuf:openprot);打开的文件名打开的文件名文件的打开方式文件的打开方式文件打开时的保护方式文件打开时的保护方式,如:独占打开如:独占打开无缺省值无缺省值参数参数 ios: 意义意义文件操作文件操作- -打开文件打开文件 打开一个已有文件打开一个已有文件datafile.datdatafile.dat,准备读:,准备读: ifstream infile ;ifstream infile ;/ / 建立输入文件流对象建立输入文件流对象 infile.open( in

31、file.open( “datafile.datdatafile.dat” , ios:in ) ; , ios:in ) ; / / 连接文件,指定打开方式连接文件,指定打开方式 打开(创建)一个文件打开(创建)一个文件newfile.datnewfile.dat,准备写:,准备写: ofstream outfile ;ofstream outfile ;/ / 建立输出文件流对象建立输出文件流对象 outfile.open( d:newfile.dat , ios:out ) ; outfile.open( d:newfile.dat , ios:out ) ; / / 连接文件,指定打开

32、方式连接文件,指定打开方式与与 cin 和和 cout 的用法相同的用法相同 如:如:infile x; outfile y;对文件进行读写操作对文件进行读写操作在对文件进行读写时,我们将文件看成在对文件进行读写时,我们将文件看成字符流字符流, 文件流文件流 读写位置指针读写位置指针随着文件的读写,指针移动。随着文件的读写,指针移动。 关闭文件操作包括把缓冲区数据完整地写入文件,关闭文件操作包括把缓冲区数据完整地写入文件,添加文件结束标志,切断流对象和外部文件的连接添加文件结束标志,切断流对象和外部文件的连接当一个流对象的生存期结束,系统也会自动关闭文当一个流对象的生存期结束,系统也会自动关闭

33、文件;件;若流对象的生存期没有结束,用若流对象的生存期没有结束,用close()close()关闭文件关闭文件 后,该流对象可以重用后,该流对象可以重用文件操作文件操作- -关闭文件关闭文件文件操作文件操作- -关闭文件关闭文件void ifstream:close( );void ofstream:close( );void fstream:close( );如:如:infile.close( ); /切断与输入文件切断与输入文件 myfile1.txt 的联系的联系 outfile.close( ); /切断与输出文件切断与输出文件 myfile2.txt 的联系的联系 iofile.cl

34、ose( ); /切断与输入输出文件切断与输入输出文件 myfile3.txt 的联系的联系文件读写完毕,必须关闭。文件读写完毕,必须关闭。 关闭文件成员函数关闭文件成员函数 格式格式 :eg: ofstream ofile ;ofstream ofile ;/ / 创建输出文件流创建输出文件流 ofile . open ( ofile . open ( “myfile1myfile1” , ios:outios:out ) ;) ; / ofile/ ofile流与文件流与文件“myfile1myfile1”相关联相关联 / / 访问访问文件文件“myfile1myfile1” ofile

35、. close ( ) ; ofile . close ( ) ;/ / 关闭关闭文件文件“myfile1myfile1” ofile . open ( ofile . open ( “myfile2myfile2”, ios:out ); ios:out ); / / 重用对象重用对象ofileofile等价于使用构造函数:等价于使用构造函数:ofstream ofile ( “myfile1” , ios:out ) ;10.5.2 打开和关闭文件文件操作文件操作- -关闭文件关闭文件close ( ) close ( ) 函数关闭文件函数关闭文件但流对象仍然存在但流对象仍然存在打开与关闭

36、错误打开与关闭错误if( !outfile) / 之前outfile.open(“myfile2.dat”) cerr” error: unable to open file2!”; 检测文件是否成功打开,可在条件表达式中使检测文件是否成功打开,可在条件表达式中使用取反操作符(!)测试流状态用取反操作符(!)测试流状态 (一般是读文件的时候用)一般是读文件的时候用)为了测试成功关闭文件,可以调用为了测试成功关闭文件,可以调用fail()fail()函数,如函数,如myfile2.close();if(myfile2.fail() cerrxy;myfile1.txt3 4内存内存infilex

37、y34用用infile代替代替myfile1.txt进行操作。进行操作。如何从文件中读出数据?ofstream outfile; /定义输出文件类对象定义输出文件类对象outfile.open(“myfile2.txt”); /利用函数打开某一文利用函数打开某一文件件 float x3 , y4;outfilextyxy;outfilextyendl;infile.close();outfile.close();myfile1.txt3 4内存内存infilexy34myfile2.txtoutfile34infile.close( );outfile.close( );用完文件后,使用成员函

38、数关闭文件文件读写文件读写 - - 文本文件(顺序文件)文本文件(顺序文件)文本文件文本文件 文件的每个字节都是用文件的每个字节都是用ASCIIASCII代码存放数据,代码存放数据, 即每个字节存放一个字符,这种文件又称字符文件即每个字节存放一个字符,这种文件又称字符文件 文件的默认打开方式为文本文件文件的默认打开方式为文本文件 文本文件是顺序存取文件文本文件是顺序存取文件 文本文件本身没有记录逻辑结构,文本文件本身没有记录逻辑结构, 通常一个逻辑记通常一个逻辑记录用换行符分隔;数据项之间可以用空白符、换行录用换行符分隔;数据项之间可以用空白符、换行 符、制表符等分隔。符、制表符等分隔。#in

39、clude #include using namespace std;void main( )int a10; ofstream outfile(“f1.dat”); /定义文件流对象,打开文件定义文件流对象,打开文件f1.dat if (!outfile) /若打开失败,返回若打开失败,返回 0值值 cerropen error!endl; exit(1); coutenter 10 integer numbers:endl; for(int i=0;iai; outfileai ; /向文件向文件f1.dat输出数据输出数据 outfile.close(); /关闭文件关闭文件f1.dat

40、 例23.11 有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组送到磁盘文件地f1.dat中存放。文件处理流程文件处理流程定义并打开文件对象定义并打开文件对象打开文件出错处理打开文件出错处理对文件进对文件进行行R/W操作操作关闭文件对象关闭文件对象#include #include using namespace std;void main ( ) ofstream ost ; ost.open (C:my2.txt ) ; ost 1234567890 endl ; int a = 123 ; ost a endl ; ost setw ( 10 ) a endl ; os

41、t setiosflags ( ios : left ) setfill ( # ) setw ( 10 ) a endl ; ost setiosflags ( ios : right ) setprecision ( 5 ) setw ( 10 ) 12.34567890 endl ; ost . close ( ) ; 例例:使用格式控制建立的文本文件使用格式控制建立的文本文件以指定格式以指定格式插入数据插入数据默认方式默认方式打开文本文件打开文本文件#include #include using namespace std;void main() ofstream out(test.t

42、xt ) ; if ( !out ) cout cannot open file. ; return ; out 10 123.45 ; out nThis is a short text file. ; out.close () ; 例:例: 将数据写入到将数据写入到文件文件对数值常量对数值常量做转换做转换#include #include using namespace std;void main () char ch ; int i ; float f ; char str1 10 , str2 10 ; ifstream in ( test.txt ) ; if ( ! in ) co

43、ut i f ch str1 str2 ; cout i “ ” f “ ” ch n ; cout str1 str2 endl ; in.close () ;ifstream inint i float f char chchar str1char str210.5.3 文本文件例例 从从文件文件 读出数据读出数据#include #include using namespace std; void main () char ch ; int i ; float f ; char str1 10 , str2 10 ; ifstream in ( test.txt ) ; if ( ! i

44、n ) cout i f ch str1 str2 ; cout i “ ” f “ ” ch n ; cout str1 str2 endl ; in.close () ;10.5.3 文本文件例例 :从:从文件文件 读出数据读出数据int i 10float f 123.45char ch Tchar str1 hischar str2 isostream cout#includeusing namespace std;void main() char str = tNew string ; ofstream f2 (test.txt , ios:app ) ; / 追加方式追加方式 if

45、 ( !f2 ) cout cannot open testnew for ouput. ; return ; f2 str ;/ 插入字符串插入字符串 f2.close () ;例在例在文件文件 testnew testnew 的末尾添加字符串的末尾添加字符串插入串插入串#include#include using namespace std;void main ( ) char ch ; ifstream f1 ( test.txt ) ; if ( !f1 ) cout cannot open test for input. ; return ; ofstream f2 ( testne

46、w.txt ) ; if ( !f2 ) cout cannot open testnew for ouput. ; return ; while ( f1 & f1.get(ch) ) f2.put( ch ) ; f1.close () ; f2.close () ; cout It is over !n ;ifstream f1ofstream f2ch10.5.3 文本文件例例: :复制数据到文件复制数据到文件 将文件将文件testtest的内容复制到的内容复制到testnew testnew 中中例例 将数值将数值1100及其平方根写入文件及其平方根写入文件 sqrttabl

47、e.txt #include #include #includeusing namespace std;void main( ) double x; ofstream out; / 定义一个输出流对象定义一个输出流对象 out.open(sqrttable.txt); / 打开文本文件打开文本文件sqrttable.txt for(x=1; x=100; x+)outxtsqrt(x)endl; / 将结果写入文件将结果写入文件 out.close( ); / 关闭文件关闭文件例例 编写一个程序,用于显示一个文本文件编写一个程序,用于显示一个文本文件 #include #include usi

48、ng namespace std;void main( )char filename40, line80;ifstream infile; coutfilename; / A infile.open(filename); / B 如果打开不成功,如果打开不成功, infile 为为 0if(!infile) coutCan not open file: filenameendl;exit(1);while(infile.getline(line, 80) / 读入一行读入一行coutlinech) / 读入一个字符读入一个字符 coutch; / 显示一个字符显示一个字符例例 从一个文本文件从

49、一个文本文件source.txt中读入若干整数,中读入若干整数, 用选择法将这些数据排成升序,用选择法将这些数据排成升序, 将排序后的结果写入将排序后的结果写入 另一个文件文本文件另一个文件文本文件target.txt中中事前准备数据文件:事前准备数据文件: source.txt #include #include using namespace std;void sort(int *a, int n) /一般的选择法排序函数int i, j, p, t;for(i=0; in-1; i+)p=i;for(j=i+1; jn; j+)if(ajap) p=j;if(p!=i) t=ai;ai=

50、ap; ap=t; void main( )int a100, i, n;fstream in, out; in.open(c:source.txt, ios:in); if(!in) coutCan not open source.txt!endl;exit(1); out.open(c:target.txt, ios:out); if(!out) coutCan not open target.txt!ai) i+; /循环结束后,i是整数的个数sort(a, i ); n=i; for(i=0; in; i+) outaiendl; in.close( ); out.close( );

51、文件读写文件读写 -二进制文件(随机存取文件)二进制文件(随机存取文件) 二进制文件以基本类型数据在内存的二进制表示形式二进制文件以基本类型数据在内存的二进制表示形式 存放数据,不对写入或读出的数据做格式转换存放数据,不对写入或读出的数据做格式转换 ;打开二进制文件用打开二进制文件用ios:binaryios:binary方式方式 ;二进制文件的读写方式由程序控制二进制文件的读写方式由程序控制 ;二进制文件是随机存取文件二进制文件是随机存取文件 。23.4.5 对二进制文件的操作若在文件的打开方式中没有特别说明,打开的文件均为若在文件的打开方式中没有特别说明,打开的文件均为ASCII码码文件,

52、文件,若要打开二进制文件,则要特别说明并用特定的读写函数若要打开二进制文件,则要特别说明并用特定的读写函数。fstream infile,outfile;infile.open(“inf1.dat”, ios:in| ios:binary);outfile.open(“outf1.dat”, ios:out| ios:binary); 文件名文件名 输入方式打开输入方式打开 二进制文件二进制文件 文件名文件名 输出方式打开输出方式打开 二进制文件二进制文件1. 文件的读写操作(成块读写)文件的读写操作(成块读写)成员函数:成员函数:istream & istream:read( cha

53、r *, int );istream & istream:read( unsigned char *, int );istream & istream:read( signed char *, int );ostream & ostream:write( const char *, int );ostream & ostream:write( const unsigned char *, int );ostream & ostream:write( const signed char *, int );前三个为读取操作前三个为读取操作:将第二个参数指定的

54、字节数读入到:将第二个参数指定的字节数读入到 以第一个参数为起始地址的内存中。以第一个参数为起始地址的内存中。 后三个为写操作后三个为写操作:从第一个参数为起始地址的内存开始,:从第一个参数为起始地址的内存开始, 将连续的第二个参数指定字节数的将连续的第二个参数指定字节数的 内容写到文件中。内容写到文件中。 0 1 2 3 4 5 n-1文件指针文件指针10.5.1 文件和流ios:begios:curios:end二进制文件的顺序读写二进制文件的顺序读写流的状态表示:流的内容、长度和操作位置流的状态表示:流的内容、长度和操作位置 ostream 类中两个操作字节数据的成员函数类中两个操作字节

55、数据的成员函数 ofstream outf( test.dat , ios:out | ios:binary ) ; int a10 =1,2,3,4,5; for(int i = 0; i 10 ; i + ) outf.write( (char *) (&ai), sizeof(int) ) ; outf.close(); 二进制文件的顺序读写二进制文件的顺序读写outf.write(reinterpret_cast (a) , 10*sizeof(int); istream 类中操作字节数据的成员函数类中操作字节数据的成员函数 get ( char & c ) ; c =

56、 get ( ) ; getline ( char * buffer , int size, char = n) ;10.5.4 二进制文件istream & istream : read ( char * buf , int n ) ;从流中提取从流中提取 n 个字节数据,更新对象个字节数据,更新对象 buf ifstream inf( test.dat , ios:in| ios:binary ) ;int buffer10; for( int j = 0; j10 ; j + ) inf.read(char*) &bufferj, sizeof(int) );inf.re

57、ad( reinterpret_cast(buffer), 10*sizeof(int) ) ; 注意类型转换注意类型转换二进制文件的顺序读写二进制文件的顺序读写例23.14 将一批数据以二进制形式存放在磁盘文件中。#include #include using namespace std;struct student char name20; int num; int age; char sex;void main( )student stud3=“Li”,1001,18, f, “Fun”,1002,19,m, “Wang”,1004,17,f; ofstream outfile(“stu

58、d.dat”, ios:out | ios:binary); if(!outfile) cerropen error!endl; abort( ); /退出程序 for(int i=0; i3; i+) outfile.write(char*)&studi, sizeof(studi);outfile.close( );可以一次输出整个数组到磁盘文件:outfile.write(char*)&stud0, sizeof(stud);n用此方法一次可以输出一批数据,效率较高。用此方法一次可以输出一批数据,效率较高。n在输出的数据之间不必加入空格,在一次输出之后也不必加在输出的数据

59、之间不必加入空格,在一次输出之后也不必加回车换行符。回车换行符。n在以后从该文件读入数据时不是靠空格作为数据的间隔,而在以后从该文件读入数据时不是靠空格作为数据的间隔,而是用字节数来控制。是用字节数来控制。例23.14 将一批数据以二进制形式存放在磁盘文件中例23.15 将刚才以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。#include #include using namespace std;struct studentstring name; int num; int age; char sex;void main( )student stud3; int i; ifstr

60、eam infile(“stud.dat”, ios:in | ios:binary); if(!infile) cerr“open error!”endl; abort( ); for(i=0;i3;i+) infile.read(char*)&studi , sizeof(studi); infile.close( ); for(i=0;i3;i+) cout“NO.”i+1endl; cout“name:”endl; cout“num:” studi.numendl; cout“age:” studi.ageendl; cout“sex:”studi.sexendlendl; 问题:问题:能否一次读入文件中的全部数据,如能否一次读入文件中的全部数据,如 infile.read( (char*)&stud0 , sizeof(st

温馨提示

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

评论

0/150

提交评论