第13章 输入与输出流_第1页
第13章 输入与输出流_第2页
第13章 输入与输出流_第3页
第13章 输入与输出流_第4页
第13章 输入与输出流_第5页
已阅读5页,还剩116页未读 继续免费阅读

下载本文档

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

文档简介

第13章输入与输出流提纲输出流和输入流的常用成员函数流操纵符流的错误状态文件和流文件操作打开文件读/写文件 关闭文件字符串流13.1C++的输入和输出(I/O)输入和输出,要看以什么为对象——

以标准I/O设备为对象从键盘、鼠标得到的数据是进入内存的,该数据是输入数据。将数据从内存送到显示器、打印机等,该数据是输出数据。以外存磁盘文件为对象内存中的数据存储到磁盘文件中,叫输出文件;从磁盘文件中的数据装载入内存中,叫输入文件。以内存中指定的空间作为对象常指定一个字符数组作为存储空间,这种I/O称为字符串的输入输出。C++采取不同的方法实现以上三种I/O。标准I/O文件I/O串I/O数据之间的传输过程称作流(stream)——输入流——表示数据从某个载体或设备传送到内存输出流——表示数据从内存传送到某个载体或设备C++的输入输出流内存键盘文件光笔....输入流显示器文件打印机...输出流在进行I/O操作时——首先进行“打开”操作,使流和文件发生联系建立联系后的文件才允许数据流入或流出I/O结束后,使用“关闭”操作使文件与流断开联系。C++将I/O流定义为类——流类。属于流类的对象是流对象系统已经以运算符或函数的形式做好了对标准外设(键盘、显示器、打印机、文件)的接口,使用时只需按照要求的格式调用即可。如:cin——标准输入流对象。

cout——标准输出流对象。C++的输入输出流C++的各种I/O流类库C++为实现数据的I/O定义了一个庞大的类库。它包括的类主要有——C++I/O类库中的其他类输入和输出流对象预先定义的输出和输入流对象:cout标准输出cerr标准错误输出,没有缓冲,发送给它的内容立即被输出。clog类似于cerr,但是有缓冲,缓冲区满时被输出。cin标准输入13.2标准输出流

标准输出流——流向标准输出设备(显示器)的数据cout流对象——在控制台(显示器)输出用流插入运算符“<<”向cout输出数据.如:

cout<<“a=”<<a<<endl;

cout<<数据1<<数据2<<数据3;cerr流对象——在控制台(显示器)输出错误信息用流插入运算符“<<”向cerr输出数据.如:

cerr<<“除数为0,出错!”<<endl;

cerr的用法与cout类似.cout流对象与cerr流对象的不同之处cout的输出默认是显示器,但可以被重定向为输出到磁盘文件cerr只能定向输出到显示器

例13.1解一元二次方程ax2+bx+c=0

的解voidmain(){floata,b,c,disc;

cout<<“输入a,b,c:”;cin>>a>>b>>c;if(a==0)cerr<<“a=0,不是二次方程,出错!”<<endl;else{disc=b*b-4*a*c;if(disc<0)cerr<<“二次方程无实根。”<<endl;else{cout<<“x1=”<<(-b+sqrt(disc))/(2*a)<<endl;

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

与格式控制符setw(n)相似cout.fill(c)

与格式控制符setfill(c)相似cout.setf(ios::dec);cout.unsetf(ios::hex);//书例13-3#include<iostream>usingnamespacestd;intmain(){inta=21;cout.setf(ios::showbase);cout<<"dec:"<<a<<endl;cout.unsetf(ios::dec);cout.setf(ios::hex);cout<<"hex:"<<a<<endl;cout.unsetf(ios::hex);cout.setf(ios::oct);cout<<"oct:"<<a<<endl;char*pt="China";cout.width(10);cout<<pt<<endl;cout.width(10);cout.fill('*');

cout<<pt<<endl;doublepi=22.0/7.0;cout.setf(ios::scientific);cout<<"pi=";cout.width(14);cout<<pi<<endl;cout.unsetf(ios::scientific);cout.setf(ios::fixed);cout.width(12);cout.setf(ios::showpos);

cout.setf(ios::internal);cout.precision(6);cout<<pi<<endl;return0;}13.3标准输入流标准输入流——从标准输入设备(键盘)流向程序的数据.

cin流对象

int

a,b;

cin>>a>>b;//从键盘输入2个整数当输入时遇到无效的字符或遇到文件结束符ctrl+z

cin处于出错状态,无法正常提取数据(cin=false).if(!cin)

cout<<“输入出错”;21abc↙#include<iostream>usingnamespacestd;intmain(){floatgrade;cout<<"entergrade:";

while(cin>>grade)//能从cin流读取数据{if(grade>=85)cout<<grade<<"GOOD!"<<endl;if(grade<60)cout<<grade<<"fail!"<<endl;cout<<"entergrade:";}cout<<"Theend."<<endl;return0;}函数功能read无格式输入指定字节数get从流中提取字符,包括空格getline从流中提取一行字符ignore提取并丢弃流中指定字符peek返回流中下一个字符,但不从流中删除gcount统计最后输入的字符个数eatwhite忽略前导空格seekg移动输入流指针tellg返回输入流中指定位置的指针值istream类的公有成员函数

输出流和输入流的常用成员函数intget();istream&get(char&rch);istream&get(char*pch,intnCount,chardelim='\n');istream&read(char*pch,intnCount);读取一个字符,不跳过空白字符读取一行字符,不提取‘\n’函数功能read无格式输入指定字节数get从流中提取字符,包括空格getline从流中提取一行字符ignore提取并丢弃流中指定字符peek返回流中下一个字符,但不从流中删除gcount统计最后输入的字符个数eatwhite忽略前导空格seekg移动输入流指针tellg返回输入流中指定位置的指针值istream&ignore(intnCount=1,intdelim=EOF);istream类的公有成员函数

intgcount()const;输出流和输入流的常用成员函数函数功能putostream&put(charch);无格式,插入一个字节writeostream&write(constchar*pch,intnCount);从无格式,插入一字节序列flush刷新输出流seekp移动输出流指针tellp返回输出流中指定位置的指针值ostream类的公有成员函数

用于字符输入的流成员函数不带参数的get函数

cin.get()

功能——从输入流提取1个字符;函数返回值就是该字符.若遇到文件结束符,则返回值为EOF,即-1.如:charch;while((ch=cin.get())!=EOF)

cout.put(ch);

键盘输入:

显示:

键盘输入:IstudyC++.

(程序结束)IstudyC++.↙Ctrl+ZEOF——EndOfFile字符输出的流成员函数,功能——在显示器上显示一个字符用于字符输入的流成员函数2.带1个参数的get函数

cin.get(ch)

功能——从输入流提取1个字符放入ch;

函数返回值就是非0值若遇到文件结束符,则返回值为0如:charch;while(cin.get(ch)!=0)

cout.put(ch);

键盘输入:

显示:

键盘输入:IstudyC++.

(程序结束)IstudyC++.↙Ctrl+Z用于字符输入的流成员函数3.带3个参数的get函数

cin.get(字符数组,字符个数n,终止字符)或

cin.get(字符指针,字符个数n,终止字符)功能——从输入流提取n-1个字符放入数组;

函数返回值就是非0值若遇到文件结束符,则返回值为0如charstr[20];

cin.get(str,10,’\n’);

cout<<str;

键盘输入:

显示:

IstudyCIstudyC++.↙cin.get()与cin.getline()的比较

cin.get(字符数组,字符个数n,终止字符)cin.getline(字符指针,字符个数n,终止字符)相同之处:从输入流提取n-1个字符放入数组,函数返回值是非0值.若遇到文件结束符,则返回值为0.不同之处:当读到终止字符时,cin.getline()——将指针移到终止字符之后。cin.get()——将指针移到终止字符处。则下次继续读取时的位置就不同。(代码测试一下)voidmain(){charc1,c2,c3;charstr1[80],str2[100];cout<<"输入三个字符:";c1=cin.get();

cin.get(c2);

cin.get(c3);

cin.get();cout<<"输入第一行字符串:";

cin.get(str1,80);

cin.get();cout<<"输入第二行字符串:";

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输出结果?除了以上介绍的用于读取数据的成员函数外,istream类还有其他在输入数据时用得着的一些成员函数。常用的有以下几种:1.eof函数eof是endoffile的缩写,表示“文件结束”。从输入流读取数据,如果到达文件末尾(遇文件结束符),eof函数值为非零值(表示真),否则为0(假)。13.3.3istream类的其他成员函数例13.8逐个读入一行字符,将其中的非空格字符输出。#include<iostream>usingnamespacestd;intmain(){charc;while(!cin.eof())//eof()为假表示未遇到文件结束符if((c=cin.get())!=‘‘)//检查读入的字符是否为空格字符

cout.put(c);return0;}2.peek函数peek是“观察”的意思,peek函数的作用是观测下一个字符。其调用形式为c=cin.peek();函数的返回值是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,并不后移。如果要访问的字符是文件结束符,则函数值是EOF(-1)。3.putback函数其调用形式为cin.putback(ch);其作用是将前面用get或getline函数从输入流中读取的字符ch返回到输入流,插入到当前指针位置,以供后面读取。例13.9peek函数和putback函数的用法。#include<iostream>usingnamespacestd;intmain(){charc[20];intch;cout<<″pleaseenterasentence:″<<endl;cin.getline(c,15,′/′);cout<<″Thefirstpartis:″<<c<<endl;ch=cin.peek();//观看当前字符

cout<<″Thenextcharacter(ASCIIcode)is:″<<ch<<endl;cin.putback(c[0]);//将′I′插入到指针所指处

cin.getline(c,15,′/′);cout<<″Thesecondpartis:″<<c<<endl;return0;}图13.44.ignore函数其调用形式为cin,ignore(n,终止字符)函数作用是跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)。如ignore(5,′A′)//跳过输入流中5个字符,遇′A′后就不再跳了也可以不带参数或只带一个参数。如ignore(n默认值为1,终止字符默认为EOF)相当于ignore(1,EOF)例13.10用ignore函数跳过输入流中的字符。先看不用ignore函数的情况:#include<iostream>usingnamespacestd;intmain(){charch[20];cin.get(ch,10,’/’);cout<<″Thefirstpartis:″<<ch<<endl;cin.get(ch,10,’/’);cout<<″Thesecondpartis:″<<ch<<endl;return0;}如果输入下面的情况,运行结果如何:(1)1234567890/(2)123456/如果希望第二个cin.get函数能读取″IstudyC++.″,就应该设法跳过输入流中第一个′/′,可以用ignore函数来实现此目的,将程序改为#include<iostream>usingnamespacestd;intmain(){charch[20];cin.get(ch,20,’/’);cout<<“Thefirstpartis:”<<ch<<endl;cin.ignore();//跳过输入流中一个字符

cin.get(ch,20,’/’);cout<<“Thesecondpartis:”<<ch<<endl;return0;}以上介绍的各个成员函数,不仅可以用cin流对象来调用,而且也可以用istream类的其他流对象调用。标识常量值意义ios::goodbit0x00状态正常ios::eofbit0x01文件结束符,当文件结尾时设置该标志ios::failbit0x02I/O操作失败,数据未丢失,可以恢复ios::badbit0x04非法操作,数据丢失,不可恢复0000000000000000000000000000000100000000000000100000000000000100流错误状态所有流都把流的状态存储在状态字中不同标志位中存储不同的错误状态位包含在类ios的enum成员中

ios处理流错误状态的公有成员函数

函数功能inteof()const;返回eofbit状态值。文件结束符时返回1,否则返回0intfail()const;返回failbit状态值intgood()const;eofbit、failbit和badbit都没有被设置,则返回1intbad()const;badbit被设置,则返回1(当发生严重错误:如数据丢失)intrdstate()const;返回状态字voidclear(intnState=0);恢复或设置状态字例如:clear(ios::failbit)流错误状态#include<iostream>usingnamespacestd;

intintegerValue;//displayresultsofcinfunctionscout<<"Beforeabadinputoperation:"<<"\ncin.rdstate():"<<cin.rdstate()<<"\ncin.eof():"<<cin.eof()<<"\ncin.fail():"<<cin.fail()<<"\ncin.bad():"<<cin.bad()<<"\ncin.good():"<<cin.good()<<"\n\nExpectsaninteger,butenteracharacter:";cin>>integerValue;//entercharactervaluecout<<endl;//displayresultsofcinfunctionsafterbadinputcout<<"Afterabadinputoperation:"<<"\ncin.rdstate():"<<cin.rdstate()<<"\ncin.eof():"<<cin.eof()<<"\ncin.fail():"<<cin.fail()<<"\ncin.bad():"<<cin.bad()<<"\ncin.good():"<<cin.good()<<endl<<endl;

cin.clear();//clearstream//displayresultsofcinfunctionsafterclearingcincout<<"Aftercin.clear()"<<"\ncin.fail():"<<cin.fail()<<"\ncin.good():"<<cin.good()<<endl;return0;提纲文件和流文件操作打开文件读/写文件 关闭文件

13.4文件操作与文件流文件

存储在某种设备(磁带、光盘、软盘或硬盘)上数据的集合;对用户来说,文件分成两大类:

程序文件数据文件从文件中数据的组织形式来分:ASCII文件(文本文件)二进制文件本节特别介绍:磁盘文件文本文件和二进制文件文本文件(ASCII文件):文件中的内容都是字符,以ASCII码形式存在文件内.如:12345在文本文件中是以‘1’,’2’,’3’,’4’,’5’共5个字符形式存储的二进制文件:文件中的内容是以数据的二进制形式存储的.如:12345在二进制文件中按1个整数类型以二进制形式存储,占4个字节空间文件处理模板在流类体系中,包含文件流类体系iosistreamiostreamostreamstreambufifstreamofstreamfstreamfilebuf完成从文件提取数据完成向文件插入数据完成提取插入操作完成文件缓冲区管理文件流用标准流进行I/O时,系统自动地完成数据类型的转换。对于输入流,要将输入的字符序列形式的数据变换成计算机内部形式的数据(二进制或ASCII)后,再赋给变量,变换后的格式由变量的类型确定。对于输出流,将要输出的数据变换成字符串形式后,送到输出流(文件)中。内存变量(程序)键盘输入文件屏幕输出文件cin>>xcout<<xinfile>>xoutfile<<x程序对文本文件的操作与对键盘、显示器的操作比较:在涉及文本文件的操作时,将输入文件看成键盘,将输出文件看成显示器,格式不变。只需在程序中增加打开与关闭文件的语句。012345n-1------------------------内存------------------------ifstreamfinfstreamfinoutofstreamfout读文件写文件读/写文件10.5.1文件和流文件和流012345n-1文件字节序号文件结束符文件长度=n文件和流012345……ifstreamfin读文件24378inta,b;fin>>a>>b;10.5.3文本文件a0X00f3b0X004e文件和流012345……24378a0X00f3b0X004eintc;c=a+b;fout<<"c=

"<<c<<endl;ofstreamfoutinta,b;fin>>a>>b;写文件c0X0141c=321\n文件和流文件操作文件操作的基本步骤:定义一个文件流对象打开文件读/写文件 关闭文件

使用文件流类,必须包含头文件#include<fstream>文件操作

-定义一个文件流对象

如:

//用于与一个输入文件建立联系

ifstreaminfile;//用于与一个输出文件建立联系

ofstreamoutfile;

//用于与一个输入输出文件建立联fstreamiofile;文件操作-打开文件与外部文件关联;指定文件的打开方式;有两种方式打开文件方法1:

调用流类带参数的构造函数建立流对象时连接外部文件

流类对象名(文件名,方式);文件操作-打开文件

ifstream、ofstream或fstream第二个参数表示文件的打开方式标识常量意义ios::in读方式打开文件ios::out写方式打开文件ios::ate打开文件时,指针指向文件尾ios::app追加方式ios::trunc删除文件现有内容ios::binary二进制方式打开,默认为文本方式ios::in|ios::out以输入和输出方式打开文件,文件可读写ios::out|ios::binary或者ios::in|ios::binary以二进制方式打开一个输出(或者输入)文件10.5.2打开和关闭文件文件操作-打开文件例如:

ifstreaminfile("datafile.dat",ios::in); ofstreamoutfile("d:\\newfile.dat",ios::out); fstreamrwfile("myfile.dat",ios::in|ios::out);ofstreamofile("a:\\binary",ios::binary|ios::app);用“|”(或运算符)连接两个表示打开方式的标识常量10.5.2打开和关闭文件打开一个二进制文件进行追加操作文件操作-打开文件

文件操作-打开文件方法2

先建立流对象,后调用fstream::open()函数连接外部文件流类对象名;

对象名.open(文件名,方式);打开文件成员函数格式:voidfstream::open(constchar*,int,int=filebuf::openprot);voidifstream::open(constchar*,int=ios::in,int=filebuf::openprot);voidofstream::open(constchar*,int=ios::out,int=filebuf::openprot);打开的文件名文件的打开方式文件打开时的保护方式,如:独占打开无缺省值参数ios::…意义文件操作-打开文件打开一个已有文件datafile.dat,准备读:

ifstream

infile; //建立输入文件流对象

infile.open(“datafile.dat”,ios::in);//连接文件,指定打开方式打开(创建)一个文件newfile.dat,准备写:

ofstream

outfile; //建立输出文件流对象

outfile.open("d:\\newfile.dat",ios::out);//连接文件,指定打开方式与cin和cout的用法相同如:infile>>x;outfile<<y;对文件进行读写操作在对文件进行读写时,我们将文件看成字符流,文件流……读写位置指针随着文件的读写,指针移动。

关闭文件操作包括把缓冲区数据完整地写入文件,添加文件结束标志,切断流对象和外部文件的连接当一个流对象的生存期结束,系统也会自动关闭文件;若流对象的生存期没有结束,用close()关闭文件后,该流对象可以重用.文件操作-关闭文件文件操作-关闭文件voidifstream::close();voidofstream::close();voidfstream::close();如:infile.close();//切断与输入文件myfile1.txt的联系

outfile.close();//切断与输出文件myfile2.txt的联系

iofile.close();//切断与输入输出文件myfile3.txt

的联系文件读写完毕,必须关闭。关闭文件成员函数格式:eg:

ofstreamofile;

//创建输出文件流

ofile.open(“myfile1”

,ios::out

);

//ofile流与文件“myfile1”相关联

……

//访问文件“myfile1”ofile.close();//关闭文件“myfile1”ofile.open(“myfile2”,ios::out); //重用对象ofile等价于使用构造函数:ofstreamofile(“myfile1”

,ios::out

);10.5.2打开和关闭文件文件操作-关闭文件close()函数关闭文件但流对象仍然存在打开与关闭错误if(!outfile)//之前outfile.open(“myfile2.dat”)

{cerr<<”error:unabletoopenfile2!”;}检测文件是否成功打开,可在条件表达式中使用取反操作符(!)测试流状态

(一般是读文件的时候用)为了测试成功关闭文件,可以调用fail()函数,如myfile2.close();if(myfile2.fail())cerr<<”Errortoclosemyfile2!;”将文件类对象看成键盘和显示器即可。ifstreaminfile;//定义输入文件类对象infile.open(“myfile1.txt”);//利用函数打开某一文件floatx,y;infile>>x>>y;myfile1.txt34内存infilexy34用infile代替myfile1.txt进行操作。如何从文件中读出数据?ofstreamoutfile;//定义输出文件类对象outfile.open(“myfile2.txt”);//利用函数打开某一文件

floatx=3,y=4;outfile<<x<<‘\t’<<y<<endl;myfile2.txt内存outfilexy34用outfile代替myfile2.txt进行操作。34如何把数据写到文件?ifstreaminfile;ofstreamoutfile;infile.open(“myfile1.txt”);outfile.open(“myfile2.txt”);floatx,y;infile>>x>>y;outfile<<x<<‘\t’<<y<<endl;infile.close();outfile.close();myfile1.txt34内存infilexy34myfile2.txtoutfile34infile.close();outfile.close();用完文件后,使用成员函数关闭文件文件读写-文本文件(顺序文件)文本文件文件的每个字节都是用ASCII代码存放数据,即每个字节存放一个字符,这种文件又称字符文件文件的默认打开方式为文本文件文本文件是顺序存取文件文本文件本身没有记录逻辑结构,通常一个逻辑记录用换行符分隔;数据项之间可以用空白符、换行符、制表符等分隔。#include<fstream>#include<iostream>usingnamespacestd;voidmain(){inta[10];ofstreamoutfile(“f1.dat”);//定义文件流对象,打开文件″f1.dat″

if(!outfile)

//若打开失败,返回0值

{cerr<<″openerror!″<<endl;exit(1);}cout<<″enter10integernumbers:″<<endl;for(inti=0;i<10;i++){cin>>a[i];

outfile<<a[i]<<″″;//向文件″f1.dat″输出数据

}

outfile.close();

//关闭文件″f1.dat″}例13.11有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组送到磁盘文件地f1.dat中存放。文件处理流程定义并打开文件对象打开文件出错处理对文件进行R/W操作关闭文件对象#include<fstream>#include<iomanip>usingnamespacestd;voidmain(){ofstreamost;ost.open("C:\\my2.txt");ost<<"1234567890"<<endl;inta=123;ost<<a<<endl;ost<<setw(10)<<a<<endl;ost<<setiosflags(ios::left)<<setfill('#')<<setw(10)<<a<<endl;ost<<setiosflags(ios::right)<<setprecision(5)<<setw(10)<<12.34567890<<endl;ost.close();}例:使用格式控制建立的文本文件以指定格式插入数据默认方式打开文本文件#include<iostream>#include<fstream>usingnamespacestd;voidmain(){ofstreamout("test.txt");if(!out){cout<<"cannotopenfile.";return;}out<<10<<""<<123.45<<"";out<<"\nThisisashorttextfile.";out.close();}例:将数据写入到文件对数值常量做转换#include<iostream>#include<fstream>usingnamespacestd;voidmain(){charch;inti;floatf;charstr1[10],str2[10];ifstreamin("test.txt");if(!in){cout<<"cannotopenfile.";return;}

in>>i>>f>>ch>>str1>>str2;cout<<i<<“”<<f<<“”<<ch<<'\n';cout<<str1<<str2<<endl;in.close();}ifstreamininti

floatf

charchcharstr1[]charstr2[]10.5.3文本文件例从文件读出数据#include<iostream>#include<fstream>usingnamespacestd;

voidmain(){charch;inti;floatf;charstr1[10],str2[10];ifstreamin("test.txt");if(!in){cout<<"cannotopenfile.";return;}in>>i>>f>>ch>>str1>>str2;

cout<<i<<“”<<f<<“”<<ch<<'\n';cout<<str1<<str2<<endl;in.close();}10.5.3文本文件例:从文件读出数据inti10floatf 123.45charchTcharstr1[]hischarstr2[]isostreamcout#include<fstream>usingnamespacestd;voidmain(){charstr[]="\tNewstring";ofstreamf2("test.txt",ios::app); //追加方式

if(!f2){cout<<"cannotopentestnewforouput.";return;}f2<<str; //插入字符串

f2.close();}例在文件

testnew的末尾添加字符串插入串#include<iostream>#include<fstream>usingnamespacestd;voidmain(){charch;ifstreamf1("test.txt");if(!f1){cout<<"cannotopen'test'forinput.";return;}ofstreamf2("testnew.txt");if(!f2){cout<<"cannotopentestnewforouput.";return;}

while(f1&&f1.get(ch))f2.put(ch);f1.close();f2.close();cout<<"Itisover!\n";}ifstreamf1ofstreamf2ch10.5.3文本文件例:复制数据到文件

将文件test的内容复制到testnew中例

将数值1~100及其平方根写入文件sqrttable.txt

#include<iostream>#include<fstream>#include<cmath>usingnamespacestd;voidmain(){doublex;ofstreamout;//定义一个输出流对象

out.open("sqrttable.txt");//打开文本文件sqrttable.txtfor(x=1;x<=100;x++)

out<<x<<'\t'<<sqrt(x)<<endl;//将结果写入文件

out.close();//关闭文件}例

编写一个程序,用于显示一个文本文件#include<iostream>#include<fstream>usingnamespacestd;voidmain(){ charfilename[40],line[80]; ifstreaminfile;

cout<<"Pleaseinputafilename:"; cin>>filename;//A

infile.open(filename);//B如果打开不成功,

infile为0if(!infile)

{ cout<<"Cannotopenfile:"<<filename<<endl; exit(1);}while(infile.getline(line,80))//读入一行

cout<<line<<endl;infile.close();//显示一行

}改写为:infile.unsetf(ios::skipws);//设置不跳过空白字符while(infile>>ch)//读入一个字符

cout<<ch;//显示一个字符例

从一个文本文件source.txt中读入若干整数,用选择法将这些数据排成升序,将排序后的结果写入另一个文件文本文件target.txt中事前准备数据文件:source.txt

#include<iostream>#include<fstream>usingnamespacestd;voidsort(int*a,intn)//一般的选择法排序函数{ inti,j,p,t; for(i=0;i<n-1;i++) { p=i; for(j=i+1;j<n;j++) if(a[j]<a[p]) p=j; if(p!=i) {t=a[i];a[i]=a[p];a[p]=t;} }}voidmain(){ inta[100],i,n; fstreamin,out;

in.open("c:\\source.txt",ios::in); if(!in) { cout<<"Cannotopensource.txt!"<<endl; exit(1);} out.open("c:\\target.txt",ios::out); if(!out) { cout<<"Cannotopentarget.txt!"<<endl; exit(2);} i=0; while(in>>a[i])i++;//循环结束后,i是整数的个数

sort(a,i); n=i; for(i=0;i<n;i++) out<<a[i]<<endl; in.close(); out.close();}

文件读写

---二进制文件(随机存取文件)

二进制文件以基本类型数据在内存的二进制表示形式存放数据,不对写入或读出的数据做格式转换;打开二进制文件用ios::binary方式;二进制文件的读写方式由程序控制;二进制文件是随机存取文件。13.4.5对二进制文件的操作若在文件的打开方式中没有特别说明,打开的文件均为ASCII码文件,若要打开二进制文件,则要特别说明并用特定的读写函数。fstreaminfile,outfile;infile.open(“inf1.dat”,ios::in|ios::binary);outfile.open(“outf1.dat”,ios::out|ios::binary);文件名输入方式打开二进制文件文件名输出方式打开二进制文件1.文件的读写操作(成块读写)成员函数:istream&istream::read(char*,int);istream&istream::read(unsignedchar*,int);istream&istream::read(signedchar*,int);ostream&ostream::write(constchar*,int);ostream&ostream::write(constunsignedchar*,int);ostream&ostream::write(constsignedchar*,int);前三个为读取操作:将第二个参数指定的字节数读入到以第一个参数为起始地址的内存中。后三个为写操作:从第一个参数为起始地址的内存开始,将连续的第二个参数指定字节数的内容写到文件中。012345n-1文件指针10.5.1文件和流ios::begios::curios::end二进制文件的顺序读写流的状态表示:流的内容、长度和操作位置

ostream

类中两个操作字节数据的成员函数ofstreamoutf("test.dat",ios::out|ios::binary);inta[10]={1,2,3,4,5};for(inti=0;i<10;i++)outf.write((char*)(&a[i]),sizeof(int));outf.close();二进制文件的顺序读写outf.write((reinterpret_cast<char*>(a),10*sizeof(int));

istream

类中操作字节数据的成员函数

get(char&c);c=get();

getline(char*buffer,intsize,char=‘\n’);10.5.4二进制文件istream&istream::read(char*buf,intn);从流中提取n个字节数据,更新对象buf

ifstreaminf("test.dat",ios::in|ios::binary);intbuffer[10];for(intj=0;j<10;j++)inf.read((char*)&buffer[j],sizeof(int));inf.read(reinterpret_cast<char*>(buffer),10*sizeof(int));注意类型转换二进制文件的顺序读写例13.14将一批数据以二进制形式存放在磁盘文件中。#include<fstream>#include<iostream>usingnamespacestd;structstudent{charname[20];intnum;intage;charsex;};voidmain(){studentstud[3]={“Li”,1001,18,‘f’,“Fun”,1002,19,‘m’,“Wang”,1004,17,‘f’};

ofstreamoutfile(“stud.dat”,ios::out|ios::binary);if(!outfile){cerr<<″openerror!″<<endl;abort();//退出程序

}for(inti=0;i<3;i++)outfile.write((char*)&stud[i],sizeof(stud[i]));outfile.close();}可以一次输出整个数组到磁盘文件:outfile.write((char*)&stud[0],sizeof(stud));用此方法一次可以输出一批数据,效率较高。在输出的数据之间不必加入空格,在一次输出之后也不必加回车换行符。在以后从该文件读入数据时不是靠空格作为数据的间隔,而是用字节数来控制。例13.14将一批数据以二进制形式存放在磁盘文件中例13.15将刚才以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。#include<fstream>#include<iostream>usingnamespacestd;structstudent{stringname;intnum;intage;charsex;};voidmain(){studentstud[3];inti;

ifstreaminfile(“stud.dat”,ios::in|ios::binary);if(!infile){cerr<<“openerror!”<<endl;abort();}

for(i=0;i<3;i++)

infile.read((char*)&stud[i],sizeof(stud[i]));

infile.close();for(i=0;i<3;i++){cout<<“NO.”<<i+1<<endl;cout<<“name:”<<stud[i].name<<endl;cout<<“num:”<<stud[i].num<<endl;cout<<“age:”<<stud[i].age<<endl;cout<<“sex:”<<stud[i].sex<<endl<<endl;}}问题:能否一次读入文件中的全部数据,如

infile.read((char*)&stud[0],sizeof(stud));

运行时显示器上显示NO.1name:Linum:1001age:18sex:fNO.2name:Funnum:1001age:19sex:mNO.3name:Wangnum:1004age:17sex:f可以!infile.eof()

当到达文件结束位置时,该函数返回一个非零值;否则返回零。fstreaminfile;infile.open(“data1.dat”,ios::in|ios::binary);if(!infile){cerr<<“OpenError!\n”;exit(1);}charstr[300];while(!infile.eof())infile.read(str,300);判断打开是否出错判断是否读到文件尾判断二进制文件是否读到文件尾?例读入文本文件data.txt中的数据,写入二进制文件data.bin中。voidmain(){ inta[100],n=0; ifstreaminfile("data.txt",ios::in); if(!infile) { cout<<"Cannotopeninputfile:data.txt"<<endl; exit(1); } while(!infile.eof())//eof()函数的功能?

infile>>a[n++];//读入到数组中

infile.close(); ofstreamoutfile("data.bin",ios::out|ios::binary); if(!outfile) { cout<<"Cannotopenoutputfile:data.dat"<<endl; exit(2); } outfile.write((char*)&n,sizeof(int));//写出元素个数

outfile.write((char*)a,n*sizeof(int));//写出整个数组

outfile.close();}voidmain(){charfilename1[256],filename2[256];charbuff[4096];//设置输入缓冲区cout<<”输入源文件名:”;cin>>filename1;cout<<”输入目的文件名:”;cin>>filename2;fstreaminfile,outfile;infile.open(filename1,ios::in|ios::binary);outfile.open(filename2,ios::out|ios::binary);intn;while(!infile.eof()){ //文件不结束,继续循环

infile.read(buff,4096); //一次读4096个字节

n=infile.gcount(); //取实际读的字节数

outfile.write(buff,n); //按实际读的字节数写入文件

}infile.close();outfile.close();}

实现两个二进制文件拷贝的程序......文件内容读写位置指针读写数据后自动移动读写位置指针istream类和ostream类提供成员函数,控制读写位置指针的移动,实现文件的随机读写。文件刚打开时:二进制文件的随机读写012345n-1文件指针10.5.1文件和流ios::beg文件结束ios::curios::end二进制文件的随机读写流的状态表示:流的内容、长度和操作位置二进制文件的随机读写随机访问流012345n-1ios::begios::curios::endios::seek_dir值:cur

相对于当前读指针所指定的当前位置beg

相对于流的开始位置end

相对于流的结尾处enumios::seek_dir{beg=0;cur=1,end=2};

istream&istream::seekg

(longpos);

读指针从流的起始位置向后移动由pos指定字节

istream&istream::seekg

(longoff,ios::seek_dir);

读指针从流的seek_dir位置移动

off指定字节istream类操作流读指针的成员函数10.5.4二进制文件long&istream::

tellg();

返回读指针当前所指位置值二进制文件的随机读写例如:

istreaminput; ……input.seekg(-10,ios::cur);

//读指针以当前位置为基准,向前移动10个字节begendcurcur10.5.4二进制文件istream类操作流读指针的成员函数二进制文件的随机读写例如:

istreaminput; ……begendcurinput.seekg(10,ios::beg);//读指针从流的开始位置,向后移动10个字节函数 seekg(n);等价seekg(n,ios::beg);cur10.5.4二进制文件istream类操作流读指针的成员函数二进制文件的随机读写例如:

istreaminput; ……begendcurcurinput.seekg(-10,ios::end);//读指针从流的结尾,向前移动10个字节istream类操作流读指针的成员函数二进制文件的随机读写Eg:

istreaminput; longpos=input.tellg(); //获取当前位置指针

input>>number; //读入一个整数,指针后移4字节

……input.seekg(pos); //指针返回原来位置

input>>number; //重读该整数begendcur…i-1ii+1…200311istream类操作流读指针的成员函数二进制文件的随机读写

ostream&ostream::seekp(longpos)

温馨提示

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

评论

0/150

提交评论