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

下载本文档

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

文档简介

1第九章输入/输出流库9.1概述C++具有一个功能强大的I/O类继承体系结构用于处理数据的输入/输出问题,该体系结构不仅提供了对系统内置数据类型的输入/输出操作,而且允许通过重载扩展其功能以实现自定义数据类型的输入和输出操作。本章主要介绍C++流的基本结构,数据的输入输出及其格式化问题,同时还介绍了C++文件的编程技术。1.流的概念A8bctyx1234源设备目标设备字符序列从源设备连续不断地流向目标设备,最后按先流出先到达的有序方式汇聚在目标设备中,如同河流一样,故此叫流。2第九章输入/输出流库(1)流有向的数据流动的抽象描述,是数据流动的渠道和方向,是程序与输入/输出设备的连接桥梁。(2)I/O流指对流的操作集合,它将数据流向流对象,或从流对象流出数据。(3)输出流数据从内存缓冲区传送到目标设备中的流。(4)输入流数据从目标设备传送到内存缓冲区中的流。3第九章输入/输出流库流实际上是一种对象,它在使用前被建立,使用后被删除。如:cin表示输入流对象,C++已将其与键盘关联;cout表示输出流对象,C++已将其与显示器关联。数据的输入/输出操作就是从流中提取数据或者向流中添加数据。通常把从流中提取数据的操作称为析取,即读操作;向流中添加数据的操作称为插入操作,即写操作。2.C++I/O流类的继承结构C++建立了一个十分庞大的流类库来实现数据的输入/输出操作,其中的每个流类实现不同的功能,这些类通过继承组合在一起。4第九章输入/输出流库5第九章输入/输出流库3.C++主要的流类简介(1)streambuf主要作为其他类的支持,定义了对缓冲区的通用操作,如设置缓冲区,从缓冲区中读取数据,或向缓冲区写入数据等操作。(2)filebuf类使用文件来保存缓冲区中的字符序列。它定义了文件读、写、打开、关闭等常用操作。(3)ios是所有流类的基类,提供对流状态进行设置的主要功能。如文件数据的格式码设置与取消,关链文件缓冲区借以实现数据读写等。(4)istream是输入流类,实现数据输入的功能。(5)ostream是输出流类,实现数据输出的功能。6第九章输入/输出流库(6)iostream是istream和ostream的派生类,它继承了istream类和ostream类的行为,支持数据输入、输出的双向操作,在程序中常通过它来实现数据的输入与输出功能。(7)fstreambase从ios派生,提供了文件操作的许多功能,作为其他文件操作类的公共基类。(8)ifstream类用来实现文件读取操作。(9)ofstream类用来实现文件写入操作。(10)fstream继承了fstreambase和iostream类的功能,实现了文件读/写的双向操作。4.C++预定义的输入/输出流对象为了便于程序数据的输入/输出,C++预定义了几个标准输入/输出流对象,在程序中可以直接引用它们来输入/输出数据。如下表所示:7第九章输入/输出流库流对象定义说明ostreamcout;cout与标准输出设备相关联(显示器)ostreamcerr;cerr与标准错误输出设备相关联(非缓冲方式)ostreamclog;clog与标准错误输出设备相关联(缓冲方式)istreamcin;与标准输入设备相关联(键盘)89.2使用cin与cout输入/输出数据cin:设备输入流对象(键盘),与运算符>>一起完成输入操作。cout:设备输出流对象(显示器),与运算符<<一起完成输出操作。<<:插入操作符,是重载的左移位运算符,C++编译时首先检查其左右操作数,以判断是执行移位还是插入操作,所以不会出现歧义。该操作符用来输出变量数据。格式为:cout<<输出项列表(常量、变量、转义符等);>>:析取操作符,是重载的右移位运算符,C++编译时首先检查其左右操作数,以判断是执行移位还是析取操作,所以不会出现歧义。该操作符用来为变量输入数据。格式为:cin>>变量列表;第九章输入/输出流库91.使用cin输入数据(1)语法①输入单个变量的值 cin>>x;②输入多个变量的值 cin>>x1>>x2>>x3>>x4>>……>>xn;其中x,x1,……,xn可以是内置数据类型如int,char,float,double等。(2)注意事项①在一条cin语句中同时为多个变量输入数据时,输入数据的个数应当与cin语句中变量个数相同,各输入数据之间用一个或多个空白(包括空格、回车、Tab)作为间隔符,全部数据输入完成后,按Enter键结束。第九章输入/输出流库10②在>>后面只能出现变量名,下面的语句是错误的。cin>>"x=">>x; //错误,>>后面含有字符串"x="cin>>12>>x; //错误,>>后面含有常数12③cin具有自动识别数据类型的能力,析取运算>>将根据它后面的变量的类型从输入流中为它们提取对应的数据。比如:cin>>x;假设输入数据2,析取运算符>>将根据其后的x的类型决定输入的2到底是数字还是字符。若x是char类型,则2就是字符;若x是int,float之类的类型,则2就是一个数字。再如,若输入34,且x是char类型,则只有字符3被存储到x中,4将继续保存在流中;若x是int或float,则34就会存储x中。第九章输入/输出流库11④数值型数据的输入在读取数值型数据时,析取运算符>>首先略掉数据前面的所有空白符号,在遇到正、负号或数字,才开始读入,包括浮点型数据的小数点,并在遇到空白符或其他非数字字符时停止。例如: intx1; doublex2; charx3; cin>>x1>>x2>>x3;假如输入35.4A并按Enter键,x1是35、x2是0.4、x3是‘A’。(3)输入数据案例分析第九章输入/输出流库12假设有变量定义语句如下:inta,b;doublez;charch;下面的语句说明数据输入的含义。语句 输入 内存变量的值cin>>ch; A ch='A'cin>>ch; AB ch='A',而'B'被保留在输入流中等待被读取cin>>a; 32 a=32cin>>a; 32.23 a=32,.23留在输入流中等待被读取cin>>z; 76.21 z=76.21cin>>z; 65 z=65.0第九章输入/输出流库13语句 输入 内存变量的值cin>>a>>ch>>z;23B3.2 a=23,ch=‘B’,Z=3.2cin>>a>>ch>>z;

23B3.2 a=23,ch=‘B’,Z=3.2cin>>a>>b>>z;

2332 a=23,b=32,等待输入下一个数据存入zcin>>a>>z; 23.224 a=2,z=3.2,24被保留在输入流中等待被读取cin>>a>>ch; 132 a=132,计算机等待输入ch的值cin>>ch>>a; 132 ch='1',a=32第九章输入/输出流库142.使用cout输出数据(1)语法①输出单个变量的值 cout<<x;②输出多个变量的值 cout<<x1<<x2<<x3<<x4<<……<<xn;其中x,x1,……,xn可以是内置数据类型如int,char,float,double等。(2)注意事项①cout既可输出变量的值,也可输出常量。②对于字符变量和字符串变量,cout将把变量的值输出到显示器上。对于字符常量和字符串常量,cout将把它们原样输出在屏幕上。第九章输入/输出流库15③与C语言一样,在C++程序中也可以将一条命令写在多行上。④输出换行。在cout语句中换行可用:“\n”或endl。⑤在连续输出多个数据时,应注意在数据之间插入间隔符。因为cout输出不带任何格式。⑥确定数制基数,输出时可用hex(16进制),oct(8进制),dec(10进制)指定输出数值型数据的进制。如:#include<iostream.h>voidmain(){ intx=34;cout<<hex<<17<<""<<x<<""<<18<<endl;//显示112212cout<<17<<""<<oct<<x<<""<<18<<endl;//显示114222cout<<dec<<17<<""<<x<<""<<18<<endl;//显示173418}第九章输入/输出流库169.3使用I/O成员函数输入/输出数据1.istream类中的常用成员函数classistream:virtualpublicios{public: istream&operator>>(double&); istream&operator>>(…); //还有重载其它类型数据的输入 intget(); istream&get(char*,int,char='\n'); istream&get(char&); istream&getline(char*,int,char='\n'); istream&read(char*,int); istream&ignore(int=1,int=EOF); ......};第九章输入/输出流库172.istream成员函数使用说明(1)get()函数①intget()不带参数的get()从输入流中提取一个字符(包括空白字符),并返回该字符作为函数的调用值。当遇到文件结束时,返回文件结束符EOF。②istream&get(char*c,intn,char='\n')从输入流中提取n-1个字符(包括空白字符)存入字符数组c中,并在字符串末尾自动加'\0'。第3个参数用于指定字符结束的分隔符,默认是‘\n’。该函数在下列情况会终止读取字符的操作:读取了n-1个字符;遇到了指定的结束分隔符;遇到了文件结束符。第九章输入/输出流库18注意:该函数不会将输入流中的结束分隔符读入数组中,数据读取完成后结束分隔符仍保留在输入流中,为后续数据读入留下隐患。③istream&get(char&c)从输入流中提取一个字符(包括空白字符)送字符引用c中。遇到文件结束符时返回0,否则返回istream对象的引用。(2)istream&read(char*c,intn)从输入流中读取n个字节送字符数组c中。非格式化的读,对读取的字节不作任何处理,数据由程序解释。(3)istream&ignore(intn=1,int=EOF)从输入流中读取n个(默认1个)字符不保存,遇到指定结束符(默认EOF)时终止输入。实质上从输入流中删除n个字符。第九章输入/输出流库19(4)istream&getline(char*c,intn,char='\n')从输入流中提取n-1个字符(包括空白字符)存入字符数组c中,并在字符串末尾自动加'\0'。第3个参数用于指定字符结束的分隔符,默认是‘\n’。该函数在下列情况会终止读取字符的操作:读取了n-1个字符;遇到了指定的结束分隔符;遇到了文件结束符。注意:该函数不会将输入流中的结束分隔符读入数组中,但会清除结束分隔符,为后续数据读入提供方便。第九章输入/输出流库20例:用函数get和getline读取数据。#include<iostream.h>voidmain(){ charc,a[80],s1[80]; cout<<"useget()inputchar:"; while((c=cin.get())!='\n') //输入abcd cout<<c; //显示abcd cout<<endl; cout<<"useget(a,10)inputchar:"; cin.get(a,10); //输入12345678,不够9个字符 cout<<a<<endl; //显示12345678 cin.ignore(); //清除上次输入的’\n’第九章输入/输出流库21 cout<<"usegetline(s1,10)inputchar:"; cin.getline(s1,10); //输入thisisastr,读9个 cout<<s1<<endl; //显示thisisa}本例输入流及数据读取情况如下图所示:第九章输入/输出流库223.ostream类中的常用成员函数classostream:virtualpublicios{public: ostream&operator<<(long&); ostream&operator<<(…); //还有重载其它类型数据的输出 ...... ostream&flush(); ostream&put(char); ostream&write(constchar*,int); ......};第九章输入/输出流库234.ostream成员函数使用说明(1)ostream&put(charc)插入一个无格式的字节到输出流中。其中c是要输出的字符,函数返回输出流对象的引用。(2)ostream&write(constchar*c,intn)插入一个无格式的字符序列到输出流中。其中c是要输出的字符数组,n是要输出的字符个数,函数返回输出流对象的引用。(3)ostream&flush()缓冲输出:数据写入缓冲区,缓冲区满时才将数据送输出设备。缓冲输出的输出数据会有所延迟。非缓冲输出:数据写入缓冲区,并立即将数据送输出设备。第九章输入/输出流库24输出缓冲区刷新函数。用于刷新输出流,即不论缓冲区满与不满,立即将缓冲区中的数据送到输出设备。例:用get读取数据,用put及write输出。#include<iostream.h>voidmain(){ charc; chara[]="Thisisastring!"; cout<<"useget()inputchar:"; while((c=cin.get())!=‘\n’) //输入howareyou! cout.put(c); //显示howareyou! cout.put('\n'); cout.put(‘T’).put(‘h’).put(‘i’).put(‘s’).put(‘\n’);//显示This cout.write(a,sizeof(a)-1).put(‘\n’);//显示Thisisastring! cout<<“look”<<“\there!”<<endl;}//显示lookhere!第九章输入/输出流库259.4数据输入/输出的格式控制1.格式控制的目的(1)进行不同进制之间的转换:8进制、16进制、十进制等。(2)精度的控制:小数点的位数等。(3)输入/输出的宽度控制。(4)格式之间的状态转换。2.格式控制的方法(1)使用ios类中的有关格式控制的成员函数①格式控制状态标志输入输出的格式由各种状态标志来确定,这些标志在ios类中定义为枚举量,用一个十六位二进制数表示。第九章输入/输出流库26ios::skipws 跳过输入流中的空白字符ios::left 输出数据按左对齐,如[12]ios::right 输出数据按右对齐,如[12]ios::dec 按十进制数据输出ios::oct 按八进制数据输出ios::hex 按十六进制数据输出ios::showbase 在输出数据前面显示基数(八进制是0,十六进制是0x)ios::showpoint 浮点数输出带小数点ios::uppercase 用大写字母输出十六进制数(即ABCDEF,默认是小写)ios::showpos 在正数前加“+”ios::scientific 用科学计数法输出浮点数,如[2.122E2]ios::fixed 用定点数形式输出浮点数,如[212.2]ios::unitbuf 完成后立即刷新缓冲区第九章输入/输出流库27②设置标志用ios类的成员函数setf()设置,格式为:cin.setf(ios::标志位|……); //“|”表示同时设置若干个标志或cout.setf(ios::标志位|……);③清除标志用ios类的成员函数unsetf()设置,格式为:cin.unsetf(ios::标志位|……); //“|”表示同时清除若干个标志或cout.unsetf(ios::标志位|……);④取状态标志用ios类的成员函数flags(),格式为:cin.flags();cout.flags(); //返回流的标志位或cin.flags(ios::标志位);cout.flags(ios::标志位);//重新设 //置并返回流的标志位第九章输入/输出流库28⑤设置域宽用ios类的成员函数width()设置,格式为:cout.width(n); //设置输出域宽n位并返回原来域宽cout.width(); //返回当前域宽⑥填充字符用ios类的成员函数fill()设置,与width()配合,格式为:cout.fill(字符); //设置填充字符并返回原来填充字符cout.fill(); //返回当前填充字符⑦设置精度用ios类的成员函数precision()设置,格式为:cout.precision(n); //设置显示精度为n位并返回原来精度cout.precision(); //返回当前显示精度第九章输入/输出流库29例:用ios成员函数及格式化标志设置输出数据的格式#include<iostream.h>voidmain(){ charc[]="thisisstring"; doubled=-1234.8976; cout.width(30); //设置域宽30个字符 cout.fill(‘*’); //填充字符“*” cout.setf(ios::right); //输出右对齐(默认) cout<<c<<“----L1”<<endl; //输出c,左边填充“*” cout.width(30); //每个输出语句需要设置宽度 cout.setf(ios::left); //左对齐 cout<<c<<“----L2”<<endl; //输出c,右边填充“*“第九章输入/输出流库30 cout.setf(ios::dec|ios::showbase|ios::showpoint); cout.width(30); //十进制,显示基数,浮点数输出带小数点 cout<<d<<“----L3”<<“\n”; //默认6位精度 cout.setf(ios::showpoint); //浮点数输出带小数点 cout.precision(10); //精度10位,不含小数点与符号位 cout.width(30); //每个输出语句需要设置宽度 cout<<d<<"----L4"<<"\n"; cout.width(30); cout.setf(ios::oct); //显示基数,八进制 cout<<100<<"----L5"<<"\n";}第九章输入/输出流库31运行结果:****************thisisstring----L1thisisstring****************----L2-1234.90**********************----L3-1234.897600******************----L40144**************************----L5第九章输入/输出流库32(2)使用操纵符及操纵符函数控制格式改变格式比较简单的方法是使用特殊的、类似于函数的运算符,称为操纵符,也叫操纵算子。它以一个流引用为参数,并返回同一流的引用,并可以嵌入到输入或输出链中,即不要前缀流对象,直接调用操纵符。使用操纵符及操纵符函数需要在源程序中包含头文件“iomanip.h”①操纵符第九章输入/输出流库33Showbase(noshowbase) 显示(不显示)数值的基数前缀Showpoint(noshowpoint) 显示小数点(存在小数部分时才显示小数点)showpos(noshowpos) 在非负数中显示(不显示)”+”skipws(noskips) 输入数据时,跳过(不跳过)空白字符uppercase(nouppercase) 十六进制显示为0X(0x),科学计数法显示E(e)dec/oct/hex 十进制/八进制/十六进制left/right 设置数据输出对齐方式为:左/右对齐fixed 以小数形式显示浮点数scientific 用科学计数法显示浮点数flush 刷新输出缓冲区ends 插入空白字符,然后刷新ostream缓冲区endl 插入换行字符,然后刷新ostream缓冲区ws 跳过开始的空白第九章输入/输出流库34②操纵符函数setfill(ch) 设置以ch中的字符为填充字符setprecision(n) 设置精度为n位有效数字setw(w) 设置数据的输出宽度为w个字符setbase(b) 基数设置为b(b=8,10,16)进制第九章输入/输出流库35例:实数的精度控制#include<iostream.h>#include<iomanip.h>#include<math.h>voidmain(){doublex=sqrt(2.0);for(intindex=0;index<9;index++){cout.precision(index); //使用ios的成员函数设置精度 cout<<x<<endl;}cout<<endl;for(index=0;index<9;index++) cout<<setprecision(index)<<x<<endl;//使用操纵符设置精度}第九章输入/输出流库36运行结果:111.41.411.4141.41421.414211.4142141.4142136第九章输入/输出流库37例:输出宽度的控制#include<iostream.h>#include<iomanip.h>voidmain(){intx=12345;

//缺省格式为右对齐cout<<"Defaultisonright:"<<endl <<setw(10)<<x<<endl<<endl;

//修改为左对齐cout.setf(ios::left);cout<<setw(10)<<x<<endl<<endl;

//取消左对齐又变为右对齐cout.unsetf(ios::left);cout<<setw(10)<<x<<endl;}运行结果:Defaultisonright:123451234512345第九章输入/输出流库38例:格式输出中空白的填充#include<iostream.h>#include<iomanip.h>voidmain(){intx=12345;

//缺省为右对齐cout<<"Defaultisonright:"<<endl <<setw(10)<<x<<endl<<endl;

//右对齐,左边填充“*”cout.fill('*');cout<<setw(10)<<x<<endl<<endl;

//左对齐,右边填充“%”cout.setf(ios::left);cout<<setw(10)<<setfill('%')<<x<<endl;}运行结果:Defaultisonright:12345*****1234512345%%%%%第九章输入/输出流库39例:科学计算等格式输出#include<iostream.h>voidmain(){doublex=0.001234567,y=1.946e9;cout<<"Displayedindefaultformat:"<<endl <<x<<'\t'<<y<<endl<<endl; //缺省格式输出(定点)cout.setf(ios::scientific); //科学表示格式输出cout<<"Displayedinscientificformat:"<<endl <<x<<'\t'<<y<<endl;cout.setf(ios::fixed); //定点格式输出cout<<"Displayedinfixedformat:"<<endl <<x<<'\t'<<y<<endl;}第九章输入/输出流库40运行结果:Displayedindefaultformat:0.001234571.946e+009Displayedinscientificformat:1.234567e-0031.946000e+009Displayedinfixedformat:0.001234571.946e+009第九章输入/输出流库419.5文件的输入/输出1.概述(1)文件的概念文件是存储在存储介质上(如磁盘、磁带、光盘)的数据集合。(2)文件的类型①文本文件文本文件在磁盘上存放相关字符的ASCII码,所以又称为ASCII文件。②二进制文件二进制文件在磁盘上存储相关数据的二进制代码,它是把内存中的数据,按其在内存中的存储形式原样写到磁盘上而形成的文件。第九章输入/输出流库42(3)流与文件C++将文件看成是一个个字符在磁盘上的有序集合,用流来实现文件的读写操作。输入:数据流从文件流入内存。输出:数据流从内存流入文件。从操作系统的观点,所有与主机相连的设备都视为文件,如键盘、显示器、打印机等。(4)与文件相关的流C++有3种文件流:输入文件流ifstream、输出文件流ofstream、输入/输出文件流fstream。这些文件流都定义在fstream.h文件中。第九章输入/输出流库432.文件操作的一般步骤(1)在源程序中包含头文件fstream.h;(2)为要进行操作的文件建立一个流,即定义流对象;如:ifstreamin; //定义输入流对象in ofstreamout; //定义输出流对象out fstreamio; //定义输入输出流对象io(3)使用open()函数建立(打开)文件。不存在则建立、存在则打开;(4)进行文件的读写操作;(5)使用close()函数关闭文件。3.文件的打开与关闭第九章输入/输出流库44(1)打开文件①open()函数的原型 voidopen(char*filename,intmod,intaccess);②*filename:指向文件名字符串的指针③mod:文件的打开方式第九章输入/输出流库45第九章输入/输出流库文件打开方式说明ios::in以输入方式打开文件,即读文件(ifstream类对象默认方式)ios::out以输出方式打开文件,即写文件(ofstream类对象默认方式)ios::app以添加方式打开文件,新增加的内容添加在文件尾ios::ate以添加方式打开文件,新增加的内容添加在文件尾,但下次添加时则添加在当前位置ios::trunc如文件存在就打开并清除其内容,如不存在就建立新文件ios::binary以二进制方式打开文件(默认为文本文件)ios::nocreate打开已有文件,若文件不存在,则打开失败ios::noreplace若打开的文件已经存在,则打开失败46④access:文件的访问方式,缺省值为“0” 0:一般文件;1:只读文件;2:隐藏文件;3:系统文件⑤打开格式 流对象.open(filename,mod,access);⑥讨论第一、ofstreamout; //定义流类对象out out.open(“test”,ios::out,0); //打开或:out.open(“test”); //缺省为输出第九章输入/输出流库47第九章输入/输出流库第二、在实际中,常用下面的方式来打开: ofstreamout(“test”); //创建流对象的同时打开文件第三、为确定一个文件是否能够打开,可以使用下面的方法: ifstreammystream(“myfile”);//文件打开失败,mystream=0 if(!mystream) cout<<“Cannotopenthefile!\n”; //显示错误信息(2)关闭文件 流对象.close() 如:mystream.close();48第九章输入/输出流库例9.14一个简单的输入输出例子//Saveasmain.cpp#include<fstream.h>voidmain(){ ofstreamostrm; //定义输出流对象 ostrm.open(“f1.dat”); //创建文件 ostrm<<120<<endl; //写文件 ostrm<<310.85<<endl; //写文件 ostrm.close(); //关闭文件 ifstreamistrm(“f1.dat”); //定义输入流对象并打开文件49第九章输入/输出流库 intn; doubled; istrm>>n>>d; //读文件 cout<<n<<","<<d<<endl; istrm.close(); //关闭文件}运行结果:50例9.15把一个整数、一个浮点数和一个字符串写入磁盘文件test中。//Saveasmain.cpp#include<fstream.h> //包含输入输出文件流的头文件voidmain(){ofstreammyout(“test”); //定义流对象myout并创建文件testif(!myout) cout<<"cannotopenfile:test";myout<<10<<""<<123.45<<""<<"object\n";//向文件写数据myout.close(); //关闭文件}第九章输入/输出流库51例9.16将例9.15产生的文件test中的数据读出并显示。//Saveasmain.cpp#include<fstream.h>voidmain(){inta;floatb;char*str=newchar[80];ifstreammyin(“test”);if(!myin) cout<<"cannotopenfile:test";myin>>a>>b>>str; //从文件读数据到变量a、b、strcout<<a<<“”<<b<<“”<<str; //显示数据cout<<endl;myin.close();} //关闭文件第九章输入/输出流库52例9.17将文件file_from的内容拷贝到文件file_to中#include<fstream.h>voidmain(){charch;ifstreammyin("file_from");if(!myin)cout<<"cannotopenfile:file_from";ofstreammyout("file_to");if(!myout)cout<<"cannotopenfile:file_to";while(myin.get(ch)) //逐个读出字符到ch,直到结束标志‘\0’ myout.put(ch); //将ch中的字符写入到文件,最后自动写入结束标志myin.close();myout.close();}第九章输入/输出流库534.二进制文件前面介绍的文件都是文本文件,文本文件是字符流;二进制文件是字节流。(1)二进制文件与文本文件的区别在读文件时,它们判定文件结束标志的方法存在区别。在读文本文件的过程中,当get

之类的成员函数遇到文件结束符时,它返回常量EOF作为文件结束标志。二进制文件不能用EOF作为文件结束的判定值,因为EOF的值是-1,而-1在二进制文件中是一个有效的数据。因此,C++提供成员函数eof来解决这个问题,用法如下: intxx::eof()其中,xx代表输入流对象,到达文件末尾时,返回一个非0值,否则返回0。第九章输入/输出流库54(2)二进制文件操作方法用get和put按字节方式读写文件数据。read和write

按数据块的方式读写文件数据。例:用二进制方式建立一个磁盘文件,将ASCII编码为0~90之间的字符写入到文件d:\dk\a.dat中,然后用二进制文件方式读出并在屏幕上显示a.dat的内容#include<iostream.h>#include<fstream.h>voidmain(){ charch; ofstreamout("d:\\dk\\a.dat",ios::out|ios::binary); //dk已存在第九章输入/输出流库55 for(inti=0;i<90;i++){ if(!(i%30)) out.put('\n'); out.put(char(i)); out.put(''); } out.close(); ifstreamin("d:\\dk\\a.dat",ios::in|ios::binary); while(in.get(ch)) cout<<ch; cout<<endl; in.close();}第九章输入/输出流库565.随机存取文件(1)顺序访问与随机访问顺序访问:是指按照从前到后的顺序依次对文件进行读写操作,有些存储设备只支持顺序访问,如磁带。随机访问:也称为直接访问,可以按任意次序对文件进行读写操作。(2)顺序文件与随机文件顺序文件:用于顺序访问的文件。随机文件:用于随机访问的文件。(3)随机文件的问题①多次读同一文件,每次从头读起,如何完成?②如何指向文件的结尾?第九章输入/输出流库57③如何知道文件已结束?解决方式:对于随机文件,C++流类提供了一个操作它的文件读写指针,该指针可在文件中移动,将它指向要读写的字节位置,然后从该位置读取或写入指定字节数的数据块,这样就实现了文件数据的随机访问。(4)移动文件指针①seekg(pos)和seekp(pos)pos为long型。这两个函数都是从文件头开始,把文件指针向后移动pos个字符(字节),seekg用于输入文件;seekp用于输出文件。②seekg(pos,origin)和seekp(pos,origin)第九章输入/输出流库58pos为long型。从文件中指定位置开始移动文件指针,参数origin表示文件指针位置,pos表示相对于这个位置的位移量。origin有3种取值:ios::beg:表示从文件头开始,pos为正。ios::cur:表示从当前位置开始,pos可正(后移)可负(前移)。ios::end:表示从文件尾部开始,pos为负。③tellg()和tellp()这两个函数返回文件指针的当前位置,tellg()用于输入文件,tellp()用于输出文件。第九章输入/输出流库59(5)read()istream类成员函数read的原型为:istream&read(char*pDst,intsize);第一个参数pDst定位读取数据的存放位置,可以匹配任意类型的起始地址,但调用时应强制转换为char*。第二个参数size指出等待读取的字节数,可以设置为:size=n*sizeof(type)如果type取值为类类型名如CType,则当size=n*sizeof(CType),表示读取n个对象。n等于1时读取一个对象。type也可以是double,此时表示读取的数据是double型的变量。第九章输入/输出流库60(6)write()ostream类成员函数write的原型为:ostream&write(constchar*pSrc,intsize);第一个形参pSrc定位所写数据源的位置,可匹配任意类型的起始地址,但调用时应强制转换为char*。第二个参数size指出等待存写的字节数,可以设置为:size=n*sizeof(type)如果type取值为double,则当size=n*sizeof(double)表示读取n个double变量。n等于1时存写一个double变

温馨提示

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

评论

0/150

提交评论