资源描述
合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院1第十章第十章 C+的输入输出的输入输出 流流 文件文件 文件流的使用:文件的输入和输出文件流的使用:文件的输入和输出合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院210.1 C+语言的输入语言的输入/输出输出10.1.1 外部外部设备与文件与文件外部外部设备:n存存储设备:存:存储信息,信息,块设备(字符(字符块)介介质:硬:硬盘、软盘、磁、磁带、光、光盘、组织:文件:文件n输入入/输出出设备:输入入/输出信息,字符出信息,字符设备 输入:入:键盘、鼠、鼠标、扫描描仪、输出:出:显示器、打印机、示器、打印机、绘图仪、合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院310.1 C+语言的输入语言的输入/输出输出10.1.1 外部外部设备与文件与文件文件(文件(file):):n作作为输入入/输出的出的对象象n与外部与外部设备之之间建立关建立关联,作,作为输入入/输出出设备的抽象描述的抽象描述 文件:必文件:必须有一个由用有一个由用户命名的唯一名字,可用于存命名的唯一名字,可用于存储程程序和数据,序和数据,还可用于提高程序的可用于提高程序的设备无关性(独立于无关性(独立于设备的的类型、台号)。型、台号)。输入入输出系出系统:特殊的文件,由操作系:特殊的文件,由操作系统预先先规定,如:定,如:CON:控制台:控制台终端端 PRN:打印机:打印机合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院410.1 C+语言的输入语言的输入/输出输出10.1.2 程序中程序中对文件的操作文件的操作程序程序 外部外部设备 文件系文件系统:操作系:操作系统(operating system)operating system)提供的一系列系提供的一系列系统调用(用(system callsystem call)接口。)接口。文件文件缓冲区:由操作系冲区:由操作系统设置置 程序程序设计语言的言的输入入输出机制:建立在系出机制:建立在系统调用基用基础上的上的抽象抽象层次更高的机制(函数次更高的机制(函数库、类库)文件系统文件系统合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院510.1 C+语言的输入语言的输入/输出输出10.1.2 程序中程序中对文件的操作文件的操作C+C+语言提供了言提供了流流用于用于读写文件写文件。接收接收输出数据的地方称出数据的地方称为目目标,发出出输入数据的地方称入数据的地方称为源源。输入入输出操作可以看作是字符序列在源、目出操作可以看作是字符序列在源、目标与与对象之象之间的流的流动,因而将完成,因而将完成输入入输出操作的出操作的类称称为流流类。源流源流目目标流流 输入入缓冲区冲区(读)输出出缓冲区冲区(写写)流的提取运算符流的提取运算符 流的插入运算符流的插入运算符”和和”提取符提取符 在在类istream中定中定义。输出:向流中插入一个字符序列,出:向流中插入一个字符序列,“”插入符插入符 在在类ostream中定中定义。流与物理流与物理设备的关的关联:键盘、显示器、示器、四个四个预定定义的流的流对象:象:cin:标准准输入,缺省入,缺省为键盘cout:标准准输出,缺省出,缺省为显示器示器cerr:无无缓冲的冲的标准准错误输出,缺省出,缺省为显示器示器clog:有有缓冲的冲的标准准错误输出,缺省出,缺省为显示器示器合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院1010.2 C+的流类库的流类库10.2.3 支持文件的流支持文件的流类头文件:文件:fstream.hiosistreamostreamiostreamstreambuffilebuffstreambaseifstreamofstreamfstream合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院1110.2 C+的流类库的流类库10.2.4 支持字符串的流支持字符串的流类头文件:文件:strstrea.h 字符串流:在流与字符串之字符串流:在流与字符串之间建立建立连接接iosistreamostreamiostreamstreambufstrstreambufstrstreambaseistrstreamostrstreamstrstream合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院1210.3 格式化输入输出格式化输入输出10.3.1 使用使用ios成成员函数函数格式化格式化标志字(志字(formatting flag):long x_flag;在在iostream.h中的中的ios类定定义中,中,说明了如下的枚明了如下的枚举:enum /formatting flags skipws =0 x0001,/skip whitespace on input left =0 x0002,/left-adjust output right =0 x0004,/right-adjust output internal =0 x0008,/padding after sign or base indicator dec =0 x0010,/decimal conversion oct =0 x0020,/octal conversion hex =0 x0040,/hexadecimal conversion showbase =0 x0080,/use base indicator on output showpoint =0 x0100,/force decimal point(floating output)uppercase =0 x0200,/upper-case hex output showpos =0 x0400,/add+to positive integers scientific =0 x0800,/use 1.2345E2 floating notation fixed =0 x1000,/use 123.45 floating notation unitbuf =0 x2000,/flush all streams after insertion stdio =0 x4000,/flush stdout,stderr after insertion boolalpha =0 x8000 /insert/extract bools as text or numeric ;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院1310.3 格式化输入输出格式化输入输出10.3.1 使用使用ios成成员函数函数0/10/10/10/10/10/10/10/10/10/10/10/10/10/10/1skipwsleftrightdechexshowpointshowposfixedstdiointernaloctshowbaseuppercasescientificunitbuf合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院1410.3 格式化输入输出格式化输入输出10.3.1 使用使用ios成员函数成员函数常量名常量名意义意义输入输入/输出输出skipws 若设置,跳过输入中的空白;否则,则不舍去这些空白若设置,跳过输入中的空白;否则,则不舍去这些空白 i left输出数据按输出域左边对齐输出输出数据按输出域左边对齐输出oright输出数据按输出域右边对齐输出输出数据按输出域右边对齐输出 ointernal输出数据在输出域中符号或基指示符左对齐,数字右对齐输出数据在输出域中符号或基指示符左对齐,数字右对齐 odec以十进制形式显示数据以十进制形式显示数据 i/ooct以八进制形式显示数据以八进制形式显示数据 i/ohex以十六进制形式显示数据以十六进制形式显示数据 i/oshowbase输出带有一个表示制式的输出带有一个表示制式的“基指示符基指示符”,如对十六进制,将加,如对十六进制,将加上上0 x oshowpoint浮点输出时必须带有一个小数点浮点输出时必须带有一个小数点 ouppercase以大写形式显示数据中的字母以大写形式显示数据中的字母 oshowpos在显示的正数前加上一个在显示的正数前加上一个+oscientific以科学记数法显示浮点数以科学记数法显示浮点数 ofixed以十进制小数方式显示浮点数以十进制小数方式显示浮点数 ounitbuf在插入操作后立即刷新流的缓冲区在插入操作后立即刷新流的缓冲区 ostdio在插入操作后刷新在插入操作后刷新stdout和和stderr o合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院1510.3 格式化输入输出格式化输入输出10.3.1 使用使用ios成员函数成员函数long flags()设置标志值,并返回以前所设置的标志值设置标志值,并返回以前所设置的标志值flags()仅返回当前的标志值仅返回当前的标志值long setf(long,long)用于设置标志字的某一位,第二个参数指定所要操作的位,用于设置标志字的某一位,第二个参数指定所要操作的位,第一个参数指定为该位所设置的值。第一个参数指定为该位所设置的值。long setf(long)设置参数所指定的那些标志位设置参数所指定的那些标志位long unsetf(long)清除参数指定的标志位清除参数指定的标志位int width(int)指定域宽,并返回以前设置的域宽指定域宽,并返回以前设置的域宽int width()仅返回当前域宽仅返回当前域宽char fill(char)设置填充字符,缺省为空格。函数返回以前设置的填充字设置填充字符,缺省为空格。函数返回以前设置的填充字符符char fill()仅返回当前的填充字符仅返回当前的填充字符int precision(int)设置小数点后的数据位数,返回以前设置的位数设置小数点后的数据位数,返回以前设置的位数int precision()仅返回当前的小数点数据位数仅返回当前的小数点数据位数合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院1610.3 格式化输入输出格式化输入输出10.3.1 使用使用ios成成员函数函数例:例:/程序:程序:IOS_FMT.cpp/功能:演示利用功能:演示利用ios成成员函数函数进行格式化行格式化输出出#include /以二以二进制形式制形式输出当前格式控制出当前格式控制标识字字flagvoid show_flag(long flag)long mask;/用于屏蔽其他位,取出当前位的循用于屏蔽其他位,取出当前位的循环变量量cout=0 x0001;mask=mask1)if(flag&mask)cout1;else cout0;cout)n;return;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院1710.3 格式化输入输出格式化输入输出10.3.1 使用使用ios成成员函数函数int main()long f;f=cout.flags();/按缺省方式按缺省方式输出出show_flag(cout.flags();/取当前格式取当前格式标识字并以二字并以二进制制输出出cout123n;cout123.456n;/按科学按科学记数法数法输出,并在正数前另加上出,并在正数前另加上“+”符号符号cout.setf(ios:showpos|ios:scientific);show_flag(cout.flags();cout123n;cout123.456n;cout.unsetf(ios:showpos|ios:scientific);/取消取消刚才才设置的状置的状态合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院1810.3 格式化输入输出格式化输入输出10.3.1 使用使用ios成成员函数函数 /强制浮点数按照定点格式制浮点数按照定点格式显示示cout.setf(ios:fixed);show_flag(cout.flags();cout0.001234567n;cout.unsetf(ios:fixed);/按大写的十六按大写的十六进制制输出,并在数据前加上十六出,并在数据前加上十六进制的基制的基“0X cout.setf(ios:hex|ios:showbase|ios:uppercase);show_flag(cout.flags();cout123n;cout123.456n;cout.unsetf(ios:hex|ios:showbase|ios:uppercase);/设置置输出数据出数据宽度度show_flag(cout.flags();cout;cout.width(15);cout123n;cout123.456n;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院1910.3 格式化输入输出格式化输入输出10.3.1 使用使用ios成成员函数函数 /设设置左置左对齐对齐,并且,并且宽宽度不足度不足则则以符号以符号“#”填充填充cout.fill(#);cout.setf(ios:left);show_flag(cout.flags();cout;cout.width(15);cout123n;cout123.456n;cout.unsetf(ios:left);/设设置符号位左置符号位左对齐对齐,数,数值值右右对齐对齐,宽宽度不足以空格填充度不足以空格填充cout.fill();cout.setf(f);cout.setf(ios:internal);show_flag(cout.flags();cout;cout.width(15);cout-123n;cout.unsetf(ios:internal);合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院2010.3 格式化输入输出格式化输入输出10.3.1 使用使用ios成成员函数函数 /设设置置输输出精度出精度为为小数点后两位数字小数点后两位数字cout.setf(ios:fixed);show_flag(cout.flags();cout123n;cout.precision(2);cout123.456n;return 0;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院2110.3 格式化输入输出格式化输入输出10.3.2 使用使用输入入输出操出操纵符符 操操纵符(符(manipulator):特殊的函数,可直接包含在):特殊的函数,可直接包含在输入入/输出表达式中。出表达式中。不不带形式参数的操形式参数的操纵符定符定义在在 iostream.h 中中 带形式参数的操形式参数的操纵符定符定义在在 iomanip.h 中中 合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院2210.3 格式化输入输出格式化输入输出10.3.2 使用输入输出操纵符使用输入输出操纵符 操纵符操纵符功能功能输入输入/输出输出dec格式为十进制数据格式为十进制数据i/ohex格式为十六进制数据格式为十六进制数据i/ooct格式为八进制数据格式为八进制数据i/osetbase(int n)设置数据的基为设置数据的基为n(n为为0、8、10、16),),0表示使用表示使用缺省值缺省值osetioflags(long)设置特定的标志位设置特定的标志位i/oresetiosflags(long)清除特定的标志位清除特定的标志位i/ows设置跳过输入中的前导空白字符设置跳过输入中的前导空白字符Isetw(int)设置域宽设置域宽osetprecision(int)设置浮点输出的有效数字个数设置浮点输出的有效数字个数osetfill(int)设置填充字符设置填充字符oendl插入一个换行符并刷新此流插入一个换行符并刷新此流oends插入一个空字符插入一个空字符oflush刷新流刷新流o合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院2310.3 格式化输入输出格式化输入输出10.3.2 使用使用输入入输出操出操纵符符#include#include int main()char input_string250;/按大写十六按大写十六进制制输出出coutsetiosflags(ios:uppercase)hex123decendl;/输出浮点数的精度出浮点数的精度为小数点后两位小数点后两位coutsetprecision(5)123.456endl;/输出的字符串的出的字符串的宽度度为15coutsetw(15)Helloendl;/以以“*”填充填充宽度度为15 的数据空白的数据空白处coutsetw(15)setfill(*)10000endl;/忽略忽略输入之前的空白入之前的空白coutwsinput_string;coutinput_stringendl;return 0;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院2410.3 格式化输入输出格式化输入输出10.3.3 格式化格式化输入入/输出到字符串出到字符串字符串作字符串作为输入流:入流:创建建 istrstream 对象象/程序:程序:IN_STR.CPP/功能:将字符串的内容作功能:将字符串的内容作为输入流入流#includeint main()char str=1234;istrstream buffer1(str);/将整个字符串作将整个字符串作为输入流入流istrstream buffer2(str,2);/将字符串前两个字符作将字符串前两个字符作为输入流入流int i,j;buffer1i;buffer2j;couti+jendl;return 0;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院2510.3 格式化输入输出格式化输入输出10.3.3 格式化格式化输入入/输出到字符串出到字符串字符串作字符串作为输出流:出流:创建建 ostrstream 对象象/程序:程序:out_STR.CPP/功能:将数据格式化功能:将数据格式化输出到字符串中出到字符串中#include#includeint main()ostrstream buffer;char*str;/将数据格式化将数据格式化输出到出到输出流出流buffer,注意字符串,注意字符串结束符束符0buffer Salary is setw(10)setfill($)725.5ends;/输出的出的结果用果用buffer.str()来来访问str=buffer.str();coutstrendl;return 0;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院2610.4 常用成员函数输入常用成员函数输入/输出输出10.4.1 put成成员函数函数ostream类和和istream类提供的成提供的成员函数函数输出:出:put、write输出:出:get、read、gcount、getline、peek、putback、ignore可可实现无格式的无格式的输入入/输出出cout.put(char)例:例:cout.put(A);cout.put(65);cout.put(A.put(n);cout.put(A).put(n);合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院2710.4 常用成员函数输入常用成员函数输入/输出输出10.4.2 write成成员函数函数cout.write(char*,int)例:例:char buffer=“HAPPY BIRTHDAY”cout.write(buffer,10);10.4.3 read和和gcount成成员函数函数cin.read(char*,int)将指定数量的字符将指定数量的字符输入到内存中的字符数入到内存中的字符数组int cin.gcount(void)返回最后一次返回最后一次输入操作入操作读取的字符数取的字符数合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院2810.4 常用成员函数输入常用成员函数输入/输出输出10.4.3 read和和gcount成成员函数函数/程序:程序:UN_FMT.CPP/功能:用功能:用write、read和和gcount成成员函数函数实现无格式无格式输入入输出出#includeint main()const int SIZE=80;char bufferSIZE=Enter a sentence:;coutbufferendl;cin.read(buffer,20);coutendl The sentence entered was:endl;cout.write(buffer,cin.gcount();coutendl;return 0;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院2910.4 常用成员函数输入常用成员函数输入/输出输出10.4.4 get成成员函数函数 istream.h中中get原型原型 int get();/从从输入流中入流中读入一个字符,返回入一个字符,返回该字符作字符作为函数函数调用用值,遇到文件遇到文件结束符,返回束符,返回EOF EOF:文件:文件结束符,束符,为符号常量,符号常量,值为-1 istream&get(char&);/从指定从指定输入流中入流中读入一个字符,入一个字符,赋给字符字符变量量ch,遇到文件,遇到文件结束符,返回束符,返回0 inline istream&get(unsigned char&);inline istream&get(signed char&);inline istream&get(char*,int,char=n);/从指定从指定输入流中入流中读int个字符,函数在个字符,函数在读到比到比int少一个字符或遇到字符少一个字符或遇到字符char为止(止(char缺省缺省为n),并),并补上字符串上字符串结束符束符0。inline istream&get(unsigned char*,int,char=n);inline istream&get(signed char*,int,char=n);合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院3010.4 常用成员函数输入常用成员函数输入/输出输出10.4.4 get成成员函数函数/程序:程序:GET.CPP/功能:演示功能:演示get函数的几种用法函数的几种用法#include int main()const int SIZE=80;char ch;int character;char buffer1SIZE,buffer2SIZE;/用不用不带带参数的参数的get函数函数输输入字符,以文件入字符,以文件结结束符束符终终止,并用止,并用put函数函数输输出出cout Enter a sentence follwed by end-of-file:endl;while(character=cin.get()!=EOF)cout.put(char)character);cout EOF in this sysytem is:characterendl;cout After input,cin.eof()is:cin.eof()endlendl;cin.clear();/清除清除输输入流不正常入流不正常标记标记 合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院3110.4 常用成员函数输入常用成员函数输入/输出输出10.4.4 get成成员函数函数 /使用使用get(ch)函数函数输输入,以文件入,以文件结结束符束符终终止,用止,用put(ch)输输出出cout Enter a sentence with get(ch)and output pur(ch):n;while(cin.get(ch)cout.put(ch);cin.clear();/用用cin读读取字符流,存入取字符流,存入buffer1,直到遇到空白字符,直到遇到空白字符为为止止cout nEnter a sentence:buffer1;coutn The string read with cin was:endlbuffer1endlendl;/用用带带3个参数的个参数的get函数从函数从输输入流中入流中读读取字符取字符cin.get(buffer2,SIZE);/此此处处未指明分隔符,使用默未指明分隔符,使用默认认的的n字符字符coutThe string read with cin.get was:endlbuffer2endl;return 0;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院3210.4 常用成员函数输入常用成员函数输入/输出输出10.4.4 get成成员函数函数 cin.eof()到达文件末尾(即到达文件末尾(即读到文件到文件结束符)返回非束符)返回非0值,否否则返回返回0;cin.clear()在在读入入输入流入流时,读到文件到文件结束符或束符或读入非正常字入非正常字符(例如在整数符(例如在整数输入入时遇到了非数字字符)遇到了非数字字符)时,输入流入流标记置置为非非0(表示不正常),(表示不正常),clear()函数用于清除函数用于清除输入流的入流的“不正常不正常”标记。cin 用用cin读取字符流取字符流时,当遇到第一个空白符,当遇到第一个空白符时,认为输入入结束,并束,并补上字符串上字符串结束符束符0。合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院3310.4 常用成员函数输入常用成员函数输入/输出输出10.4.5 getline成成员函数函数 inline istream&getline(char*,int,char=n);/从指定从指定输入流中入流中读int个字符,函数在个字符,函数在读到比到比int少一个字符少一个字符或遇到字符或遇到字符char为止(止(char缺省缺省为n),并),并补上字符串上字符串结束符束符0。与。与带3个参数个参数get成成员函数不同的是函数不同的是geline 要从要从输入入流中流中删除分隔符(即除分隔符(即读取并取并删除它),而并不是把它存放在除它),而并不是把它存放在buffer中。中。inline istream&getline(unsigned char*,int,char=n);inline istream&getline(signed char*,int,char=n);合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院3410.4 常用成员函数输入常用成员函数输入/输出输出10.4.5 getline成成员函数函数 /程序:程序:GETLINE.CPP/功能:演示功能:演示getline函数的用法函数的用法#include int main()const int SIZE=80;char bufferSIZE;cout Enter a sentence:buffer;coutn The string read with cin is:endlbufferendlendl;/用用getline函数函数读入入19个字符,或遇个字符,或遇/终止止cin.getline(buffer,20,/);cout The second part is:n;coutbufferendlendl;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院3510.4 常用成员函数输入常用成员函数输入/输出输出10.4.5 getline成成员函数函数 /用用getline函数函数读入入19个字符,或遇个字符,或遇n终止止cin.getline(buffer,20,n);cout The third part is:n;coutbufferendlendl;/用用get函数函数读入入19个字符,或遇个字符,或遇/终止止cin.get(buffer,20,/);cout The forth part is:n;coutbufferendlendl;cout.put(char)cin.get();/此此时/还在在输入流中,用入流中,用get()读出并用出并用put输出出coutendl;return 0;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院3610.4 常用成员函数输入常用成员函数输入/输出输出10.4.6 peek、putback、ignore成成员函数函数 cin.peek()返回返回输入流下一个字符,但并不将其从入流下一个字符,但并不将其从输入流中入流中删除。除。调用:用:ch=cin.peek();/ch是整型是整型变量量 cin.putpack(ch)将字符将字符变量量ch中字符放回中字符放回输入流中。入流中。cin.ignore(n,ch)跳跳过输入流中入流中n个字符,或遇到个字符,或遇到ch中指定的中指定的终止字符止字符时结束。束。n 缺省缺省为1,ch 缺省缺省为EOF。合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院3710.5 设计自己的输入设计自己的输入/输出操作输出操作10.5.1 重重载流的插入运算符流的插入运算符 class COMPLEX private:public:friend ostream&operator (ostream&stream,COMPLEX&c);ostream&operator (ostream&stream,COMPLEX&c)stream(c.Real0)?+:)c.Imag(istream&stream,COMPLEX&c);istream&operator (istream&stream,COMPLEX&c)coutc.Real;coutc.Imag;return stream;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院3910.5 设计自己的输入设计自己的输入/输出操作输出操作10.5.3 实例例#include#include math.h#include conio.hclass COMPLEX private:double Real;double Imag;public:COMPLEX();COMPLEX(const COMPLEX&c);COMPLEX(double r,double i=0);void operator=(COMPLEX&d);friend double abs(COMPLEX&c);合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院4010.5 设计自己的输入设计自己的输入/输出操作输出操作10.5.3 实例例 friend COMPLEX conj(COMPLEX&c);friend COMPLEX operator+(COMPLEX c1,COMPLEX c2);friend COMPLEX operator-(COMPLEX c1,COMPLEX c2);friend COMPLEX operator*(COMPLEX c1,COMPLEX c2);friend COMPLEX operator/(COMPLEX c1,COMPLEX c2);friend int operator=(COMPLEX&c1,COMPLEX&c2);friend int operator!=(COMPLEX&c1,COMPLEX&c2);friend ostream&operator (istream&stream,COMPLEX&c);合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院4110.5 设计自己的输入设计自己的输入/输出操作输出操作10.5.3 实例例 COMPLEX:COMPLEX()Real=0.0;Imag=0.0;COMPLEX:COMPLEX(const COMPLEX&c)Real=c.Real;Imag=c.Imag;COMPLEX:COMPLEX(double r,double i)Real=r;Imag=i;void COMPLEX:operator=(COMPLEX&d)Real=d.Real;Imag=d.Imag;double abs(COMPLEX&c)return sqrt(c.Real*c.Real+c.Imag*c.Imag);合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院4210.5 设计自己的输入设计自己的输入/输出操作输出操作10.5.3 实例例 COMPLEX conj(COMPLEX&c)COMPLEX temp;temp.Real=c.Real;temp.Imag=-c.Imag;return temp;COMPLEX operator+(COMPLEX c1,COMPLEX c2)COMPLEX temp;temp.Real=c1.Real+c2.Real;temp.Imag=c1.Imag+c2.Imag;return temp;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院4310.5 设计自己的输入设计自己的输入/输出操作输出操作10.5.3 实例例 COMPLEX operator-(COMPLEX c1,COMPLEX c2)COMPLEX temp;temp.Real=c1.Real-c2.Real;temp.Imag=c1.Imag-c2.Imag;return temp;COMPLEX operator*(COMPLEX c1,COMPLEX c2)COMPLEX temp;temp.Real=c1.Real*c2.Real-c1.Imag*c2.Imag;temp.Imag=c1.Real*c2.Imag+c1.Imag*c2.Real;return temp;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院4410.5 设计自己的输入设计自己的输入/输出操作输出操作10.5.3 实例例 int operator=(COMPLEX&c1,COMPLEX&c2)return(c1.Real=c2.Real)&(c1.Imag=c2.Imag);int operator!=(COMPLEX&c1,COMPLEX&c2)return(c1.Real!=c2.Real)|(c1.Imag!=c2.Imag);COMPLEX operator/(COMPLEX c1,COMPLEX c2)COMPLEX temp;double den;den=abs(c2)*abs(c2);temp.Real=(c1.Real*c2.Real+c1.Imag*c2.Imag)/den;temp.Imag=(c1.Imag*c2.Real-c1.Real*c2.Imag)/den;return temp;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院4510.5 设计自己的输入设计自己的输入/输出操作输出操作10.5.3 实例例 ostream&operator (ostream&stream,COMPLEX&c)stream(c.Real0)?+:)c.Imag(istream&stream,COMPLEX&c)coutc.Real;coutc.Imag;return stream;合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院4610.5.3 实例例void main()COMPLEX a,b,c;double x=10.0;cout Input the first complex a:a;cout Input the second complex b:b;c=conj(a);couta c bendl;c=a+b;coutc ;c=a-b;coutc ;c=a*b;coutc ;c=a/b;coutcendl;c=a+x;coutc ;c=a-x;coutc ;c=a*x;coutc ;c=a/x;coutcendl;c=x+a;coutc ;c=x-a;coutc ;c=x*a;coutc ;c=x/a;coutcendl;cout(a=c)endl;cout(a!=c)endl;getch();10.5 设计自己的输入设计自己的输入/输出操作输出操作合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院4710.5.4 设计自己的自己的输入入/输出操出操纵符符输出操出操纵符定符定义形式:形式:ostream&操操纵符名字符名字(ostream&stream)自定自定义操操纵符代符代码 return stream;两种情况需两种情况需设计操操纵符函数符函数:n 为新新设备定定义操操纵符使得向新符使得向新设备输出更方便;出更方便;n 需要重复使用的操作序列需要重复使用的操作序列组合定合定义在新操在新操纵符中。符中。操操纵符用于符用于输出操作且不出操作且不带参数参数时,即便空,即便空圆括号括号对也不能出也不能出现。10.5 设计自己的输入设计自己的输入/输出操作输出操作合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院4810.5.4 设计自己的自己的输入入/输出操出操纵符符#include#include ostream&dollar_format(ostream&stream)/定制自己的定制自己的输出操出操纵符符1stream.setf(ios:left);streamsetw(12)setprecision(2)setfill($);return stream;ostream&tab(ostream&stream)/定制自己的定制自己的输出操出操纵符符2return streamt;int main()cout725.5endl;coutdollar_format725.5endl;coutatabbtabcendl;return 0;10.5 设计自己的输入设计自己的输入/输出操作输出操作合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院4910.5.4 设计自己的自己的输入入/输出操出操纵符符输入操入操纵符定符定义形式:形式:istream&操操纵符名字符名字(istream&stream)自定自定义操操纵符代符代码 return stream;#include istream&prompt(istream&stream)/定制自己的定制自己的输入操入操纵符符couthex;return stream;int main()int input;cinpromptinput;coutinputendl;return 0;10.5 设计自己的输入设计自己的输入/输出操作输出操作合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院50流状流状态标志字志字enum io_state goodbit=0 x00,/不不设置任何位,一切正常置任何位,一切正常 eofbit=0 x01,/输入流已入流已经结束,无字符可束,无字符可读入入 failbit=0 x02,/上次上次读写操作失写操作失败,但流仍可使用,但流仍可使用 badbit=0 x04,/试图作无效的作无效的读/写操作,流不再可用写操作,流不再可用 hardfail=0 x80 /不可恢复的不可恢复的严重重错误;ios类提供的提供的检测或或设置流状置流状态的成的成员函数:函数:int rdstate();/返回流的当前状返回流的当前状态标识字字 int eof();/返回非返回非0值表示到达文件尾表示到达文件尾 int fail();/返回非返回非0值表示操作失表示操作失败 int bad();/返回非返回非0值表示出表示出现错误 int good();/返回非返回非0值表示流操作正常表示流操作正常 int clear(int flag=0);/将流的状将流的状态设置置为flag10.6 检测流操作的错误检测流操作的错误合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院5110.7 文件流文件流读写写文件的文件的过程:程:o往(文件)流往(文件)流中中插入一个字符;插入一个字符;o从(文件)流中提取一个字符;从(文件)流中提取一个字符;o打开文件并打开文件并获得文件句柄(建立文件与流得文件句柄(建立文件与流连接)接)打开一个文件流打开一个文件流,以便用来,以便用来读和写。使用完后,需和写。使用完后,需要要关关闭该文件流文件流。o#include ftream.h合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院5210.7.1 文件的打开与关文件的打开与关闭C+的三种文件流的三种文件流n输入文件流:入文件流:类 ifstreamn输出文件流:出文件流:类 ofstreamn输入入/输出文件流:出文件流:类 fstream 例:例:创建文件流建文件流对象象#include void main()/建立不同的文件流建立不同的文件流 ifstream in;/input file stream只能只能读ofstream out;/output file stream只能写只能写fstream both;/I/O file stream10.7 文件流文件流合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院5310.7.1 文件的打开与关文件的打开与关闭1.使用函数使用函数 open()打开文件打开文件open()的函数原型:的函数原型:void open(const char*filename,int mode,int prot=filebuf:openprot);nfilename:文件名字,可含路径:文件名字,可含路径nmode:文件的打开模式:文件的打开模式nprot:文件的:文件的访问方式:方式:普通(普通(0)、只)、只读(1)、)、隐藏藏(2)、系)、系统文件(文件(4)。)。一般使用缺省一般使用缺省值0。10.7 文件流文件流合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院5410.7.1 文件的打开与关文件的打开与关闭文件打开模式文件打开模式mode ios类中定中定义了一了一组枚枚举常量描述常量描述这些模式:些模式:enum open_mode in =0 x01,/打开文件打开文件进行行读操作操作 out =0 x02,/打开文件打开文件进行写操作行写操作 ate =0 x04,/打开打开时文件指文件指针定位到文件尾(定位到文件尾(at end)app =0 x08,/添加模式:所有增加都在文件尾部添加模式:所有增加都在文件尾部(append)trunc =0 x10,/如果文件已存在如果文件已存在则清空原文件清空原文件 nocreate =0 x20 /如果文件不存在如果文件不存在则打开失打开失败 noreplace=0 x40,/如果文件存在如果文件存在则打开失打开失败 binary =0 x80 /二二进制文件制文件 ;10.7 文件流文件流合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院5510.7.1 文件的打开与关文件的打开与关闭oifstream类中,中,open()的的mode参数缺省参数缺省值是是ios:inoofstream类中,中,open()的的mode参数缺省参数缺省值是是ios:outo缺省方式下,文件以文本方式打开缺省方式下,文件以文本方式打开omode参数用位或运算参数用位或运算|组合枚合枚举常量常量ofstreamofile;ofile.open(“test.bak”,ios:out|ios:binary);/以二以二进制形式打开当前目制形式打开当前目录下的下的test.bak文件,准文件,准备进行行写操作写操作 10.7 文件流文件流合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院5610.7.1 文件的打开与关文件的打开与关闭ofstreamofile;/创建一个建一个输出文件流出文件流ofile.open(“text.txt”);/打开文本文件打开文本文件text.txt,使,使ofile流与流与该文文件相关件相关联/写文件写文件text.txtofile.close();/关关闭text.txt文件文件ofile.open(“other.txt”);/使使ofile流与另一文件流与另一文件other.txt相关相关联:重用流重用流/写文件写文件other.txtofile.close();/关关闭other.txt文件文件10.7 文件流文件流合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院5710.7.1 文件的打开与关文件的打开与关闭2.通通过流流类的构造函数打开文件的构造函数打开文件在在创建流建流时调用构造函数直接与某文件相关用构造函数直接与某文件相关联ofstream ofile(“text.txt”);/创建一个建一个输出文件流出文件流ofile,打开文件,打开文件text.txt,使,使ofile流与流与该文文件相关件相关联/写文件写文件text.txtofile.close();/关关闭text.txt文件文件流流类的构造函数的参数和缺省的构造函数的参数和缺省值与与openopen函数相同,用于在函数相同,用于在创建建一个流一个流时就使它与某个文件相关就使它与某个文件相关联10.7 文件流文件流合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院5810.7.1 文件的打开与关文件的打开与关闭 打开文件失打开文件失败,流状,流状态标识字中的字中的faibit、badbit或或hardbit将被置将被置为1,并且在,并且在ios类中重中重载的的“!”运算符返回非运算符返回非0值。异常模式异常模式处理方式:理方式:ifstream input_file(“D:VCmydata.txt”)if(!Input_file)警告打开文件失警告打开文件失败;退出程序退出程序;继续正常的文件操作正常的文件操作;10.7 文件流文件流合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院5910.7.2 文本文件的操作文本文件的操作例例1:把一个整数、一个浮点数和一个字符串写到名:把一个整数、一个浮点数和一个字符串写到名为out.txt的文的文本文件中本文件中#include int main()ofstream outfile;float f=123.23;int n=10;outfile.open(out.txt);if(!outfile)coutCannot open out.txt for output!n;return 1;/返回返回1表示打开文件不成功表示打开文件不成功outfile n f n;outfileThis is a text file;outfile.close();return 0;10.7 文件流文件流程序执行后,在当前目录下生程序执行后,在当前目录下生成文件成文件out.Txt,文件内容如下:文件内容如下:10 123.230003 This is a text file合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院6010.7.2 文本文件的操作文本文件的操作例例2:从例从例1程序建立的文件中程序建立的文件中读入相关数据入相关数据#include#include int main()ifstream infile;infile.open(out.txt);if(!infile)cout n f ch str;cout n f ch n;cout str 运算符号跳过空白符号(如空运算符号跳过空白符号(如空格,回车),然后读入对应于输入对象类型的格,回车),然后读入对应于输入对象类型的字符字符合肥工业大学合肥工业大学 计算机与信息学院计算机与信息学院6110.7.2 文本文件的操作文本文件的操作例例3:文件拷:文件拷贝#include#include int CopyFile(char*file_from,char*file_to)/file_from:输入文件名入文件名(源文件源文件);file_to:输出文件名出文件名(目目标文件文件)char ch;/文件不存在文件不存在则打开失打开失败ifstream from(file_from,ios:in|ios:nocreate);/以文本方式打开以文
展开阅读全文