1、 I/OI/O(输入(输入/输出)流类库提供对象之间的数据交互服务输出)流类库提供对象之间的数据交互服务 流类库预定义了一批流对象,连接常用的外部流类库预定义了一批流对象,连接常用的外部输入输入/输出输出设备设备 用户可以定义所需的用户可以定义所需的I/OI/O流对象,使用流库提供的一些功能,流对象,使用流库提供的一些功能,实现数据传输实现数据传输流类库流类库 流流类类库(库(stream librarystream library)是用继承方法建立的输入输出类库)是用继承方法建立的输入输出类库 流流类类库具有两个平行的基类:库具有两个平行的基类:streambuf streambuf 和和
2、ios ios 类,所有流类类,所有流类库均以两者之一作为基类库均以两者之一作为基类 streambuf streambuf 类提供对缓冲区的低级操作类提供对缓冲区的低级操作设置缓冲区设置缓冲区,对缓冲区指针进行操作向缓冲区存对缓冲区指针进行操作向缓冲区存/取字符取字符 ios ios 类及其派生类提供用户使用流类的接口,支持对类及其派生类提供用户使用流类的接口,支持对streambuf streambuf 的缓冲区输入的缓冲区输入/输出的格式化或非格式化转换输出的格式化或非格式化转换streambuf对缓冲区的低级操作filebufstrstreambufstdiobufstreambuf对
3、缓冲区的低级操作filebufstrstreambufstdiobuf文件缓冲区管理streambuf对缓冲区的低级操作filebufstrstreambufstdiobuf字符串缓冲区管理streambuf对缓冲区的低级操作filebufstrstreambufstdiobuf标准I/O缓冲区管理提供用户接口提供用户接口iosistreamostreamiostreamfstreamstrstreamstdiostreamistream_withassignifstreamistrstreamostream_withassignofstreamostrstream提供用户接口提供用户接口io
4、sistreamostreamiostreamfstreamstrstreamstdiostreamistream_withassignifstreamistrstreamostream_withassignofstreamostrstream输入流输入流输出流输出流提供用户接口提供用户接口iosistreamostreamiostreamfstreamstrstreamstdiostreamistream_withassignifstreamistrstreamostream_withassignofstreamostrstream输入流输入流输出流输出流输入文件流输入文件流输入串流输入串流
5、输出串流输出串流输出文件流输出文件流提供用户接口提供用户接口iosistreamostreamiostreamfstreamstrstreamstdiostreamistream_withassignifstreamistrstreamostream_withassignofstreamostrstream输入流输入流输出流输出流输入文件流输入文件流输入串流输入串流输出串流输出串流输出文件流输出文件流输入输入/输出流输出流提供用户接口提供用户接口iosistreamostreamiostreamfstreamstrstreamstdiostreamistream_withassignifstr
6、eamistrstreamostream_withassignofstreamostrstream输入流输入流输出流输出流输入文件流输入文件流输入串流输入串流输出串流输出串流输出文件流输出文件流输入输入/输出流输出流输入输入/输出文件流输出文件流输入输入/输出串流输出串流标准输入标准输入/输出流输出流提供用户接口提供用户接口iosistreamostreamiostreamfstreamstrstreamstdiostreamistream_withassignifstreamistrstreamostream_withassignofstreamostrstream输入流输入流输出流输出流输
7、入文件流输入文件流输入串流输入串流输出串流输出串流输出文件流输出文件流输入输入/输出流输出流输入输入/输出文件流输出文件流输入输入/输出串流输出串流标准输入标准输入/输出流输出流重载运算符重载运算符“=”重载运算符重载运算符“=”提供用户接口提供用户接口iosistreamostreamiostreamfstreamstrstreamstdiostreamistream_withassignifstreamistrstreamostream_withassignofstreamostrstream输入流输入流输出流输出流输入文件流输入文件流输入串流输入串流输出串流输出串流输出文件流输出文件流输
8、入输入/输出流输出流输入输入/输出文件流输出文件流输入输入/输出串流输出串流标准输入标准输入/输出流输出流重载运算符重载运算符“=”重载运算符重载运算符“=”文件是由一系列数据构成的序列。文件是由一系列数据构成的序列。例如,一组计算或处理结果可以构成一个文件。例如,一组计算或处理结果可以构成一个文件。一个班所有学生的档案数据也可以构成一个文件。一个班所有学生的档案数据也可以构成一个文件。每个文件的内容都保存在外存储器中,每个文件都有一个名字,每个文件的内容都保存在外存储器中,每个文件都有一个名字,这个名字用标识符来表示。这个名字用标识符来表示。把数据存放在外存储器是以文件的方式进行,从外存储器
9、把数把数据存放在外存储器是以文件的方式进行,从外存储器把数据取出来也以文件的方式进行。据取出来也以文件的方式进行。在在C+C+中,必须使用文件来解决数据的存储问题。中,必须使用文件来解决数据的存储问题。C+C+语言系统把文件看成无结构的字节流。语言系统把文件看成无结构的字节流。根据文件中数据的编码方式可以把文件分为文本文件和二进制根据文件中数据的编码方式可以把文件分为文本文件和二进制文件。文件。根据文件中数据的存取方式可以把文件分为顺序文件和随机文根据文件中数据的存取方式可以把文件分为顺序文件和随机文件件 。在在C+C+中,要进行数据的存取需要使用三个类:文件输入流类中,要进行数据的存取需要使
10、用三个类:文件输入流类ifstreamifstream、文件输出流类、文件输出流类ofstream ofstream 和文件输入输出流类和文件输入输出流类fstream fstream。文件输入流类文件输入流类ifstreamifstream:提取文件中的数据到内存。:提取文件中的数据到内存。文件输出流类文件输出流类ofstreamofstream:把内存中的数据插入到文件。:把内存中的数据插入到文件。文件输入输出流类文件输入输出流类fstreamfstream:上述两种功能都有。:上述两种功能都有。11.5.111.5.1 文件和流文件和流0 1 2 3 4 5 n-1文件字节序号文件结束符
11、文件长度=n11.5.111.5.1 文件和流文件和流0 1 2 3 4 5 n-1文件指针11.5.111.5.1 文件和流文件和流0 1 2 3 4 5 n-1文件结束11.5.111.5.1 文件和流文件和流0 1 2 3 4 5 n-1 文件中字节存放的都是数据的编码,这些编码可以是各种信息文件中字节存放的都是数据的编码,这些编码可以是各种信息的编码。应用程序对字节序列可以作出各种类型数据或其它信息的的编码。应用程序对字节序列可以作出各种类型数据或其它信息的解释。解释。如果文件中的每一个字节存放的是如果文件中的每一个字节存放的是ASCASC码,则每个字节表示一码,则每个字节表示一个字符
12、。个字符。以以ASCASC码方式存放数据的文件称为文本文件。文本文件是一种码方式存放数据的文件称为文本文件。文本文件是一种顺序文件。顺序文件。在文本文件中,需要使用一个表示文件结束的标识常量在文本文件中,需要使用一个表示文件结束的标识常量EOFEOF,它在它在iostreamiostream中定义,值为中定义,值为26(0 x1A)26(0 x1A)。关闭文件后,该字符被自动。关闭文件后,该字符被自动添加到文件的尾部。添加到文件的尾部。以二进制代码方式存放数据的文件称为二进制文件。以二进制代码方式存放数据的文件称为二进制文件。二进制文件是一种随机文件。二进制文件是一种随机文件。当把内存中的数据
13、存放到二进制文件时,当把内存中的数据存放到二进制文件时,C+C+把数据把数据转换成二进制代码写到二进制文件中去。转换成二进制代码写到二进制文件中去。当从二进制文件中取数据时,当从二进制文件中取数据时,C+C+把文件中的字节流把文件中的字节流解释为各种类型数据读出来存放到内存。解释为各种类型数据读出来存放到内存。0 1 2 3 4 5 n-1-内存-ifstream ofstream 读文件写文件11.5.2 11.5.2 打开和关闭文件打开和关闭文件 文件操作的基本步骤:文件操作的基本步骤:1.1.打开文件打开文件2.2.读读 /写文件写文件3.3.关闭文件关闭文件 1.1.打开文件打开文件包
14、括建立文件流对象;调用open()函数连接外部文件。打开文件有两种方法:(1)首先建立流对象,然后调用open()函数连接外部文件流类流类 对象名对象名;对象名对象名.open(文件名文件名,方式方式);ifstream、ofstream 或 fstream标识常量值意义ios:in0 x0001读方式打开文件ios:out0 x0002写方式打开文件ios:ate0 x0004打开文件时,指针指向文件尾ios:app0 x0008追加方式ios:trunc0 x0010删除文件现有内容ios:nocreate0 x0020如果文件不存在,则打开操作失败ios:noreplace0 x0040
15、如果文件存在,则打开操作失败ios:binary0 x0080二进制方式打开,默认为文本方式例如:例如:打开一个已有文件datafile.dat,准备读:ifstream infile;/建立输入文件流对象 infile.open(datafile.dat,ios:in);/连接文件,指定打开方式 打开(创建)一个文件newfile.dat,准备写:ofstream outfile;/建立输出文件流对象 outfile.open(d:newfile.dat,ios:out);/连接文件,指定打开方式(2)调用流类带参数的构造函数,建立流对象的同时连接外部文件流类流类 对象名对象名(文件名文件名
16、,方式方式);ifstream、ofstream 或 fstream例如例如:ifstream infile(datafile.dat,ios:in);ofstream outfile(d:newfile.dat,ios:out);fstream rwfile(myfile.dat,ios:in|ios:out);用或运算符“|”连接两个表示打开方式的标识常量2.2.关闭文件关闭文件例如:例如:ofstream ofile;/创建输出文件流 ofile.open(myfile1,ios:out);/ofile流与文件“myfile1”相关联 /访问文件“myfile1”ofile.close(
17、);/关闭文件“myfile1”ofile.open(myfile2,ios:out);/重用ofile流 关闭文件操作的作用是把缓冲区数据完整地写入文件,添加关闭文件操作的作用是把缓冲区数据完整地写入文件,添加文件结束标志,切断流对象和外部文件的连接文件结束标志,切断流对象和外部文件的连接。关闭文件要使用流类的成员函数关闭文件要使用流类的成员函数close()。当一个流对象的生存期结束,系统也会自动关闭文件当一个流对象的生存期结束,系统也会自动关闭文件。#include int main()ofstream ost;ost.open(a:my1.dat ,ios:out);ost 20 en
18、dl;ost 30.5 n d;cout n endl d endl;open()和和 close()函数应用函数应用#include int main()ofstream ost;ost.open(a:my1.dat ,ios:out);ost 20 endl;ost 30.5 n d;cout n endl d endl;open()和和 close()函数应用函数应用/创建输出流对象#include int main()ofstream ost;ost.open(a:my1.dat ,ios:out);ost 20 endl;ost 30.5 n d;cout n endl d endl
19、;open()和和 close()函数应用函数应用/创建输出流对象/建立文件关联,缺省为文本模式#include int main()ofstream ost;ost.open(a:my1.dat ,ios:out);ost 20 endl;ost 30.5 n d;cout n endl d endl;open()和和 close()函数应用函数应用/创建输出流对象/建立文件关联,缺省为文本模式/向流插入数据#include int main()ofstream ost;ost.open(a:my1.dat ,ios:out);ost 20 endl;ost 30.5 n d;cout n
20、endl d endl;open()和和 close()函数应用函数应用/创建输出流对象/建立文件关联,缺省为文本模式/向流插入数据/关闭文件#include int main()ofstream ost;ost.open(a:my1.dat ,ios:out);ost 20 endl;ost 30.5 n d;cout n endl d endl;open()和和 close()函数应用函数应用/创建输出流对象/建立文件关联,缺省为文本模式/向流插入数据/关闭文件/创建输入流对象并建立关联#include int main()ofstream ost;ost.open(a:my1.dat ,
21、ios:out);ost 20 endl;ost 30.5 n d;cout n endl d endl;open()和和 close()函数应用函数应用/创建输出流对象/建立文件关联,缺省为文本模式/向流插入数据/关闭文件/创建输入流对象并建立关联/从流提取数据#include int main()ofstream ost;ost.open(a:my1.dat ,ios:out);ost 20 endl;ost 30.5 n d;cout n endl d endl;open()和和 close()函数应用函数应用/创建输出流对象/建立文件关联,缺省为文本模式/向流插入数据/关闭文件/创建输
22、入流对象并建立关联/从流提取数据/向预定义流插入数据#include int main()ofstream ost;ost.open(a:my1.dat ,ios:out);ost 20 endl;ost 30.5 n d;cout n endl d a b;0 1 2 3 4 5 ifstream fin读文件2 4 3 7 8 int a,b;fin a b;a 0X00f30 1 2 3 4 5 ifstream fin读文件2 4 3 7 8 int a,b;fin a b;a 0X00f3b 0X004e0 1 2 3 4 5 2 4 3 7 8 int a,b;fin a b;a
23、0X00f3b 0X004eint c;c=a*b;fout c=c a b;a 0X00f3b 0X004eint c;c=a*b;fout c=c a b;a 0X00f3b 0X004eint c;c=a*b;fout c=c a b;a 0X00f3b 0X004eint c;c=a*b;fout c=c a b;a 0X00f3b 0X004eint c;c=a*b;fout c=c a b;a 0X00f3b 0X004eint c;c=a*b;fout c=c a b;a 0X00f3b 0X004eint c;c=a*b;fout c=cendl;ofstream foutc
24、0X01412 4 3 7 8 c =3 2 1 n#include#include int main()ofstream ost;ost.open(a:my2.dat);ost 1234567890 endl;int a=123;ost a endl;ost setw(10)a endl;ost resetiosflags(ios:right)setiosflags(ios:left)setfill(#)setw(10)a endl;ost resetiosflags(ios:left)setiosflags(ios:right)setprecision(5)setw(10)12.34567
25、890 endl;ost.close();使用格式控制建立的文本文件使用格式控制建立的文本文件#include#include int main()ofstream ost;ost.open(a:my2.dat);ost 1234567890 endl;int a=123;ost a endl;ost setw(10)a endl;ost resetiosflags(ios:right)setiosflags(ios:left)setfill(#)setw(10)a endl;ost resetiosflags(ios:left)setiosflags(ios:right)setprecisi
26、on(5)setw(10)12.34567890 endl;ost.close();使用格式控制建立的文本文件使用格式控制建立的文本文件建立输出文件流对象#include#include int main()ofstream ost;ost.open(a:my2.dat);ost 1234567890 endl;int a=123;ost a endl;ost setw(10)a endl;ost resetiosflags(ios:right)setiosflags(ios:left)setfill(#)setw(10)a endl;ost resetiosflags(ios:left)se
27、tiosflags(ios:right)setprecision(5)setw(10)12.34567890 endl;ost.close();使用格式控制建立的文本文件使用格式控制建立的文本文件默认方式打开文本文件#include#include int main()ofstream ost;ost.open(a:my2.dat);ost 1234567890 endl;int a=123;ost a endl;ost setw(10)a endl;ost resetiosflags(ios:right)setiosflags(ios:left)setfill(#)setw(10)a end
28、l;ost resetiosflags(ios:left)setiosflags(ios:right)setprecision(5)setw(10)12.34567890 endl;ost.close();使用格式控制建立的文本文件使用格式控制建立的文本文件插入字符串#include#include int main()ofstream ost;ost.open(a:my2.dat);ost 1234567890 endl;int a=123;ost a endl;ost setw(10)a endl;ost resetiosflags(ios:right)setiosflags(ios:le
29、ft)setfill(#)setw(10)a endl;ost resetiosflags(ios:left)setiosflags(ios:right)setprecision(5)setw(10)12.34567890 endl;ost.close();使用格式控制建立的文本文件使用格式控制建立的文本文件把整型数转换成字符串#include#include int main()ofstream ost;ost.open(a:my2.dat);ost 1234567890 endl;int a=123;ost a endl;ost setw(10)a endl;ost resetiosfla
30、gs(ios:right)setiosflags(ios:left)setfill(#)setw(10)a endl;ost resetiosflags(ios:left)setiosflags(ios:right)setprecision(5)setw(10)12.34567890 endl;ost.close();使用格式控制建立的文本文件使用格式控制建立的文本文件以指定格式插入数据使用格式控制建立的文本文件使用格式控制建立的文本文件#include#include int main()ofstream ost;ost.open(a:my2.dat);ost 1234567890 endl
31、;int a=123;ost a endl;ost setw(10)a endl;ost resetiosflags(ios:right)setiosflags(ios:left)setfill(#)setw(10)a endl;ost resetiosflags(ios:left)setiosflags(ios:right)setprecision(5)setw(10)12.34567890 endl;ost.close();#include int main()ofstream out(a:test);if(!out)cout cannot open file.;return;out 10
32、 123.45 ;out nThis is a short text file.;out.close();把一个整数、一个浮点数和一个串写到把一个整数、一个浮点数和一个串写到文件文件 a:test 中中对数值常量做转换#include int main()char ch;int i;float f;char str1 10 ,str2 10 ;ifstream in(a:test);if (!in)cout i f ch str1 str2;cout i ends f ends ch n;cout str1 str2 endl;in.close();从文件从文件 a:test 中读出中读出一个
33、整数、一个浮点数、一个字符和两个串一个整数、一个浮点数、一个字符和两个串ifstream inint i float f char chchar str1char str2#include int main()char ch;int i;float f;char str1 10 ,str2 10 ;ifstream in(a:test);if (!in)cout i f ch str1 str2;cout i ends f ends ch n;cout str1 str2 endl;in.close();从文件从文件 a:test 中读出中读出一个整数、一个浮点数、一个字符和两个串一个整数、一
34、个浮点数、一个字符和两个串ifstream inint ifloat f char chchar str1char str210#include int main()char ch;int i;float f;char str1 10 ,str2 10 ;ifstream in(a:test);if (!in)cout i f ch str1 str2;cout i ends f ends ch n;cout str1 str2 endl;in.close();从文件从文件 a:test 中读出中读出一个整数、一个浮点数、一个字符和两个串一个整数、一个浮点数、一个字符和两个串ifstream
35、infloat f char chchar str1char str2123.45int i 10#include int main()char ch;int i;float f;char str1 10 ,str2 10 ;ifstream in(a:test);if (!in)cout i f ch str1 str2;cout i ends f ends ch n;cout str1 str2 endl;in.close();从文件从文件 a:test 中读出中读出一个整数、一个浮点数、一个字符和两个串一个整数、一个浮点数、一个字符和两个串ifstream inchar chchar s
36、tr1char str2Tint i 10float f 123.45#include int main()char ch;int i;float f;char str1 10 ,str2 10 ;ifstream in(a:test);if (!in)cout i f ch str1 str2;cout i ends f ends ch n;cout str1 str2 endl;in.close();从文件从文件 a:test 中读出中读出一个整数、一个浮点数、一个字符和两个串一个整数、一个浮点数、一个字符和两个串ifstream inchar str1char str2hisint i
37、10float f 123.45char ch T#include int main()char ch;int i;float f;char str1 10 ,str2 10 ;ifstream in(a:test);if (!in)cout i f ch str1 str2;cout i ends f ends ch n;cout str1 str2 endl;in.close();从文件从文件 a:test 中读出中读出一个整数、一个浮点数、一个字符和两个串一个整数、一个浮点数、一个字符和两个串ifstream inchar str2isint i 10float f 123.45char
38、 ch Tchar str1 his#include int main()char ch;int i;float f;char str1 10 ,str2 10 ;ifstream in(a:test);if (!in)cout i f ch str1 str2;cout i ends f ends ch n;cout str1 str2 endl;in.close();从文件从文件 a:test 中读出中读出一个整数、一个浮点数、一个字符和两个串一个整数、一个浮点数、一个字符和两个串int i 10float f 123.45char ch Tchar str1 hischar str2 i
39、sostream cout#include int main()char ch;ifstream f1(a:test);if (!f1)cout cannot open test for input.;return;ofstream f2(a:testnew);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;把文件把文件 a:test 复制到文件复制到文件 a:testnew 中中#include in
40、t main()char ch;ifstream f1(a:test);if (!f1)cout cannot open test for input.;return;ofstream f2(a:testnew);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;ch把文件把文件 a:test 复制到文件复制到文件 a:testnew 中中#include int main()char ch;ifstre
41、am f1(a:test);if (!f1)cout cannot open test for input.;return;ofstream f2(a:testnew);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 f1ch把文件把文件 a:test 复制到文件复制到文件 a:testnew 中中#include int main()char ch;ifstream f1(a:tes
42、t);if (!f1)cout cannot open test for input.;return;ofstream f2(a:testnew);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 f1chofstream f2把文件把文件 a:test 复制到文件复制到文件 a:testnew 中中#include int main()char ch;ifstream f1(a:tes
43、t);if (!f1)cout cannot open test for input.;return;ofstream f2(a:testnew);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 f2ch把文件把文件 a:test 复制到文件复制到文件 a:testnew 中中#include int main()char ch;ifstream f1(a:tes
44、t);if (!f1)cout cannot open test for input.;return;ofstream f2(a:testnew);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 f2ch把文件把文件 a:test 复制到文件复制到文件 a:testnew 中中#include int main()char ch;ifstream f1(a:tes
45、t);if (!f1)cout cannot open test for input.;return;ofstream f2(a:testnew);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 f2ch把文件把文件 a:test 复制到文件复制到文件 a:testnew 中中#include int main()char ch;ifstream f1(a:tes
46、t);if (!f1)cout cannot open test for input.;return;ofstream f2(a:testnew);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;把文件把文件 a:test 复制到文件复制到文件 a:testnew 中中#includeint main()char str=tNew string;ofstream f2(a:testnew,ios:app
47、);/追加方式 if(!f2)cout cannot open testnew for ouput.;return ;f2 str;/插入字符串 f2.close();在文件在文件 a:testnew 的末尾添加字符串的末尾添加字符串插入串建立一个包含学生学号、姓名、成绩的文本文件建立一个包含学生学号、姓名、成绩的文本文件#include#include using namespace std;int main()char fileName30,name30;int number,score;ofstream outstuf;cout fileName;outstuf.open(fileNam
48、e,ios:out);if(!outstuf)cerr File could not be open.endl;abort();outstuf 学生成绩文件n;cout number name score)outstuf number name score n;cout?;outstuf.close();建立一个包含学生学号、姓名、成绩的文本文件建立一个包含学生学号、姓名、成绩的文本文件#include#include using namespace std;int main()char fileName30,name30;int number,score;ofstream outstuf;c
49、out fileName;outstuf.open(fileName,ios:out);if(!outstuf)cerr File could not be open.endl;abort();outstuf 学生成绩文件n;cout number name score)outstuf number name score n;cout?;outstuf.close();/建立输出文件流对象建立一个包含学生学号、姓名、成绩的文本文件建立一个包含学生学号、姓名、成绩的文本文件#include#include using namespace std;int main()char fileName30
50、,name30;int number,score;ofstream outstuf;cout fileName;outstuf.open(fileName,ios:out);if(!outstuf)cerr File could not be open.endl;abort();outstuf 学生成绩文件n;cout number name score)outstuf number name score n;cout?;outstuf.close();/建立输出文件流对象/输入文件名建立一个包含学生学号、姓名、成绩的文本文件建立一个包含学生学号、姓名、成绩的文本文件#include#incl
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。