版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十三章第十三章:C+流和文件流流和文件流nC+语言中没有专门的输入/输出(I/O)语句,C+中的I/O操作是通过一组标准I/O函数和I/O流来实现的。nC+的标准I/O函数是从C语言继承而来的,同时对C语言的标准I/O函数进行了扩充。nC+的I/O流是通过iostream库提供的,它是一个利用多继承和虚拟继承实现的面向对象类层次结构,是做为C+标准库的一个组件而提供的。n它为内置数据类型的输入输出提供了支持,同时也支持文件的输入输出。除此外,类的设计者还可以通过扩展iostream库来读写新的类类型。13.1 什么是流数据从一个对象到另一个对象的传送被抽象为数据从一个对象到另一个对象的传送被
2、抽象为“流流”。数。数据的输入据的输入/输出就是通过输入输出就是通过输入/输出流来实现的。流是一种输出流来实现的。流是一种抽象的概念,负责在数据的产生者和数据的使用者之间建抽象的概念,负责在数据的产生者和数据的使用者之间建立联系,并管理数据的流动。立联系,并管理数据的流动。 流:流:C+中数据之间的传输操作。中数据之间的传输操作。输出流:输出流:在在C+中,流可以表示数据中,流可以表示数据从内存传送到某个载从内存传送到某个载体或设备中。体或设备中。输入流:输入流:流可以表示数据流可以表示数据从某个载体或设备传送到内存缓从某个载体或设备传送到内存缓冲区变量中冲区变量中。流的机制:流的机制:1.流
3、都是相同的,但载体可以不同。流都是相同的,但载体可以不同。2.无论与流相联系的实际物理设备差别有多大,流都采用无论与流相联系的实际物理设备差别有多大,流都采用相同的方式运行。相同的方式运行。13.1.1 预定义流输入和输出操作是由输入和输出操作是由istream(输入流)和(输入流)和ostream(输出(输出流)类提供的(第三个类流)类提供的(第三个类iostream类同时从类同时从istream和和ostream派生,允许双向输入输出)。为了方便,这个库定派生,允许双向输入输出)。为了方便,这个库定义了下列四个标准流对象。义了下列四个标准流对象。流流含义含义所属类所属类默认设备默认设备ci
4、ncoutcerrclog标准输入标准输入标准输出标准输出没有被缓冲的标准错误输出没有被缓冲的标准错误输出被缓冲了的标准错误输出被缓冲了的标准错误输出istream类类ostream类类ostream类类ostream类类键盘键盘显示器显示器显示器显示器显示器显示器对应的头文件对应的头文件 iostream.h输入操作主要由重载的右移操作符(输入操作主要由重载的右移操作符()来完成,是从流中提取一个字符序列,因此,来完成,是从流中提取一个字符序列,因此,将将称为称为提取运算符提取运算符。输出操作主要由重载的左移操作符(输出操作主要由重载的左移操作符()来完成,是向流中插个字符序列,因此将来完成
5、,是向流中插个字符序列,因此将称为称为插入运算符插入运算符。输入输出输入输出1. cout-插入运算符插入运算符cout:标准输出设备连接的预定义输出流,称为汇。1.向输出流发送字符。实际上,位于插入运算符右侧的字符串被存储在左侧的流中。 2.“”接受任何内置数据类型的实参,包括const char *以及标准库中定义的某些类类型。3.输出操作符可被连接在一起。cout name “ ” number n;等价于 cout name;cout ;cout nember; cout ”处流进程序。为了保留输入数据,输入语句要求有目的地址。n“”可以接受任何内置的数据类型,包括C风格的字符串以及标
6、准库中的某些类类型。int i;cin i;n提取运算符从cin参数中提取一个整型输入数据,并存入一个对象(变量) i。跳过空格n根据默认定义,内部类型的提取运算符跳过(丢弃)任何中间空白(空格,制表符、换行、回车)。(1)当变量类型为整数时n跳过空格读取字符,遇到不为整数的字符为止。123x2,n则i的值为123,前面的两个空格被跳过,123被读入作为i的值,且输入指针指在x处。(2)当)当变量类型为浮点数变量类型为浮点数时时n同整数提取运算符同整数提取运算符n跳过空格,然后读字符,直到发现非浮点数。跳过空格,然后读字符,直到发现非浮点数。(3)当)当变量类型为字符变量类型为字符时时跳过空格
7、,读取输入流中的下一个字符跳过空格,读取输入流中的下一个字符x则字符型提取运算符忽略空格而返回则字符型提取运算符忽略空格而返回x。(4)读取字符串,n它跳过前导空格,然后读取所有输入字符,直到遇到另一个空格。n例1: char str20; cin str;n例2:键盘键入ABCD EFG, 则只有“ABCD”被读取到str中,而“EFG”将继 续留在输入流缓冲区中,直到下次提取。与插入运算符一样,也可以把多个取运算符连在与插入运算符一样,也可以把多个取运算符连在条条语句中,读取多个数据项。例如:语句中,读取多个数据项。例如:char name20; int age; cin name age
8、;在此例中,如果给在此例中,如果给name键入的字符超过键入的字符超过20个,则输个,则输入文本将溢出变量入文本将溢出变量name的内存区域而覆盖变量的内存区域而覆盖变量age,甚至还可能覆盖程序的部分指令。这样就会破坏程甚至还可能覆盖程序的部分指令。这样就会破坏程序。所以需要由一种方法将数组变量或指针的长度序。所以需要由一种方法将数组变量或指针的长度准确告诉流,可通过格式化准确告诉流,可通过格式化I/O来做。来做。字符串输入n将每个字符串读入一个数组缓冲区中,然后从空闲存储区中将每个字符串读入一个数组缓冲区中,然后从空闲存储区中分配分配“正好可以存放这个字符串正好可以存放这个字符串”的内存,
9、并把缓冲区拷贝的内存,并把缓冲区拷贝到这个按需分配的内存区中。到这个按需分配的内存区中。#include #include void main()char inBuf1024;cininBuf;char *str=new charstrlen(inBuf)+1;strcpy(str,inBuf);.delete str;n使用格式化使用格式化I/O#include #include void main()const int bufSize=24;char bufbufSize;cinsetw(bufSize)buf;.n这里这里bufSize是字符数组是字符数组buf的长度,的长度,setw(
10、)把长度()把长度等于或大于等于或大于bufSize的字符串分成最大长度为的字符串分成最大长度为bufSize1的两个或多个字符串。在每个新串的末尾放一个空的两个或多个字符串。在每个新串的末尾放一个空字符。字符。cerr 和和clogcerr和和clog用于标准错误输出用于标准错误输出ncerr类似标准错误文件。cerr与cout的差别在于:ncerr是不能重定向的;ncerr不能被缓冲,它的输出总是直接传送到标准输出设备nclog类似cerr,也是不能重定向的,但可被缓冲。比cerr显示速度快cerr “Error” “n”; 或或 clog Error s1 s2 i; cout s1 e
11、ndl; cout s2 endl; cout i endl; ostrstream os; oss1s2i; cout os.str(); strstream ss;/I/O字符串流类字符串流类 ss Hello World s1 s2 i; cout s1 endl; cout s2 endl; cout i endl;文件流类文件流类niostream库还支持对文件的读写。下列三种类类型提供了文件支持。nifstream(从istream派生,把一个文件绑到程序上用来输入)nofstream(从ostream派生,把一个文件绑到程序上用来输出)nfstream(从iostream派生,把
12、一个文件绑到程序上用来输入输出)n头文件fstream.h13.3 重载I/O运算符() C+ I/O系统的另一个优点是可系统的另一个优点是可以重载以重载I/O运算符。通过重载运算符。通过重载IO运算运算符,可以建立适合于类需要的输入和输符,可以建立适合于类需要的输入和输出界面。出界面。 IO运算符重载的实质就是把用运算符重载的实质就是把用于变量输入输出的运算符转化为对于类于变量输入输出的运算符转化为对于类对象的输入输出操作。对象的输入输出操作。13.3.1 重载输出运算符重载输出运算符friend ostream& operator (ostream& stream, &am
13、p; )/函数体函数体return stream; 1.第一个参数:ostream类对象的一个引用,即stream必须是一个输出流。2.第二个参数:接收待输出的对象。3.函数返回值:ostream的一个引用stream。例例13.3#includeclass Sampleint x, y;public:Sample(int x1, int y1)x = x1; y = y1;friend ostream& operator(ostream& stream, Sample& s)stream x= s.x ,y= s.y endl;return stream;void m
14、ain()Sample A(1,2);Sample B(3,4);cout A n“”运算符称为提取运算符,对它进行重载的函数称为提取符函数。这个运算符函数接收流的输入信息。friend istream& operator (istream& stream, & )/函数体函数体return stream;n第一个参数是istream类对象的一个引用,即stream必须是一个输入流。n第二个参数接收输入对象的引用。n该函数返回istream的一个引用stream。例例13.4#include class Sample int x, y;public:Sample()fr
15、iend istream& operator (istream & stream, Sample& s);friend ostream& operator(istream& stream, Sample& s)cout 输入输入x和和y的值的值 endl;cout s.x;cout s.y;return stream;ostream& operator(ostream& stream, Sample& s)stream 输出输出x和和y的值的值 endl;stream x= s.x;stream ,y= s.y A; co
16、ut item_number;if(!cin) /if(cin.fail()cerr“error:invalid item_number type entered!n”;结果:结果:jijerror:invalid item_number type entered!运算符经过了重载,它与运算符经过了重载,它与fail函数执行相同的功能。函数执行相同的功能。bool operator!() const return fail(); 因此表达式因此表达式if(!cin)if(cin.fail()。void*()运算符也是经过重载的,与!运算符相反。运算符也是经过重载的,与!运算符相反。因此表达式因
17、此表达式if(cout)if(!cout.fail()13.5 文文 件件 流流n文件流类在流与文件之间建立连接。#include n文件流可以分为3类:n输入流ifstream n输出流ofstreamn输入/输出流fstream类ifstream ifile; /说明一个输入流ofstream ofile; /说明一个输出流fstream iofile; /说明一个输入/输出流13.5.1 文件的打开与关闭文件的打开与关闭n文件打开:在流与文件之间建立一个连接。(1)使用默认构造函数建立对象,然后调用open成员函数打开文件。ifstream myFile;myFile.open(“fil
18、ename”,iosmode);(2)在调用构造函数建立文件流对象时,指定文件名与mode,在构造过程中打开文件ifstream myFile(“filename”,iosmode); 构造函数原型ifstream:ifstream(char* filename,int mode=ios:in,int file_attrb=filebuf:openprot)ofstream:ifstream(char* filename,int mode=ios:out,int file_attrb=filebuf:openprot)ifstream:ifstream(char* filename,int m
19、ode=ios:in,int file_attrb=filebuf:openprot)Open原型Ifstram:open(char* filename,int mode=ios:in,int file_attrb=filebuf:openprot)open()的函数原型的函数原型void open(const char* filename, /文件名,可包含路径说明 int mode, /文件打开的模式 int file_attrb=filebuf:openprot);/决定文件的访问方式 mode取值:取值:ios:in 打开文件进行读操作打开文件进行读操作ios:out 打开文件进行写操
20、作打开文件进行写操作ios:ate 打开时文件指针定位到文件尾打开时文件指针定位到文件尾ios:app 添加模式,都在文件尾增加添加模式,都在文件尾增加ios:trunc 如果文件已存在则清空原文件如果文件已存在则清空原文件ios:nocreate 如果文件不存在则打开失败如果文件不存在则打开失败ios:noreplace 如果文件存在则打开失败如果文件存在则打开失败ios:binary 二进制文件二进制文件(非文本文件非文本文件)mode缺省为文本文件缺省为文本文件ifstream流,默认为流,默认为ios:inofstream流,默认为流,默认为ios:outmode的符号常量可以用的符号
21、常量可以用 | 组合在一起组合在一起file_attrib取值取值:0 0 普通文件普通文件1 1 只读文件只读文件2 2 隐含文件隐含文件4 4 系统文件系统文件一般情况下一般情况下该访问方式使用默认值。该访问方式使用默认值。例例1:建立一个文件,如果该文件已存在,则删除旧版本。:建立一个文件,如果该文件已存在,则删除旧版本。 ofstream ofile; ofile.open(“c:vcabc.txt”,ios:out)例例2:添加记录到一个现存文件,如果文件不存在便建立一个新文件:添加记录到一个现存文件,如果文件不存在便建立一个新文件ofstream ofile; ofile.open
22、(“c:vcabc.txt”,ios:app)。例例3:以二进制文件形式打开:以二进制文件形式打开C:vc目录下的目录下的abctxt文件,准备进行读文件,准备进行读文件操作文件操作。 ifstream ifile; ifile.open(“c:vcabc.txt”,ios:binary|ios:in);其中,文件名中其中,文件名中“”的第一个的第一个“”为转义字符,缺省为按文本形式打开。为转义字符,缺省为按文本形式打开。例例4:以可读可写方式打开:以可读可写方式打开C:vc目录下的目录下的abctxt文件文件ifstream ifile;ifile.open(“c:vcabc.txt”,io
23、s:in|ios:out);openopen函数的使用函数的使用异常处理模式出错处理出错处理n打开文件操作并不能保证总是正确的打开文件操作并不能保证总是正确的n文件不存在、磁盘损坏等可能造成打开文件失败。n如果打开文件失败后,程序还继续执行文件的读写如果打开文件失败后,程序还继续执行文件的读写操作,将会产生严重错误操作,将会产生严重错误使用异常处理以提高程序的可靠性。使用异常处理以提高程序的可靠性。ifstream ifile(路径和文件名路径和文件名)if(!ifile) /if(ifile.fail()/警告打开文件失败并退出程序警告打开文件失败并退出程序 如果使用构造函数或open()打
24、开文件失败,流状态标志字中的failbit、badbit或hardbit将被置为1,并且在ios类中重载的运算符“!”将返回非0值。我们可以利用这一点检测文件打开操作是否成功,如果不成功则作特殊处理关闭文件关闭文件close()n打开的文件使用完毕后,必须使用close()函数将其关闭。nclose()函数也是流类中的成员函数n它无参数与返回值n将缓冲区的内容刷新并撤消流与文件之间的连接。n当流对象的生存期结束后,相应的析构函数也会将文件关闭。13.5.2 文件的读写文件的读写n打开文件就建立IO流与文件的连接,之后就可以进行文件的读写操作了。1.文件读写方法文件读写方法n使用继承来的流运算符
25、直接读写。使用继承来的流运算符直接读写。n使用流成员函数。使用流成员函数。 (1)使用流运算符直接读写使用流运算符直接读写n文件读写基本的数据类型文件读写基本的数据类型直接使用流直接使用流 “”,完成文件的字符转换工作。,完成文件的字符转换工作。cout A; /输出一个字符输出一个字符,此前设计的宽度和填充方式在此起作此前设计的宽度和填充方式在此起作用,而提取运算符在默认情况下拒绝接受空白字符。用,而提取运算符在默认情况下拒绝接受空白字符。n文件读写自定义类文件读写自定义类重载类的重载类的运算符运算符n注意:注意:n实际上,插入实际上,插入以及标准流以及标准流cin,cout等都是等都是按照
26、文本方式组织的按照文本方式组织的n使用使用 写操作时,为了以后能正确的读出,数据间要人写操作时,为了以后能正确的读出,数据间要人为的添加分隔符(如空格,换行)为的添加分隔符(如空格,换行)例13.5 直接使用插入运算符直接使用插入运算符“” ”读写基本数据类型对文本文件的读写,读写基本数据类型对文本文件的读写,#include#includeint main()ofstream ofile(test); if(!ofile) couttest文件不能打开文件不能打开endl; return 0;ofile This book is C+“ 12345 endl;ofile.close(); i
27、fstream ifile(test); if(!ifile) cout“test文件不能打开文件不能打开 str; ifile.close(); cout str 默认时拒绝接受空白字符默认时拒绝接受空白字符writeostream &write(const char* pch, int nCount)把内存把内存pch中前中前nCount个字节的那块内容写到一个输出文件个字节的那块内容写到一个输出文件流中。参数:流中。参数:n一个一个char指针:指针:(指向内存数据的起始地址指向内存数据的起始地址)。在该结构对象的。在该结构对象的地址之前需要地址之前需要char做强制类型转换。做
28、强制类型转换。n长度长度nCount:指出写的字节数:指出写的字节数readistream &read(char *pch,int nCount)从一个文件读从一个文件读nCount个字节到一个存个字节到一个存pch缓冲区中,若遇到缓冲区中,若遇到文件结束或在文本模式文件中遇到文件结束标志字符时读结束。文件结束或在文本模式文件中遇到文件结束标志字符时读结束。getlineistream &getline(char *pch,int nCount,char delim=n)整行读取。从某个文件或流中读出一行,至多整行读取。从某个文件或流中读出一行,至多ncount个字符,个字符,
29、放入放入pch缓冲区中,缺省值是换行字符缓冲区中,缺省值是换行字符n,读完,从读取的读完,从读取的内容中删除该终止字符。内容中删除该终止字符。#include#includeint main()ifstream ifile(abc.txt);if (!ifile)cout abc.txt文件不能打开文件不能打开endl;return 0;ofstream ofile(xyz.txt);if(!ofile)cout xyz.txt文件不能打开文件不能打开 endl;return 0;char ch;while(ifile.get(ch)ofile.put(ch);ifile.close();of
30、ile.close();return 1;使用输入流成员函数使用输入流成员函数get()从文本文从文本文件件abc.txt中读取一个字符中读取一个字符ch,然后,然后使用输出流成员函数使用输出流成员函数put()将字符将字符ch写入文本文件写入文本文件xyz.txt中,继续这一中,继续这一过程直到过程直到get()读完为止。读完为止。 例例131366编写一个程序将文本文件编写一个程序将文本文件abcabc.txt,.txt,复复制到文本文件制到文本文件xyz.txt.xyz.txt.1.文本文件的读写n文本文件只适用于那些解释为文本文件只适用于那些解释为ASCII码的文件。码的文件。n处理文
31、本文件时将处理文本文件时将自动自动作一些字符转换。作一些字符转换。n输出换行字符输出换行字符0 x0A时将转换为回车时将转换为回车0 x0D与换行与换行0 x0A两个两个字符存入文本文件,字符存入文本文件,n读入时将回车与换行两个字符合并为一个换行字符,读入时将回车与换行两个字符合并为一个换行字符,这样内存中的字符与写入文件中的字符之间就不再是一一这样内存中的字符与写入文件中的字符之间就不再是一一对应关系。对应关系。n文本文件结束以文本文件结束以ASCII码的控制字符码的控制字符0 x1A表示表示n文本文件读写:文本文件读写:n用系统预定义或用户重载的用系统预定义或用户重载的n用用put、ge
32、t2二进制文件的读写二进制文件不同于文本文件,它可用于任何类二进制文件不同于文本文件,它可用于任何类型的文件型的文件(包括文本文件包括文本文件),读写二进制文件,读写二进制文件的字符不作任何转换,读写的字符与文件之间的字符不作任何转换,读写的字符与文件之间是完全一致的。是完全一致的。一般地,对二进制文件的读写可采用一般地,对二进制文件的读写可采用两种方法两种方法:(1)使用使用get()和和put();(2)使用使用read()和和write();建立一个输出文件流并将建立一个输出文件流并将Date结构的二进制值写入文件:结构的二进制值写入文件:#includestruct Dateint m
33、o;int da;int yr;void main()Date dt = 2, 20, 2001 ;ofstream ofile(data.dat,ios:binary);ofile.write(char*)&dt, sizeof(dt);例例1374.文件的随机读写n每一个文件都有每一个文件都有两个指针两个指针:n读指针读指针:说明输入操作当前在文件中的位置。说明输入操作当前在文件中的位置。n写指针写指针:说明下次写操作的当前位置。说明下次写操作的当前位置。n每次执行输入或输出,相应的读写指针将自动后移每次执行输入或输出,相应的读写指针将自动后移nC+文件流不仅按这种顺序方式进行读写
34、,而且还文件流不仅按这种顺序方式进行读写,而且还可以随机地移动文件的读写指针。可以随机地移动文件的读写指针。nseekpntellpnseekgntellg文件流的随机访问函数输出流seekp 将输出文件流的“写指针”值置到一个新位置,使以后输出从新位置开始ostream& ostream:seekp();ostream& ostream:seekp(long offset, int dir=ios:beg)offset为为, dir为为 ); (1) ios:cur=1相对于当前写指针指定的位置。相对于当前写指针指定的位置。(2) ios:beg=0相对于流的开始位置相对于流
35、的开始位置(3) ios:end=2相对于流的结尾相对于流的结尾tellp返回文件流“写指针”的当前值(从文件首到当前位置的字节数)streampos ostream:tellp();streampos被定义为被定义为long,以字节数为单位。以字节数为单位。输入流seekg 将输入文件流的“读指针”值置到一个新位置,使以后输入从新位置开始istream& istream:seekg();istream& istream:seekg(long offset, int dir=ios:beg)tellg返回 “读指针”当前值streampos istream:tellg();例例
36、13.8使用seekg可以实现面向记录的数据管理系统: 用固定长度的记录大小乘以记录号便得到相对于文件末尾的字节位置,然后使用get读这个记录。 这个值是streampos类型,该typedef结构定义在iostreamh中。例13.8 在文件City.dat中输入几个城市的名称和区号,并根据用户输入的区号查找对应的城市。n设计一个City类,用于数据处理。n以读写方式打开文件City.dat,写入几个城市数据,n然后将读指针移到文件头,依次查找用户输入的区号,找到后显示。#include#include#includeclass Citychar cname10;char tno4;publ
37、ic:City() City(char m , char n )strcpy(cname, m);strcpy(tno, n);void disp()cout 城市城市: cname 区号区号: tno endl;int find(char n )if(strcmp(tno, n) = 0)return 1;elsereturn 0;void main()fstream f;f.open(City.dat, ios:out|ios:in|ios:binary);City s;City s1(北京北京, 010);City s2(天津天津, 021);City s3(天津天津, 022);Cit
38、y s4(重庆重庆, 023);City s5(“武汉武汉”, “027”);f.write(char*)&s1,sizeof(City);/将将5个对象写入到文件个对象写入到文件City.dat中中f.write(char*)&s2,sizeof(City);f.write(char*)&s3,sizeof(City);f.write(char*)&s4,sizeof(City);f.write(char*)&s5,sizeof(City);f.seekg(0,ios:beg); /读指针移到文件头读指针移到文件头cout n;for(int i=0;
39、i5;i+)f.read(char*)&s,sizeof(s);/H.文件文件City.dat中读对象数据中读对象数据if(s.find(n)s.disp();break; if(i=5)cout 输出的区号未找到输出的区号未找到! endl;f.close();结果如下结果如下:输入区号:输入区号:027城市城市:武汉武汉 区号区号:02713.2 格式化I/O(略)每个每个iostream库对象都维护一个格式状态,库对象都维护一个格式状态,它控制格式化操作的细节。比如:浮点数它控制格式化操作的细节。比如:浮点数的精度,整型值的进制基数等。的精度,整型值的进制基数等。C流类库可用流类
40、库可用两种方法两种方法控制输入、输出控制输入、输出的格式:的格式:(1)使用使用ios类的成员函数类的成员函数(2)使用使用I/O操纵符。操纵符。在在iostream.h头文件中定义了以下枚举类型头文件中定义了以下枚举类型:enumskipws=0 x0001, /跳过输入中的空白跳过输入中的空白left=0 x0002, /输出左对齐输出左对齐right=0 x0004, /输出右对齐输出右对齐internal=0 x0008,/在符号或基位与数值之间补齐空位在符号或基位与数值之间补齐空位dec=0 x0010,/按十进制按十进制oct=0 x0020,/按八进制按八进制hex=0 x004
41、0,/按十六进制按十六进制showbase=0 x0080,/输出数制的基输出数制的基showpoint=0 x0100,/强制浮点数输出小数点强制浮点数输出小数点upercase=0 x0200,/十六进制采用大写输出十六进制采用大写输出showpos=0 x0400,/在正数前加上在正数前加上“”scientific=0 x0800,/浮点数使用科学记数法浮点数使用科学记数法fixed=0 x1000,/浮点数使用普通记数法浮点数使用普通记数法unitbuf=0 x2000,/每次插入后刷新所有流每次插入后刷新所有流stdio=0 x4000/每次插入后刷新标准输出和标准错误输出流每次插入
42、后刷新标准输出和标准错误输出流;n每一个每一个C+流都有自己当前的数据格式控流都有自己当前的数据格式控制状态,这些状态用一个长整数表示制状态,这些状态用一个长整数表示,即即ios类的数据成员类的数据成员x_flags,称为,称为格格式化标志字式化标志字。 x_flags的每一位表示格式的每一位表示格式控制的一个状态标志控制的一个状态标志,每一个枚举定义的符号,每一个枚举定义的符号常量用于设置或取消流的数据格式标志字的一常量用于设置或取消流的数据格式标志字的一个状态。个状态。例:例:xflag为为0 x0003/0000000000000011表示:跳过输入中的空白,并且输出左对齐。表示:跳过输
43、入中的空白,并且输出左对齐。13.2.1 使用ios成员函数由于由于x_flags是是ios类的保护成员,所以无法直接对类的保护成员,所以无法直接对这个标志字进行操作,而必须使用这个标志字进行操作,而必须使用ios类提供的公有成类提供的公有成员函数来操作这些标志字的值,下面说明这些函数。员函数来操作这些标志字的值,下面说明这些函数。(1)setf():成员函数成员函数setf()用于设置状态标志。用于设置状态标志。cout.setf(ios:showbase);/输出数制的基输出数制的基cin.setf(ios:skipws);/跳过输入中的空白跳过输入中的空白cout.setf(ios:sc
44、ientific|ios:showpoint);/使用科学计数法,并显示小数点使用科学计数法,并显示小数点(2)unsetf():成员函数:成员函数unsetf()用来取消格式标志。用来取消格式标志。unsetf()的用法与的用法与setf()相似。相似。(3)flags():成员函数:成员函数flags()用于获取当前格式标志的状用于获取当前格式标志的状态,即返回保护成员态,即返回保护成员x_flags的当前值。的当前值。(4) precision()该函数的说明如下:该函数的说明如下:int precision(int num);n用于设置或返回用于设置或返回(不带参数时不带参数时)浮点数
45、的输出精度。浮点数的输出精度。n也就是通过这个公共成员函数设置也就是通过这个公共成员函数设置ios类的保护数类的保护数据成员据成员x_precision的值,该成员的默认值为的值,该成员的默认值为6 。nprecision()函数的设置值一直有效,直到下一函数的设置值一直有效,直到下一个个precision()函数改变该值为止。函数改变该值为止。(5) width()该函数的说明如下:该函数的说明如下:int width(int len);n用于设置或返回用于设置或返回(不带参数时不带参数时)输出数据字段宽度。输出数据字段宽度。n也就是通过这个公共成员函数设置也就是通过这个公共成员函数设置io
46、s类的保护数类的保护数据成员据成员x_width的值。的值。nwidth()函数的设置值函数的设置值只对下一个输出有效只对下一个输出有效。(6) fill()该函数的说明如下:该函数的说明如下:char fill(char ch);n用于设置或返回用于设置或返回(不带参数时不带参数时)输出的填充字符。输出的填充字符。n也就是通过这个公共成员函数设置也就是通过这个公共成员函数设置ios类的保类的保护数据成员护数据成员x_fill的值,该成员的的值,该成员的默认值为空默认值为空格格。nfill()函数的设置值一直有效,直到下一个函数的设置值一直有效,直到下一个fill()函数改变该值为止。函数改变
47、该值为止。 例13.1 给出以下程序的执行结果:#includevoid main()int n = 123;double d = 1234.5678;cout.fill(*);cout.precision(10);cout.width(10);cout n endl;cout d endl;cout.precision(6);cout.width(6);cout n endl;cout d endl;*1231234.5678*1231234.5713.2.2 使用I/O操纵符(略)除除ios类成员函数之外,类成员函数之外,C+的流类库还的流类库还提供了另一种更方便的提供了另一种更方便的I/
48、O格式化方法,这种格式化方法,这种方法使用一种称为方法使用一种称为操纵符操纵符的特殊函数,的特殊函数,操纵符操纵符的特点是可以直接包含在的特点是可以直接包含在IO表达式中表达式中。所有所有不带形参的操纵符不带形参的操纵符都定义在头文件都定义在头文件iostream.h中,而中,而带形参的操纵符带形参的操纵符则定义在则定义在头文件头文件iomanip.h中,因而使用相应的操纵中,因而使用相应的操纵符就必须包含相应的头文件。符就必须包含相应的头文件。表表133列出了这些列出了这些I/O操纵符。操纵符。表13.3 I/O操纵符 操纵符操纵符 功能功能 用于用于 dec 格式化为十进制数值格式化为十进
49、制数值 I/O hex 格式化为十六进制数值格式化为十六进制数值 I/O oct 格式化为八进制数值格式化为八进制数值 I/Ows 设置跳过输入中的前导空白字符设置跳过输入中的前导空白字符 Iendl 输出一个换行符并刷新流输出一个换行符并刷新流 O ends 输出一个空字符输出一个空字符0以结束字符串以结束字符串 O flush 强制刷新流强制刷新流 。setbase(int base) 设置设置base为数值的基为数值的基 Osetw(int width) 设置输出数据字段宽度为设置输出数据字段宽度为width O setprecision(int num) 设置浮点数精度位数设置浮点数精度位数 O setfill(int ch) 设置设置ch为填充字符为填充字符 Osetiosflags(long flag) 设置设置flag中指定的标志位中指定的标志位 I/O resetiosflag(lo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖北省随州市2026届高三下学期二模考试物理+答案
- 广东省珠海市香洲区2026年中考模拟考试数学试卷附答案
- 物业公司绩效考核及薪酬方案
- 2026年新能源汽车电池包轻量化粉末涂料(粒径2040μ)涂装规范
- 2026年低轨卫星星座在极地通信领域的应用方案
- 2026年混改项目审计评估操作规范:中介机构选聘与资产评估核准备案流程
- 2026年小流域综合治理与乡村振兴衔接(人居环境整治)方案
- 2026年海外仓尾程配送成本控制与物流商KPI考核办法
- 护理查房:循环系统疾病护理观察
- 2026年浙船E行 浙里航场景:航运物流数据赋能增效实践案例
- DG-TJ 08-2335-2020 郊野公园设计标准
- 乡镇卫生健康知识培训班课件
- 马克思宗教观课件
- 2025年及未来5年中国中车轨交行业发展潜力预测及投资战略、数据研究报告
- GB/T 17616-2025钢铁及合金牌号统一数字代号体系
- 2025年军考化学试卷真题及答案
- 2024-2025学年度安徽广播影视职业技术学院单招《职业适应性测试》考试历年机考真题集及完整答案详解【历年真题】
- 鲁交安A、B、C证题库
- 【《基于遗传算法的多车型运输路径优化实证研究》15000字(论文)】
- 《超高性能混凝土加固既有混凝土结构技术规程》
- 仲裁员考试题库及答案
评论
0/150
提交评论