《13 输入输出流.ppt》由会员分享,可在线阅读,更多相关《13 输入输出流.ppt(67页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第13章 输入输出流13.1 C+的输入输出13.2 标准输出流13.3 标准输入流13.4 文件操作与文件流13.1 C+的输入和输出(I/O)n输入和输出,要看以什么为对象 n以标准I/O设备为对象n从键盘、鼠标得到的数据是进入从键盘、鼠标得到的数据是进入内存内存的,该数据是输入数据。的,该数据是输入数据。n将数据从将数据从内存内存送到显示器、打印机等,该数据是输出数据。送到显示器、打印机等,该数据是输出数据。n以外存磁盘文件为对象n内存中的数据内存中的数据存储到磁盘文件中,叫输出文件;存储到磁盘文件中,叫输出文件;n从磁盘文件中的数据装载入从磁盘文件中的数据装载入内存中内存中,叫输入文件
2、。,叫输入文件。n以内存中指定的空间作为对象n常指定一个字符数组作为存储空间,这种常指定一个字符数组作为存储空间,这种I/O称为字符串的输入称为字符串的输入输出。输出。nC+采取不同的方法实现以上三种采取不同的方法实现以上三种I/O。标准标准I/O文件文件I/O串串I/On数据之间的传输过程称作流(stream)n输输入入流流表表示示数数据据从从某某个个载载体体或或设设备备传传送送到内存到内存n输输出出流流表表示示数数据据从从内内存存传传送送到到某某个个载载体体或设备或设备C+的输入输出流内内存存键盘键盘文件文件光笔光笔.输入流输入流显示器显示器文件文件打印机打印机.输出流输出流n在进行I/O
3、操作时n首先进行首先进行“打开打开”操作,使流和文件发生联系操作,使流和文件发生联系n建立联系后的文件才允许数据流入或流出建立联系后的文件才允许数据流入或流出nI/O结束后,使用结束后,使用“关闭关闭”操作使文件与流断开联系。操作使文件与流断开联系。nC+将I/O流定义为类流类。属于流类的对象是流对象n系系统统已已经经以以运运算算符符或或函函数数的的形形式式做做好好了了对对标标准准外外设设(键键盘盘、显显示示器器、打打印印机机、文文件件)的的接接口口,使使用用时时只需按照要求的格式调用即可。只需按照要求的格式调用即可。n如:如:cin 标准输入流对象。标准输入流对象。cout 标准输出流对象。
4、标准输出流对象。C+的输入输出流类的定义n类是一种复杂的数据类型n它是将它是将不同类型的数据不同类型的数据和和与这些数据相关的运算与这些数据相关的运算封装在一起的集合体。封装在一起的集合体。n它使类中的数据得到很好的它使类中的数据得到很好的“保护保护”,在大型程,在大型程序中不会被随意修改。序中不会被随意修改。n在C+中,结构体类型只是类的一个特例 实例化实例化圆类圆类 数据成员数据成员 半径半径 成员函数成员函数 置半径值置半径值 求周长求周长 求面积求面积类的变量即为对象。类的变量即为对象。对象是类的实例对象是类的实例C+的各种I/O流类库nC+为实现数据的I/O定义了一个庞大的类库。它包
5、括的类主要有C+I/O类库中的其他类包含头文件n在一个程序中包含一个头文件的命令格式为#include n常用的I/O类库有I/O操作类型必须包含的头文件需要进行需要进行标准标准I/O操作操作iostream需要进行需要进行文件文件I/O操作操作fstream需要进行需要进行串串I/O操作操作strstream使用使用格式化格式化I/Oiomanip在iostream中定义的4个流对象 cin,cout,cerr,clog对象含义对应设备对应的类cin标准输入流标准输入流键盘键盘istream_withassigncout标准输出流标准输出流显示器显示器ostream_withassignce
6、rr或或clog标准错误流标准错误流13.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流对象的不同之处ncout的输出默认是显示器的输出默认是显示器,但可以被重定
7、向为输出到磁但可以被重定向为输出到磁盘文件盘文件ncerr只能定向输出到显示器只能定向输出到显示器 例13.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;标准输出流n标准输出流流向
8、标准输出设备(显示器)的数据nclog流对象在控制台(显示器)输出错误信息.n用用流插入运算符流插入运算符“”向向clog输出数据输出数据.n如如:clog “除数为除数为0,出错出错!”endl;n clog的用法与的用法与cerr类似类似.nclog流对象与cerr流对象的不同之处ncerr是不经过缓冲区,直接向显示器输出有关信息。是不经过缓冲区,直接向显示器输出有关信息。nclog的输出先存储在缓冲区,遇到缓冲区满或遇到的输出先存储在缓冲区,遇到缓冲区满或遇到endl时才向显时才向显示器输出。示器输出。使用控制符控制格式输出控制符作用dec设置整数的基数为设置整数的基数为10hex设置整
9、数的基数为设置整数的基数为16oct设置整数的基数为设置整数的基数为8setfill(c)设置填充字符设置填充字符csetprecision(n)设置实数的显示精度为设置实数的显示精度为n位位setw(n)设置字段宽度为设置字段宽度为nsetiosflags(ios:fixed)实数以固定的小数位数显示实数以固定的小数位数显示#include#include using namespace std;void main()int a;cout a;/a=34 cout“dec:”decaendl;cout“hex:”hexaendl;cout“oct:”octaendl;coutsetfill(
10、*)setw(10)decaab;/从键盘输入2个整数n当输入时n遇到无效的字符遇到无效的字符n或遇到文件结束符或遇到文件结束符 ctrl+z 时时 cin处于出错状态,无法正常提取数据(cin=false).if(!cin)cout“输入出错输入出错”;21 abc 用于字符输入的流成员函数1.不带参数的get函数 cin.get()n功能功能n从输入流提取从输入流提取1个字符个字符;n函数返回值就是该字符函数返回值就是该字符.n若遇到若遇到文件结束符文件结束符,则返回值为则返回值为EOF,即即-1.n如:char ch;while(ch=cin.get()!=EOF)cout.put(ch
11、);键盘输入键盘输入:显示显示:键盘输入键盘输入:I study C+.(程序结束程序结束)I study C+.Ctrl+ZEOFEnd Of File字符输出的流成员函数,字符输出的流成员函数,功功能能在显示器上显示一个在显示器上显示一个字符字符用于字符输入的流成员函数2.带1 个参数的get函数 cin.get(ch)n功能功能n从输入流提取从输入流提取1个字符放入个字符放入ch;n函数返回值就是非函数返回值就是非0值值n若遇到若遇到文件结束符文件结束符,则返回值为则返回值为0n如:char ch;while(cin.get(ch)!=0)cout.put(ch);键盘输入键盘输入:显示
12、显示:键盘输入键盘输入:I study C+.(程序结束程序结束)I study C+.Ctrl+Z用于字符输入的流成员函数3.带3 个参数的get函数 cin.get(字符字符数组数组,字符个数字符个数n,终止字符终止字符)或或 cin.get(字符字符指针指针,字符个数字符个数n,终止字符终止字符)n功能功能n从输入流提取从输入流提取n-1个字符放入数组个字符放入数组;n函数返回值就是非函数返回值就是非0值值n若遇到若遇到文件结束符文件结束符,则返回值为则返回值为0n如 char str20;cin.get(str,10,“n”);coutstr;键盘输入键盘输入:显示显示:I study
13、 CI study C+.用于字符输入的流成员函数4.cin.getline函数函数可输入一行字符可输入一行字符 cin.getline(字符字符数组数组,字符个数字符个数n,终止字符终止字符)或或 cin.getline(字符字符指针指针,字符个数字符个数n,终止字符终止字符)n功能功能n从输入流提取从输入流提取n-1个字符放入数组个字符放入数组;n函数返回值就是非函数返回值就是非0值值n若遇到若遇到文件结束符文件结束符,则返回值为则返回值为0n如 char str20;cin.get(str,10,“n”);coutstr;键盘输入键盘输入:显示显示:I study CI study C+
14、.cin.get()与 cin.getline()的比较 cin.get(字符数组字符数组,字符个数字符个数n,终止字符终止字符)cin.getline(字符指针字符指针,字符个数字符个数n,终止字终止字符符)n相同之处:n从输入流提取从输入流提取n-1个字符放入数组个字符放入数组,n函数返回值是非函数返回值是非0值值.n若遇到文件结束符若遇到文件结束符,则返回值为则返回值为0.n不同之处:n当读到终止字符时,当读到终止字符时,ncin.getline()将指针移到将指针移到终止字符之后终止字符之后。ncin.get()将指针移到将指针移到终止字符处终止字符处。n则下次继续读取时的位置就不同。
15、13.4 文件操作与文件流n文件 n存储在某种设备(磁带、光盘、软盘或硬盘)存储在某种设备(磁带、光盘、软盘或硬盘)上数据的集合;上数据的集合;n对用户来说,文件分成两大类:n 程序文件程序文件n 数据文件数据文件n从文件中数据的组织形式来分:n ASCII文件(文本文件)文件(文本文件)n 二进制文件二进制文件文本文件和二进制文件n文本文件(ASCII文件):n文件中的内容都是字符文件中的内容都是字符,以以ASCII码形式存在码形式存在文件内文件内.n如如:12345在文本文件中是以在文本文件中是以 1,2,3,4,5共共 5个字符个字符形式存储的形式存储的n二进制文件:n文件中的内容是以数
16、据的二进制形式存储的文件中的内容是以数据的二进制形式存储的.n如如:12345在二进制文件中按在二进制文件中按1个整数类型以二个整数类型以二进制形式存储进制形式存储,占占4个字节空间个字节空间文件流 C+在头文件在头文件fstream.h中定义了中定义了C+的文件流类体系的文件流类体系,当当程序中使用文件时,程序中使用文件时,要包含头文件要包含头文件fstream.h。iosifstream(输入流输入流)ofstream(输出流输出流)fstream在在“fstream.h”中说明中说明当使用文件时,在程序头有:当使用文件时,在程序头有:#include其中定义了各种文件操作运算符及函数。其
17、中定义了各种文件操作运算符及函数。文件流n用标准流进行用标准流进行I/O时,系统自动地完成数据时,系统自动地完成数据类型的转换。类型的转换。n对于输入流,要将输入的字符序列形式的数对于输入流,要将输入的字符序列形式的数据变换成计算机内部形式的数据(二进制据变换成计算机内部形式的数据(二进制或或ASCII)后,再赋给变量,变换后的格式)后,再赋给变量,变换后的格式由变量的类型确定。由变量的类型确定。n对于输出流,将要输出的数据变换成字符串对于输出流,将要输出的数据变换成字符串形式后,送到输出流(文件)中。形式后,送到输出流(文件)中。内存变量内存变量(程序程序)键盘键盘输入文件输入文件屏幕屏幕输
18、出文件输出文件cinxcoutxoutfilexcoutxoutfilex简单的文件I/O要让程序将数据写入文件,必须:创建一个ofstream对象来管理输出流;将该对象与特定的文件关联起来;以使用cout的方式使用该对象,唯一的区别是:输出将进入文件,而不是屏幕;#include /必须包含的头文件必须包含的头文件 using namespace std;void main()int a=12,b=34;ofstream fout;/定义定义ofstream类对象类对象fout fout.open(c:c_05temptest.dat,ios:out);/使文件流与使文件流与test.dat
19、建建立关联立关联 foutaendl;foutbendl;fout.close();/将输出文件流所关联的磁盘文件将输出文件流所关联的磁盘文件关闭关闭例 将int a=12,b=34写到磁盘文件中读取文件#include using namespace std;void main()int a,b;ifstream infile;infile.open(c:c_05temptest.dat,ios:in);infileab;couta=aendl;coutb=bendl;infile.close();文本文件的打开与关闭n在文件操作前,需要将程序与被操作的文件联系在文件操作前,需要将程序与被操
20、作的文件联系起来,使程序可以起来,使程序可以“引用引用”文件。文件。n在程序内定义一个文件类的在程序内定义一个文件类的对象对象,由,由该对象该对象与文与文件发生联系,程序内所有的与文件的操作都是对件发生联系,程序内所有的与文件的操作都是对该对象该对象的操作。的操作。fstream infile,outfile;定义两个对象,可以联系两个定义两个对象,可以联系两个输入输出输入输出文件文件 ifstream infile;定义一个对象只能联系定义一个对象只能联系输入输入文件文件 ofstream outfile;定义一个对象只能联系定义一个对象只能联系输出输出文件文件iosifstream(输入流
21、输入流)ofstream(输出流输出流)fstream在在“fstream.h”中说明中说明定义用于输入定义用于输入的文件对象的文件对象定义用于输出定义用于输出的文件对象的文件对象定义用于输入输定义用于输入输出的文件对象出的文件对象文件对象与包含文件头的关系文件的打开与关闭n如何使文件类的对象与欲操作的文件发生联系?如何使文件类的对象与欲操作的文件发生联系?n用对象打开文件n方法一:ofstream outfile;/定义输出文件类对象定义输出文件类对象 outfile.open(“d:mydoca1.dat”);格式:格式:文件流对象文件流对象.open(文件名文件名)n方法二:定义对象时直
22、接初始化定义对象时直接初始化ofstream outfile(“d:mydoca1.dat”);打开文件打开文件“a1.dat”用于输出,并将此文件与输出文件类对用于输出,并将此文件与输出文件类对象象outfile建立联系建立联系今后今后在程序中,用到文件在程序中,用到文件“a1.dat”的地方就用的地方就用outfile来代来代替。替。文件的打开n在打开文件后,都要判断打开是否成功在打开文件后,都要判断打开是否成功n若打开成功,则文件流对象值为非零值;若打开成功,则文件流对象值为非零值;n若打开不成功,则其值为若打开不成功,则其值为0。ifstream pfile1;/定义输入文件类对象定义
23、输入文件类对象ofstream pfile2;/定义输出文件类对象定义输出文件类对象pfile1.open(“file1.txt”);pfile2.open(“file2.txt”,);if(!pfile1)/若为若为0,打开文件操作失败,打开文件操作失败 cerr”不能打开输入文件不能打开输入文件:file1.txt”endl;exit(1);if(!pfile2)cerr”不能打开输出文件不能打开输出文件:file2.txt”xy;myfile1.txt3 4内存内存infilexy34用用infile代代替替myfile1.txt进行操作。进行操作。如何从文件中读出数据?ifstream
24、 outfile;/定义输出文件类对象定义输出文件类对象infile.open(“myfile2.txt”);/利用函数打开某一文件利用函数打开某一文件 float x3,y4;outfilextyxy;outfilextyendl;infile.close();outfile.close();myfile1.txt3 4内存内存infilexy34myfile2.txtoutfile34infile.close();outfile.close();用完文件后,使用成员函数关闭文件#include#include using namespace std;void main()int a10;o
25、fstream 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 例13.11 有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组送到磁盘文件地f1.dat中存放。文件处理流程文件处
26、理流程定义并打开文件对象定义并打开文件对象打开文件出错处理打开文件出错处理对文件进对文件进行行R/W操作操作关闭文件对象关闭文件对象#include#include void main()int a10,max,i,order;/定义输入文件流对象,以输入方式打开定义输入文件流对象,以输入方式打开f1.dat ifstream infile(“f1.dat”);if(!infile)cerr“open error!”endl;exit(1);for(i=0;iai;/从文件读入数据到从文件读入数据到a数组中数组中 coutai“”;/显示顺序显示显示顺序显示10个数个数 coutendl;ma
27、x=a0;order=0;例13.12 从例13.11建立的数据文件f1.dat中读入10个整数放在数组中,找出并输出10个数中的最大者和它的序号。for(i=1;imax)max=ai;/存放最大值到存放最大值到max中中 order=i;/存最大值序号到存最大值序号到order中中 coutmax=maxendl;coutorder=orderendl;infile.close();33 65 87 2 5 11 44 88 99 0max=99order=8void main()int a10;ifstream infile;/定义输入文件类定义输入文件类 ofstream outfil
28、e;/定义输出文件类定义输出文件类 infile.open(“file1.txt”);/打开输入文件打开输入文件“file1.txt”outfile.open(“file2.txt”);/打开输出文件打开输出文件“file2.out”for(int i=0;iai;/将将“file1.txt”中的十个整数输入到中的十个整数输入到ai中中 for(i=0;i10;i+)outfileait;/将将ai中的十个数输出到文件中的十个数输出到文件“file2.txt”outfilech;/输入输入pfile2ch;/输出输出pfile1.close();pfile2.close();char ch,s
29、tr300;ifstream infile(“myfile1.txt”);ofstream outfile(“myfiel2.txt”);说明:说明:从文件输入一从文件输入一字符或一行字字符或一行字符,当输入至符,当输入至文件尾时,文件尾时,函函数返回值为数返回值为0,可以据此来,可以据此来判断循环结束判断循环结束。涉及到字符串的文件读写语句作 用cin.get(ch);从键盘输入一个字符从键盘输入一个字符cout.put(ch);向显示器输出一个字符向显示器输出一个字符cin.getline(str,300,”n”);从键盘输入一行字符从键盘输入一行字符infile.get(ch);从文件输
30、入一个字符从文件输入一个字符outfile.put(ch);向文件输出一个字符向文件输出一个字符infile.getline(ch,300,”n”);从文件输入一行字符从文件输入一行字符void main()char filename1256,filename2256;coutfilename1;输入文件输入文件(源文件源文件)名名coutfilename2;输出文件输出文件(目的文件目的文件)名名ifstream infile(filename1);/用构造函数打开文件用构造函数打开文件ofstream outfile(filename2);char ch;while(infile.get(
31、ch)从源文件中读取一个字符,至文件尾停止循环从源文件中读取一个字符,至文件尾停止循环outfile.put(ch);将该字符输出至目的文件将该字符输出至目的文件infile.close();关闭文件关闭文件outfile.close();实现两个ASCII文件拷贝的程序文件的输入和输出下面程序将data.txt文件中的数据全部读出并累加求和后,结果保存到output.txt文件中.#include using namespace std;void main()ifstream fin(“c:data.txt”);ofstream fout(“c:output.txt”);int t,s=0;
32、while(fint)s+=t;foutsendl;fin.close();fout.close();13.4.5 对二进制文件的操作若在文件的打开方式中没有特别说明,打开的文件均为若在文件的打开方式中没有特别说明,打开的文件均为ASCII码码文件,文件,若要打开二进制文件,则要特别说明并用特定的读写函数若要打开二进制文件,则要特别说明并用特定的读写函数。fstream infile,outfile;infile.open(“inf1.dat”,ios:in|ios:binary);outfile.open(“outf1.dat”,ios:out|ios:binary);文件名文件名 输入方式
33、打开输入方式打开 二进制文件二进制文件 文件名文件名 输出方式打开输出方式打开 二进制文件二进制文件1.用成员函数来读写二进制文件n对二进制文件的读写主要用fstream类的成员函数read和write来实现。这两个成员函数的原型为read(char*buffer,int len);write(const char*buffer,int len);n字符指针字符指针buffer指向内存中一段存储空间。指向内存中一段存储空间。nlen是读写的字节数。是读写的字节数。n调用的方式为调用的方式为infile.read(p2,30);outfile.write(p1,50);例13.14 将一批数据以
34、二进制形式存放在磁盘文件中。#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(“stud.dat”,ios:out|ios:binary);if(!outfile)cerropen error!endl;abort();/退出程序 for(int i=0;i3;i+)outfile.writ
35、e(char*)&studi,sizeof(studi);outfile.close();可以一次输出整个数组到磁盘文件:outfile.write(char*)&stud0,sizeof(stud);n用此方法一次可以输出一批数据,效率较高。用此方法一次可以输出一批数据,效率较高。n在输出的数据之间不必加入空格,在一次输出之后也不必加在输出的数据之间不必加入空格,在一次输出之后也不必加回车换行符。回车换行符。n在以后从该文件读入数据时不是靠空格作为数据的间隔,而在以后从该文件读入数据时不是靠空格作为数据的间隔,而是用字节数来控制。是用字节数来控制。例13.14 将一批数据以二进制形式存放在磁
36、盘文件中例13.15 将刚才以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。#include#include using namespace std;struct studentstring name;/最好改为 char name20;int num;int age;char sex;void main()student stud3;int i;ifstream infile(stud.dat,ios:in|ios:binary);if(!infile)cerropen error!endl;abort();for(i=0;i3;i+)infile.read(char*)&stu
37、di,sizeof(studi);infile.close();for(i=0;i3;i+)coutNO.i+1endl;coutname:studi.nameendl;coutnum:studi.numendl;coutage:studi.ageendl;coutsex:studi.sexendlendl;问题:问题:能否一次读入文件中的全部数据,如能否一次读入文件中的全部数据,如 infile.read(char*)&stud0,sizeof(stud);运行时显示器上显示运行时显示器上显示NO.1name:Linum:1001age:18sex:fNO.2name:Funnum:1001
38、age:19sex:mNO.3name:Wangnum:1004age:17sex:f可以!可以!infile.eof()当到达文件结束位置时,该函数返回一个非零值;当到达文件结束位置时,该函数返回一个非零值;否则返回零。否则返回零。fstream infile;infile.open(“data1.dat”,ios:in|ios:binary);if(!infile)cerr“Open Error!n”;exit(1);char str300;while(!infile.eof()infile.read(str,300);判断打开是否出错判断打开是否出错 判断是否读到文件尾判断是否读到文件尾
39、判断二进制文件是否读到文件尾?void main()char filename1256,filename2256;char buff4096;/设置输入缓冲区设置输入缓冲区cout filename1;cout filename2;fstream infile,outfile;infile.open(filename1,ios:in|ios:binary);outfile.open(filename2,ios:out|ios:binary);int n;while(!infile.eof()/文件不结束,继续循环文件不结束,继续循环infile.read(buff,4096);/一次读一次读4
40、096个字节个字节n=infile.gcount();/取实际读的字节数取实际读的字节数outfile.write(buff,n);/按实际读的字节数写入文件按实际读的字节数写入文件infile.close();outfile.close();实现两个二进制文件拷贝的程序2.与文件指针有关的流成员函数n当一打开文件,文件指针位于文件头,并随着读写字节数当一打开文件,文件指针位于文件头,并随着读写字节数的多少顺序移动。的多少顺序移动。文件内容文件内容文件指针文件指针n对于二进制文件(或文本文件)对于二进制文件(或文本文件)允许对指针进行控制,使它按用允许对指针进行控制,使它按用户的意图移动到所需
41、的位置,以户的意图移动到所需的位置,以便在该位置上进行读写。便在该位置上进行读写。2.与文件指针有关的流成员函数n文件流提供一些有关文件指针的成员函数文件流提供一些有关文件指针的成员函数:infile.gcount()/返回最新一次输入的字节数返回最新一次输入的字节数struct student char name20;int num;int age;char sex;stud;如:如:ifstream infile(“c:data.txt”);infile.read(&stud,sizeof(stud);if(infile.gcount()sizeof(stud)cout“读入数据有误!读入
42、数据有误!”;文件内容文件内容文件指针文件指针 infile.tellg()返回输入文件指针的当前位置返回输入文件指针的当前位置 (long型整数,以字节为单位,从型整数,以字节为单位,从0算起)算起)infile.seekg(文件中的位置文件中的位置);/将输入文件的指针移到指定的位置将输入文件的指针移到指定的位置 infile.seekg(位移量,位移量,参照位置参照位置);/将输入文件指针移到从将输入文件指针移到从参照位置参照位置为基础移动若干字节位置为基础移动若干字节位置 Outfile.tellp()返回输出文件指针的当前位置返回输出文件指针的当前位置 Outfile.seekp(位
43、移量,位移量,参照位置参照位置);/将输出文件指针移到从将输出文件指针移到从参照位置参照位置为基础移动若干字节位置为基础移动若干字节位置与文件指针有关的流成员函数n参照位置参照位置n ios:beg 文件开头文件开头begin(默认值)(默认值)n ios:cur 指针当前位置指针当前位置currentn ios:end 文件末尾(已超出文件尾)文件末尾(已超出文件尾)n如:如:infile.seekg(100);n输入文件指针移到文件第输入文件指针移到文件第101字节处字节处(第(第1个字符的位置是个字符的位置是0)n infile.seekg(-50,ios:cur););n当前位置回移当
44、前位置回移50个字节个字节与文件指针有关的流成员函数文件内容文件内容文件开头文件开头文件当前文件当前位置位置文件末尾文件末尾n说明说明 n异常异常指针已在文件尾,还要读数据,则指针已在文件尾,还要读数据,则eof()=1;n打开文件失败;其之后的相关操作都会失效。打开文件失败;其之后的相关操作都会失效。fin.seekg(0,ios:beg);/将文件指针移到文件头将文件指针移到文件头 cout“begin=”fin.tellg()endl;/显示文件指针当前位置显示文件指针当前位置0 fin.seekg(0,ios:end);/将文件指针移到文件尾将文件指针移到文件尾 fin.get();/
45、到文件尾还要读数据,到文件尾还要读数据,eof出现。出现。fin状态异常状态异常 coutend=fin.tellg()eof()=fin.eof()endl;/显示:显示:end=-1 eof()=1 fin.seekg(0,ios:beg);/由于由于fin状态异常,状态异常,seekg不起作用不起作用cout“begin=”fin.tellg()endl;/显示:显示:begin=-1当文件对象发生操作异常时n注意注意 n异常异常指针已在文件尾,还要读数据,则指针已在文件尾,还要读数据,则eof发生;发生;n要使其后操作有效要使其后操作有效,要用要用clear()清除之前的错误状态清除之
46、前的错误状态 fin.seekg(0,ios:beg);/将文件指针移到文件头将文件指针移到文件头 cout“begin=”fin.tellg()endl;/显示文件指针当前位置显示文件指针当前位置0 fin.seekg(0,ios:end);/将文件指针移到文件尾将文件指针移到文件尾 fin.get();/到文件尾还要读数据,到文件尾还要读数据,eof出现。出现。fin状态异常状态异常 coutend=fin.tellg()eof()=fin.eof()endl;/显示:显示:end=-1 eof()=1fin.clear();/将将fin的异常状态清的异常状态清除除 fin.seekg(0
47、,ios:beg);/由于由于fin状态异常,状态异常,seekg不起作用不起作用cout“begin=”fin.tellg()endl;/显示:显示:begin=0当文件对象发生操作异常时3.随机访问二进制数据文件例13.16 有5个学生的数据,要求:(1)把它们存到磁盘文件中;把它们存到磁盘文件中;(2)将磁盘文件中的第将磁盘文件中的第1,3,5个学生数据读入程序,并显示个学生数据读入程序,并显示出来;出来;(3)将第将第3个学生的数据修改后存回磁盘文件中的原有位置。个学生的数据修改后存回磁盘文件中的原有位置。(4)从磁盘文件读入修改后的从磁盘文件读入修改后的5个学生的数据并显示出来。个学
48、生的数据并显示出来。n一般情况下读写是顺序进行的,即逐个字节进行读写。一般情况下读写是顺序进行的,即逐个字节进行读写。n但是对于二进制数据文件来说,但是对于二进制数据文件来说,n可用前面的成员函数移动指针,可用前面的成员函数移动指针,随机地访问随机地访问文件中任一位置上的文件中任一位置上的数据,还可以修改文件中的内容。数据,还可以修改文件中的内容。例13.16 程序完成任务流程内存内存5个学生的个学生的数据数据stud5磁盘文件磁盘文件stud.dat(1)把它们存到磁盘文件中把它们存到磁盘文件中3个学生数据个学生数据stud13(2.1)将磁盘文件中的第将磁盘文件中的第1,3,5个学生数据读
49、入内存个学生数据读入内存显示第显示第1,3,5学生数据学生数据(2.2)3.1修修改改第第 3个个学学生生的的数数据据(3.2)把修改后的数据存到文件原有位置把修改后的数据存到文件原有位置5个学生的个学生的数据数据stud5显修改后显修改后5个学生数据个学生数据(4.2)(4.1)将磁盘文件中的将磁盘文件中的5个学个学生数据读入内存生数据读入内存要实现以上要求,需要解决3个问题:(1)由于同一磁盘文件在程序中需要频繁地进行输入和输由于同一磁盘文件在程序中需要频繁地进行输入和输(2)出,因此可将文件的工作方式指定为出,因此可将文件的工作方式指定为输入输出文件输入输出文件,即即ios:in|ios
50、:out|ios:binary(2)正确计算好每次访问时指针的定位,即正确使用正确计算好每次访问时指针的定位,即正确使用seekg或或seekp函数。函数。infile.seekg(位移量,参照位置位移量,参照位置);/将输入文件指针移到从参照位置为基础移动若干字节位置将输入文件指针移到从参照位置为基础移动若干字节位置Outfile.seekp(位移量,参照位置位移量,参照位置);/将输出文件指针移到从参照位置为基础移动若干字节位置将输出文件指针移到从参照位置为基础移动若干字节位置(3)正确进行文件中数据的重写正确进行文件中数据的重写(更新更新)。3.随机访问二进制数据文件#include#i