版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章C++输入输出类层次ffh目录8.1概述8.2格式化输入/输出8.3重载流的插入符和提取符8.4常用成员函数I/O8.5流的错误处理8.6文件流操作8.7字符串流8.1概述输入输出操作在C++语言中没有定义,但提供了一个I/O流库C++输入输出类核心是:流!一个流就是一个字节序列,如果流向程序,这个流就称为输入流:如果流出程序,则称为输出流。如果输入流来源于键盘,表明你的程序要从键盘获取输入;如果输入流来源于一个文件,表明程序要从那个文件获取输入。类似地,输出流可以发送给屏幕或文件。主要包括:标准流类:处理与标准输入设备(键盘)和输出设备(显示器)关联的数据流8.1概述文件流类:处理与磁盘文件关联的数据流字符串流类:利用内存中的字符数组处理数据的输入输出异常类等:处理异常错误其他:网络流等文件文件是指存储在外部介质上具有名称的数据集合8.1.1标准输入输出层次体系Ios_basebasic_iosbasic_istreambasic_ostreambasic_ifstreambasic_istringstreambasic_iostreambasic_ostringstreambasic_ofstreambasic_stringstreambasic_fstream8.1.1标准输入输出层次体系Ios_base:流的抽象基类,描述了流的基本性质,不考虑流的字符集basic_ios:流的抽象基类,描述了流的基本性质,考虑流的字符集basic_istream:描述流中读写和移动数据的方法;重载<<,>>basic_ostreambasic_ifstream:对文件进行读取basic_ofstreambasic_fstream:从fstreambase类和iostream类中派生,可对文件进行插入和提取操作basic_istringstreambasic_iostreambasic_ostringstreambasic_stringstream8.1.2输入输出库中的缓冲类层次C++输入输出类结构,如图Inputbuff键盘显示器处理Outputbuffabcduvwxyz驱动程序驱动程序系统预定义4个流类的对象:在使用下述类时,总要包含iostream.h文件:cin:它是istream类的对象,用来处理标准输入,即键盘输入cout:它是ostream类的对象,用来处理标准输出,即屏幕输出cerr:它是ostream类的对象,用来处理标准出错信息,它提供不带缓冲区的输出clog:它是ostream类的对象,用来处理标准出错信息,它提供带缓冲区的输出支持文件的流类8.2格式化输入/输出8.2.1使用ios类的成员函数进行格式控制8.2.2使用控制符进行格式控制8.2.1
使用ios类的成员函数进行格式控制用ios类的成员函数来对输入/输出的格式进行控制,如格式标志字、域宽、充填字符及输出精度等。1.使用ios类的成员函数设置标志字ios类中声明了一个数据成员,用于记录当前流的格式化状态,这个数据成员称为标志字。标志字的每一位用于记录一种格式。使用标志常量或直接用对应的十六进制值设置输入输出流的格式。下表列出了主要标志常量名及其意义。8.2.1
使用ios类的成员函数进行格式控制8.2.1
使用ios类的成员函数进行格式控制8.2.1
使用ios类的成员函数进行格式控制Ios的几个直接操作标志字的公有成员函数:(1)longflags():该函数用来返回标志字。(2)longflags(long):该函数使用参数值来更新标志字,并返回更新前的标志字。(3)longsetf(longsetbits,longfield):该函数用来将field所指定的标志位清零,将setbits为1的标志位置为1,并返回设置前的标志字。(4)longsetf(long):该函数用来设置参数所指定的那些标志位,并返回更新前的标志字。(5)longunsetf(long):该函数用来清除参数所指定的那些标志位,并返回更新前的标志字。8.2.1
使用ios类的成员函数进行格式控制例8.1:以几种不同的格式输出同一浮点数,示例如何使用成员函数来操作标志字。#include<iostream>usingnamespacestd;intmain(){ doublea=12.34; cout<<"a="<<a<<endl; cout.setf(ios::showpos);cout.setf(0x0100);cout<<"a="<<a<<endl; cout.setf(0x1000);cout<<"a="<<a<<endl; return0;}结果:a=12.34a=+12.34a=+1.234000e+0018.2.1
使用ios类的成员函数进行格式控制例8.2:以几种不同的进制输出同一整数。示例ios定义的公有静态符号常量的作用。#include<iostream>usingnamespacestd;intmain(){ doublea=12; cout.setf(ios::showbase);
cout<<"以十进制输出12为:"; cout.setf(ios::dec,ios::basefield);
cout<<12<<endl; cout<<“以八进制输出12为:“;
cout.setf(ios::oct,ios::basefield);cout<<12<<endl; cout<<"以十六进制输出12为:"; cout.setf(ios::hex,ios::basefield);cout<<12<<endl; return0;}输出结果以十进制输出12为:12以八进制输出12为:014以十六进制输出12为:0xc8.2.1
使用ios类的成员函数进行格式控制2.使用ios类的成员函数设置域宽、充填字符及输出精度在ios类定义了一些设置域宽、充填字符及输出精度等成员函数:(1)设置输出数据所占宽度的函数: intwidth()该函数用来返回当前输出的数据宽度。 intwidth(int)该函数用来设置当前输出的数据宽度,并返回更新之前的宽度值。(2)填充当前宽度内的填充字符函数 charfill()该函数用来返回当前所使用的填充字符。 charfill(char)该函数用来设置当前填充字符为参数所表示的字符,并返回更新前的填充字符。8.2.1
使用ios类的成员函数进行格式控制(3)设置浮点数输出精度函数 intprecision()该函数用来返回当前浮点数的有效数字的个数。 intprecision(int)该函数用来设置当前浮点数输出时的有效数字个数为该函数的参数值,并返回更新前的值。
8.2.1
使用ios类的成员函数进行格式控制例8.3:示例如何使用ios类的成员函数设置域宽、充填字符及输出精度。#include<iostream>#include<string>usingnamespacestd;intmain(){doublevalues[]={1.23,35.36,653.7,4358.24};char*names[]={"aaaaaaa","bbbb","ccccc","dddddd"};
for(inti=0;i<4;i++) {
cout.setf(ios::left);//设置左对齐
cout.fill('*');//充填字符为*
cout.width(10);//设置域宽为10 cout.precision(5);//输出精度为5cout<<names[i]<<",”<<values[i]<<endl;} return0;
}运行结果:aaaaaaa***,1.23bbbb******,35.36ccccc*****,653.7dddddd****,43使用控制符进行格式控制8.2.2使用控制符进行格式控制8.2.2使用控制符进行格式控制例8.4
使用控制符进行格式控制,完成例8.3同样的功能。#include<iostream>#include<iomanip>usingnamespacestd;intmain(){doublevalues[]={1.23,35.36,653.7,4358.24};char*names[]={"aaaaaaa","bbbb","ccccc","dddddd"};for(inti=0;i<4;i++){cout<<setiosflags(ios::left)<<setfill('*')<<setw(10)<<names[i]<<",";cout<<setprecision(5)<<values[i]<<endl;
}return0;}8.3重载流的插入符和提取符运算符重载有两种形式:重载为成员函数或者是重载为友元函数。由于重载插入符和提取符时,其左边的参数是流,而右边的参数是类的对象,因此,插入符和提取符只能重载为友元函数。插入符重载的一般格式如下:ostream&operator<<(ostream&s,classa&a){<函数体>returns;}8.3重载流的插入符和提取符例8.5:重载流的插入符和提取符,完成复数类的功能。#include<iostream>usingnamespacestd;classComplex{public:Complex(doubler=0,doublei=0);friendComplexoperator+(Complexc1,Complexc2);//重载加
friendComplexoperator-(Complexc1,Complexc2);//二元减
friendistream&operator>>(istream&s,Complex&c); friendostream&operator<<(ostream&s,Complex&c);private:doublereal,imag;};8.3重载流的插入符和提取符Complex::Complex(doubler,doublei) {real=r;imag=i;}Complexoperator+(Complexc1,Complexc2){Complextemp;temp.real=c1.real+c2.real;temp.imag=c1.imag+c2.imag;returntemp;}Complexoperator-(Complexc1,Complexc2){Complextemp;temp.real=c1.real-c2.real;temp.imag=c1.imag-c2.imag;returntemp;}8.3重载流的插入符和提取符istream&operator>>(istream&s,Complex&c){ s>>c.real>>c.imag; returns;
}ostream&operator<<(ostream&s,Complex&c){ s<<'('<<c.real<<','<<c.imag<<')'<<endl; returns;
}intmain(){Complexc1,c2; cin>>c1>>c2;Complex
c;cout<<“c1=”<<c1;
cout<<"c2="<<c2;c=c1+c2;
//c=operator+(c1,c2);cout<<"c1+c2="<<c;c=c1-c2;
//c=operator-(c1,c2);cout<<"c1-c2="<<c;return0;}8.4常用成员函数I/O8.4.1输入流的常用成员函数8.4.2输出流的常用成员函数8.4.1
输入流的常用成员函数1.read()函数 istream&read(char*pch,intnCount);将指定的nCount个字符输入到内存中的字符数组pch。如果读取的字符数量少于指定的数量,就会设置failbit错误位。voidmain(){
constintS=80;
charbuf[S]="";
cout<<"Input…\n";
cin.read(buf,S);
cout<<endl;
cout<<buf<<endl;}Ans:执行该程序显示如下信息:Input…abcd<ctrl+z>输出如下:abcd8.4.1
输入流的常用成员函数2.get()函数该函数有3种主要形式: istream&int
get()从指定的输入流中输入一个字符(包括空白字符),并返回该字符作为函数调用的值;遇到输入流中的文件结束符时,此get函数返回EOF。 istream&int
get(char&rch)从输入流读取一个字符(包括空白字符),并将其存储rch。当遇到文件结束符时,此get函数返回0,否则返回对istream对象的引用,并用该引用再次调用get成员函数。
istream&intget(char&pch,intnCount,chardelim=’\n’)
从输入流中读取字符。函数要么在读取到nCount-1个字符后终止,要么在读取到指定的分隔符delim时终止。例:
从键盘输入abcxyz123voidmain(){
charch;
cout<<"Input:";
while((ch=cin.get())!=EOF)//EOF=-1,包含在iostream
cout.put(ch);
cout<<"ok!";}Ans:Input:abcxyz123^zOk!8.4.1
输入流的常用成员函数3.getline()与带3个参数的get成员函数类似,它读取一行字符串后在字符数组末尾加入’\0’。不同的是,getline要从输入流中删除分隔符(即读取并删除它),而不是把它存放在数组中。4.gcount()函数无参函数,统计最后一次输入操作读取的字符数。例:求每行字符个数,最长行字符个数,多少行constintSIZE=80;voidmain(){
intlcnt=0,lmax=-1;//行数,最长行的输入字符个数
charbuf[SIZE];
cout<<"Input…\n";
while(cin.getline(buf,SIZE))
{
intcount=cin.gcount();//输入字符的个数
lcnt++;
if(count>lmax)lmax=count;
cout<<"Line#"<<lcnt<<"\t" <<"charsread:"<<count<<endl;
cout.write(buf,count).put('\n').put('\n');
}
cout<<endl;
cout<<"Totalline:"<<lcnt<<endl;
cout<<"Longestline:"<<lmax<<endl;}Ans:Input…thisisastring.Line#1charsread:18thisisastring.youareastudent.Line#2charsread:19youareastudent.thefourseaconsoftheyear.Line#3charsread:30thefourseasonsoftheyear.changetoaN.332bus.Line#4charsread:25changetoaN.332bus.输入<ctrl+z>后,输出:Totalline:4Longestline:308.4.1
输入流的常用成员函数5.ignore()函数该函数原型为:istream&ignore(intn=1,intt=EOF);遇到指定的终止字符t时提前结束或跳过输入流中n个字符结束(此时跳过包括终止字符内的若干个字符)。终止字符仍停留在输入流中。8.4.1
输入流的常用成员函数
6.putback()函数该函数原型为:istream&putback(charch);把上一次从输入流中通过get(或getline)取得的字符再放回该输入流中。对于应用程序需要扫描输入流以查找以特定字符开头的字段来说,这是非常有用的。当输入一个字符时,应用程序把该字符放回输入流,以保证输入的数据中包含该字符。7.peek()函数无参函数,返回输入流的下一个字符,但并不将其从输入流中删除。其作用是观测该字符,字符指针仍停留在原来位置上。例peek()查找ab连续组合#include<iostream.h>voidmain(){
intch,cnt=0;
cout<<"Input…\n";
while((ch=cin.get())!=EOF) {
if(ch=='a'&&cin.peek()=='b‘)cnt++;
}
cout<<endl;
cout<<cnt<<endl;}当输入流如下所示:mabyababcabcdab<ctrl+z>68.4.2输出流的常用成员函数1.write()函数ostream&write(const*str,intn);将字符串送到输出流。例如: cout.write("string",strlen("string"));#include<string>voidPrintString(char*s){
cout.write(s,strlen(s)).put('\n');
cout.write(s,6)<<"\n“;}例:函数write()voidmain(){
charstr[]="IloveC++“;
cout<<"Thestringis:"<<str<<endl;
PrintString(str);
PrintString("thisisastring");}Ans:Thestringis:IloveC++IloveC++Ilovethisisastrthisi8.4.2输出流的常用成员函数2.put()函数ostream&put(char
ch);输出一个字符。voidmain(){
cout<<'a'<<','<<'b'<<'\n';
cout.put('a').put(',').put('b').put('\n');
charc1='A',c2='B';
cout.put(c1).put(c2).put(‘\n’);
}Ans:a,ba,bAB8.4.2输出流的常用成员函数例8.6:从输入的串中分离数字串,示例常用成员函数I/O#include<iostream>usingnamespacestd;intmain(){ charstr[10]; inti=0; cout<<"输入一个字符串(最多9个字符)"; cin.get(str,10,'!');//输入一个字符串
charc=str[i]; cout<<"数字串为:"<<endl;8.4.2输出流的常用成员函数 while(i<cin.gcount()) {
if(isdigit(c))//输出数字串
cout.put(c);
if(isdigit(c)&&!isdigit(str[i+1])) cout<<endl;
i=i+1;
c=str[i]; } cout<<endl; return0;} 8.5流错误的处理8.5.1I/0流的错误状态字8.5.2I/0流的状态函数在对流进行操作时,可能会发生错误必须有一种能够检测到错误状态的机制和清除错误的方法通过几种方法都可以检测出错误,并查明其错误性质,然后调用clear()函数清除错误状态,可以使得流能够恢复处理。8.5.1I/0流的错误状态字ios类定义了一个数据成员,用它来记录各种错误的性质,称为状态字:goodbit=0x00表示状态正常,没有位设置。fofbit=0x01表示到达文件末尾。failbit=0x02表示I/O操作失败。流没有受到破坏,可以恢复。badbit=0x04表示试图进行非法操作。设备硬件故障,不可恢复。hardbit=0x80表示致命错误使用clear()函数可以清除除hardbit以外的其他错所设置的位。返回本节8.5.2I/0流的状态函数1.检查一个流对象当前状态的成员函数有几个函数可用来检查一个流对象的当前状态,它们都是ios类的成员函数:intrdstate()//返回当前的流状态字inteof()//如果提取操作已到达文件尾,则返回非零值intfail()//若failbit位置位,返回非零值intbad()//若badbit位置位,返回非零值intgood()//若状态字没有置位,则返回非零值可以使用这些函数检查当前流的状态。利用函数来检测流是否出错例如: fstreamistrm("f1.dat"); if(istrm.good()) …
//文件打开成功,进行某些操作例如:ofstreamostrm("f2.dat"); if(!ostrm.good()) …//文件没有被打开,退出该程序例如:if(!cin.eof()) …//文件没有结束,可进行读操作成员函数:intios::operator!()可判断流状态是否正常
ifstreamistrm("f1.dat");if(!istrm)cout<<"f1.datcan'topen.\n";8.5.2I/0流的状态函数2.检查一个流对象当前状态的运算符函数如果不关心具体是哪一位置位(具体的错误性质),则可以使用ios类中重载的两个运算符函数: intios::operator!();在设置了failbit、badbit或hardbit位的情况下返回非零,而成员函数: ios::operatorvoid*();在上述这些位没有设置的情况下(正常状态)返回非零。这两个函数提供了从两个方面测试流状态是否为正常情况的手段。8.5.2I/0流的状态函数3.清除/设置流状态位函数ios类的成员函数: voidios::clear(int=0);用于清除/设置流的状态位(它不能设置/清除hardfail位)。函数clear()更多地是用于在己知流发生错误的情况下清除流的错误状态,也可以用于设置流的错误状态。例如:8.6文件流操作8.6.1文件流8.6.2文件的打开与关闭8.6.3文件的读写8.6.1
文件流
在C++中,文件被看作是元素的序列,即文件是由一个个的元素数据顺序组成的。不考虑记录的界限,因此这种文件称为流式文件。按数据的存储形式来分类,文件可分为文本文件和二进制文件。在文本文件中,每个字节存放一个ASCII代码表示一个字符,文本文件的优点是可直接按字符形式输出,供人们阅读。二进制文件则是把数据的内部存储形式原样存放到文件中,这种文件的优点是与数据在内存中的存储形式保持一致,因此存储效率高,无须进行存储形式的转换,但不能直接按字符形式输出。
8.6.1
文件流按数据的存取方式来分类,文件可分为顺序文件和随机读写文件。在C++中,文件既可以进行顺序访问,也可以进行随机访问。在C++中,文件定义为文件流类的一个对象。要进行文件的输入/输出,必须先创建—个文件流对象,并与指定的文件相关联,即打开文件;然后才能进行读写操作;完成后再关闭这个文件。文件流是以外存文件为输入/输出对象的数据流。输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据。每一个文件流都有一个内存缓冲区与之对应。C++有三种文件流:输入文件流、输出文件流和输入/输出文件流。8.6.2文件的打开与关闭1.打开文件有两种方法:先建立流对象,然后调用函数open连接外部文件流类对象名;
对象名.open(文件名,方式);调用流类带参数的构造函数,建立流对象的同时连接外部文件流类对象名(文件名,方式);其中,“流类”是C++流类库定义的文件流类,为ifstream、ofstream或fstream。8.6.2文件的打开与关闭如: ofstreamostrm; ostrm.open("f1.txt");或
fstreamoutfile(“f1.txt”,ios::out);\\写 ifstreamistrm; istrm.open("f2.txt");或
ifstreamistrm(“f2.txt”);\\读ios文件访问方式常量方式名用途in以输入(读)方式打开文件out以输出(写)方式打开文件app以输出追加方式打开文件ate文件打开时,文件指针位于文件尾trune如果文件存在,将其长度截断为0,并清除原有内容;如果文件不存在,则创建新文件binary以二进制方式打开文件,缺省时为文本方式nocreate打开一个已有文件,如该文件不存在,打开失败noreplace如果文件存在,除非设置ios::ate或ios::app,否则打开操作失败ios::in|ios::out以读和写的方式打开文件ios::out|ios::binary以二进制写方式打开文件ios::in|ios::binary以二进制读方式打开文件说明:缺省文件的读写位置指针位于文件头用ios::app方式打开文件时文件读写位置指针位于文件尾在以ios::out方式打开文件,而未指定ios::in,ios::ate,ios::app方式时,则隐含为ios::trunc方式通过"位或"操作结合起来,表示具有几种方式的操作。例如:
ios::in|ios::out|ios::binary//二进制的读写未指定binary方式时,文件都以文本方式打开。若指定了binary方式,则文件以二进制方式打开8.6.2文件的打开与关闭8.6.2文件的打开与关闭2.关闭文件当结束一个文件的操作后,要及时将该文件关闭使用close()成员函数进行关闭:<流对象名>.close()其中,<流对象名>是待关闭的文件流的对象名。例如,关闭文件标识符为outfile的文件,使用下面格式:outfile.close();例:文件流被打开、关闭#include<fstream>voidmain(){
ofstreamostrm;
ostrm.open("f1.dat");
ostrm<<12<<endl;
ostrm<<310.85<<endl;
ostrm.close();
ifstreamistrm("f1.dat");
intn;
doubled;
istrm>>n>>d;
cout<<n<<","<<d<<endl;
istrm.close();}Ans:12,310.858.6.3文件的读写1.文本文件的读写文本文件用默认方式打开。例8.7:从输入的串中分离数字串,先将其存入磁盘文件,然后将其读出并在屏幕上显示出来。#include<iostream>#include<fstream>usingnamespacestd;intmain(){ charstr[10]; inti=0; cout<<"输入一个字符串(最多9个字符)“; cin.get(str,10,'!');//输入一个字符串
ofstreamoutfile(“f1.txt”);
//以输出方式打开文件f1.txt if(!outfile)
{
cout<<“Filecannotbeopened.”<<endl;
return0;} charc=str[i];
while(i<cin.gcount()) { if(isdigit(c))
outfile<<c;
//将数字串存入文件outfile if(isdigit(c)
&&
!isdigit(str[i+1]))
outfile<<endl; i=i+1; c=str[i]; } outfile<<'\0';outfile.close(); ifstreaminfile(“f1.txt”);
//以输入方式打开文件f1.txtif(!infile)
{
cout<<“Filecannotbeopened.”<<endl;
return0;} cout<<"存入f1.txt文件中的数字串为:"<<endl; while(!infile.eof())
//从文件中读出数据,并输出到屏幕上。
{
infile.getline(str,sizeof(str));//从文件中读出一行数据
cout<<str<<endl; }infile.close(); return0;} 例
单字符读写函数get()和put()#include<iostream>usingnamespacestd;#include<fstream>#include<stdlib.h>#include<string>voidmain(){ fstreamoutfile,infile;outfile.open("f3.dat",ios::out);if(!outfile){cout<<"f3.datcan'topen.\n";abort();}charstr[]="thisisaC++program."; for(inti=0;i<=strlen(str);i++)outfile.put(str[i]);outfile.close();例
单字符读写函数get()和put() infile.open("f3.dat",ios::in);if(!infile){cout<<"f3.datcan'topen.\n";abort();}charch;while(infile.get(ch))cout<<ch;cout<<endl;infile.close();}Ans:thisisaC++program.例:
文件拷贝#include<iostream>usingnamespacestd;#include<fstream>#include<stdlib.h>voidmain(){ fstreaminfile,outfile; infile.open("f2.dat",ios::in); if(!infile){cout<<"f2.datcan‘?topen.\n";abort();} outfile.open("f4.dat",ios::out); if(!outfile){cout<<"f4.datcan'topen.\n";abort();} charch; while(infile.get(ch))
outfile.put(ch); infile.close(); outfile.close();}8.6.3文件的读写2.二进制文件的读写打开二进制文件时,在open()函数中要加上ios::binary写入信息时,使用write()函数读信息,使用read()函数例8.8:用二进制文件处理学生信息#include<iostream>#include<fstream>//文件流头文件#include<string>usingnamespacestd;classstudent{ private: longnum; stringname; floatscore;public: voidsetnum() //输入学号num
{
cout<<“请输入学生的学号:“;cin>>num;
}voidsetname()//输入姓名name
{
cout<<"请输入学生的姓名:“;cin>>name;}voidsetscore()
//输入学号成绩
{
cout<<“请输入学生的成绩:“;cin>>score;
}
longgetnum()
{returnnum;
}
//得到学号stringgetname()
{
returnname;
}
//得到姓名
floatgetscore()
{returnscore;
}
//得到成绩};intmain(){ofstreamoutfile("student.dat",ios::binary); if(!outfile)
{
cout<<"Filecannotbeopened."<<endl; return0;}studentstud[100];charch; inti=0;
while(1){cout<<"\n你想输入更多记录吗(y/n)?“;cin>>ch;if(ch==‘n’||ch==‘N‘)
break; i=i+1;
stud[i].setnum();//输入学号
stud[i].setname();//输入姓名
stud[i].setscore();//输入成绩
outfile.write((char*)&stud[i],sizeof(student)); }outfile.close();//关闭文件
cout<<"********输入结束********"<<endl; cout<<"\n你想看文件内容吗(y/n)?“;cin>>ch; if(ch=='Y'||ch=='y') {ifstreaminfile("student.dat",ios::binary);if(!infile){cout<<"Filecannotbeopened."<<endl;return0;} cout<<"学号"<<"\t姓名"<<"\t成绩"<<endl; infile.read((char*)&stud[i],sizeof(student));
i=1;while(infile) {cout<<stud[i].getnum()<<"\t“<<stud[i].getname()<<"\t“;cout<<stud[i].getscore()<<endl; i=i+1; infile.read((char*)&stud[i],sizeof(student)); }infile.close();//关闭文件 } return0;}8.6.3文件的读写3.文件的随机读写文件打开以后,系统自动生成两个隐含的流指针:读指针和写指针。在输入文件流类中,有关读指针的函数如下:(1)移动读指针函数istream&istream::seekg(streampospos);该函数的功能是将输入文件的指针移动到pos指定的位置中。istream&istream::seekg(streamoffoffset,seek_dirorigin);其中,origin的类型seek_dir是一个枚举类型,可有以下三种取值:ios::beg表示指针的起始位置为文件头ios::cur表示指针的起始位置为当前位置ios::end表示指针的起始位置为文件尾该函数的功能是从origin指定的开始位置起,将文件指针移动offset个字节数。例,假设input是一个istream类型的流:input.seekg(-100,ios::cur);以当前位置为基准向前(流的开始位置方向)移动100各字节处
input.seekg(100,ios::beg);从流开始的位置后移100个字节处 input.seekg(-100,ios::end);相对于流结尾处前移100个字节处8.6.3文件的读写(2)返回读指针当前指向的位置值streamposistream::tellg();该函数的功能是确定文件指针的当前位置。相应地,ostream类提供有关写指针的函数如下:(1)移动写指针函数ostream&ostream::seekp(streampospos);ostream&ostream::seekp(streamoffoffset,seek_dirorigin);(2)返回写指针当前指向的位置值streamposostream::tellp();函数参数的意义与读指针函数一样。例
读、写指针操作#include<iostream.h>#include<fstream.h>#include<stdlib.h>voidmain(){
fstreamfile("f6.dat",ios::in|ios::out|ios::binary);
if(!file){cout<<"f6.datcan'topen.\n“;
abort();} for(inti=0;i<15;i++)//每个int,占4个byte
file.write((char*)&i,sizeof(int));
streampospos=file.tellp();cout<<"Currentbytenumber:"<<pos<<endl;
for(i=15;i<45;i++)
file.write((char*)&i,sizeof(int));
file.seekg(pos);//输入文件,读
file.read((char*)&i,sizeof(int));
cout<<"Thedatastoredis"<<i<<endl;
file.seekp(0,ios::beg);//输出文件,写
for(i=80;i<100;i++)
file.write((char*)&i,sizeof(int));
file.seekg(pos);
file.read((char*)&i,sizeof(int);
cout<<"Thedatastoredis"<<i<<endl;
cout<<"Currentbytenumber:"<<file.tellp()<<endl;}Ans:Currentbytenumber:60Thedatastoredis15Thedatastoredis95Thedatastoredis21Currentbytenumber:88例:
数组#include<iostream.h>#include<fstream.h>#include<stdlib.h>voidmain(){
structstudent
{
charname[20];
longnumber;
doubletotalscord;
}
stu[5]={"Ma",97001,85.72,"Li",97002,92.62,
"Hu",97003,89.25,"Yan",97004,90.84,"Lu",97005,80.92};
fstreamfile;
studentone;
file.open("f7.dat",ios::out|ios::in|ios::binary);
if
(!file1)
{
cout<<“f7.datcan‘topen.\n‘;
abort();}
for(inti=0;i<5;i++)
file1.write((char*)&stu[i],sizeof(student));
file1.seekp(sizeof(student)*4);
file1.read((char*)&one,sizeof(stu[i]));
cout<<<<"\t"<<one.number<<"\t" <<one.totalscord<<endl;
file1.seekp(sizeof(student)&1);
file1.read((char8)&one,sizeof(stu[i]));
cout<<<<"\t"<<one.number<<"\t"<<one.totalscord<<endl;
file1.close();}Ans:Lu9700580.92Li9700292.628.6.3文件的读写例8.9:用二进制文件随机处理学生信息#include<iostream>#include<fstream>//文件流头文件#include<string>usingnamespacestd;classstudent{
private: longnum; stringname; floatscore;8.6.3文件的读写public: voidsetnum()
{
cin>>num;
}
//输入学号voidsetname(){
cin>>name;
}//输入姓名
voidsetscore(){
cin>>score;
}
//输入成绩longgetnum()
{returnnum;}
//得到学号stringgetname()
{returnname;
}
//得到姓名floatgetscore()
{
returnscore;
}
//得到成绩};intmain(){ fstreamfile;file.open("student.dat",ios::in|ios::out|ios::binary); if(!file)
{
cout<<“Filecannotbeopened.”<<endl;
return0;} studentstud[100],s;8.6.3文件的读写cout<<"首先输入3个学生的信息:"<<endl;cout<<"学号\t姓名\t成绩"<<endl;for(inti=0;i<3;i++) {
stud[i].setnum();//输入学号
stud[i].setname();//输入姓名
stud[i].setscore();//输入成绩
file.write((char*)&stud[i],sizeof(student)); }cout<<"再在第2个学生后插入两个学生的信息:"<<endl;cout<<"学号\t姓名\t成绩"<<endl; file.seekp(sizeof(student)*2);for(i=3;i<5;i++) {
stud[i].setnum();
stud[i].setname();stud[i].setscore();
file.write((char*)&stud[i],sizeof(student)); }
8.6.3文件的读写cout<<"输出第2,4个学生的信息:"<<endl;cout<<"学号\t姓名\t成绩"<<endl;file.seekg(sizeof(student)*1);//读指针移到第2条记录file.read((char*)&s,sizeof(student));cout<<s.getnum()<<"\t”<<s.getname()<<"\t”<<s.getscore()<<endl;file.seekg(sizeof(student)*3);
//读指针移到第4条记录file.read((char*)&s,sizeof(student));cout<<s.getnum()<<"\t”<<s.getname()<<"\t”<<s.getscore()<<endl;file.close();//关闭文件return0;}8.6.4其它有关文件操作的函数1.跳过输入流中指定数量的字符的函数该函数原型如下:istream&istream::ignore(intn=1,intt=EOF);功能是从流中跳过n个字符,或者直到发现终止符t为止一般的使用ctrl+z键结束从键盘上键入的输入流例:输入整数,发现错误,则跳过当前输入,等待下一次输入voidmain(){
inta;
cout<<"Inputaninteger:“;
cin>>a;
while(!cin)//判断输入流cin是否有错,有错时cin为0
{
cin.clear();//清楚错误标志位,等待下次输入
//最多跳过80字符或遇\n为止,等待下次输入
cin.ignore(80,'\n');
cout<<"Tryagain!"<<endl<<"Inputaninteger:";
cin>>a;
}
cout<<"Theintegerenteredis"<<a<<endl;}Ans:Inputaninteger:a789yTryagain!678aTheintegeryouenteredis6782.退回一个字符到输入流的函数函数原型如下:
istream&istream::putback(charch)功能是将读出的指定的字符退回到输出流中ch是指出要退回输入流的字符例:
从输入流中分析出数字串#include<iostream>#include<ctype.h>//内含isdigit(),非0为真intgetnum(char*s);voidmain(){
charbuf[80];
cout<<"Enterstream:\n";
while(getnum(buf))
cout<<"Digitstringis:"<<buf<<endl;}intgetnum(char*s)//每次处理一个数字串{
intflag(0);//标志量,没有数字串返回为0
charch;
while(cin.get(ch)&&!isdigit(ch)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理研究生中文文献汇报
- 中风病恢复期的护理
- 2025年沙河口区数学四下期中模拟试题含答案解析
- 中职专用《最后一片叶子》语文基础模块上册(高教版)B卷(解析版)
- 2025年木结构建筑可再生能源整合设计
- 安全b类基础试题及答案呈现
- DB44-T 2892-2026企业商业秘密保护合规管理规范
- 2025-2026年江苏省苏教版七年级英语下册第12单元课后习题
- 2025年西安交通大学钱学森班(能源与动力)入学考试试题及答案
- 公共基础管理 大纲 -
- 核心素养下的小学数学计算讲座
- 中医药健康知识讲座课件版
- 加盟招商合同协议模板
- 储备主管竞选述职报告
- 《眼科解剖及生理》课件
- 《三七总皂苷对ApoE-小鼠动脉粥样硬化炎症反应的影响及其机制研究》
- 《租赁厂房和仓库消防安全管理办法(试行)》专题培训
- JGJ52-2006 普通混凝土用砂、石质量及检验方法标准
- 房颤导管消融的适应症课件
- 经济思想史讲义兰州大学
- 房产测量作业指导书
评论
0/150
提交评论