《C程序设计电子教案第10章流类库与输入输出课件》由会员分享,可在线阅读,更多相关《C程序设计电子教案第10章流类库与输入输出课件(59页珍藏版)》请在金锄头文库上搜索。
1、第第10章章 流类库与输入输出流类库与输入输出n10.1 I/O标准流类标准流类n10.2 格式化格式化I/On10.3 文件流文件流n10.4 字符串流字符串流C程序设计电子教案第10章流类库与输入输出10.1 I/O标准流类标准流类n10.1.1 预定义流预定义流n10.1.2 C+中的流类库中的流类库返回首页C程序设计电子教案第10章流类库与输入输出n在在C+语语言言中中,数数据据的的输输入入和和输输出出(简简写写为为I/O)包包括括对对标标准准输输入入设设备备键键盘盘和和标标准准输输出出设设备备显显示示器器、对对在在外外存存磁磁盘盘上上的的文文件件和和对对内内存存中中指指定定的的字字符
2、符串串存存储储空空间间进进行行输输入入输输出出这这三三个个方方面面。对对标标准准输输入入设设备备和和标标准准输输出出设设备备的的输输入入输输出出简简称称为为标标准准I/O,对对在在外外存存磁磁盘盘上上文文件件的的输输入入输输出出简简称称为为文文件件I/O,对对内内存存中中指指定定的的字字符符串串存存储储空空间的输入输出简称为串间的输入输出简称为串I/O。C程序设计电子教案第10章流类库与输入输出nC+中把数据之间的传输操作称作流。在中把数据之间的传输操作称作流。在C+中,流既可以表示数据从内存传送到某个载体中,流既可以表示数据从内存传送到某个载体或设备中,即输出流;也可以表示数据从某个或设备中
3、,即输出流;也可以表示数据从某个载体或设备传送到内存缓冲区变量中,即输入载体或设备传送到内存缓冲区变量中,即输入流。在进行流。在进行I/O操作时,首先打开操作,使流和操作时,首先打开操作,使流和文件发生联系,建立联系后的文件才允许数据文件发生联系,建立联系后的文件才允许数据流入或流出,输入或输出结束后,使用关闭操流入或流出,输入或输出结束后,使用关闭操作使文件与流断开联系。作使文件与流断开联系。 C程序设计电子教案第10章流类库与输入输出nC+中中所所有有流流都都是是相相同同的的,但但文文件件可可以以不不同同。使使用用流流以以后后,程程序序用用流流统统一一对对各各种种计计算算机机设设备备和和文
4、文件件进进行行操操作作,使使程程序序与与设设备备、程程序序与与文文件件无无关关,从从而而提提高高了了程程序序设设计计的的通通用用性性和和灵灵活活性性。也也就就是是说说,无无论论与与流流相相联联系系的的实实际际物物理理设设备备差差别别有有多多大大,流流都都采采用用相相同同的的方方式式运运行行。这这种种机机制制使使得得流流可可以以跨跨越越物物理理设设备备平平台台,实实现现流流的的透透明明运运作作,而而与与实实际际的的物物理理设设备备无无关关。例例如如,往往显显示示器器上上输输出出字字符符和和向向磁磁盘盘文文件件或或打打印印机机输输出出字字符符,尽尽管管接接受受输输出出的的物物理理设设备备不不同同,
5、但但具具体体操作过程是相同的。操作过程是相同的。C程序设计电子教案第10章流类库与输入输出10.1.1 预定义流预定义流n1cout在在ostream输输出出流流类类中中定定义义有有对对左左移移操操作作符符重重载载的的一一组组公用成员函数,函数的具体声明格式为:公用成员函数,函数的具体声明格式为:ostream& operator重重载载的的一一组组公用成员函数,函数的具体声明格式为:公用成员函数,函数的具体声明格式为:istream& operator(简单类型标识符简单类型标识符&);C程序设计电子教案第10章流类库与输入输出n3cerrcerr类似标准错误文件。类似标准错误文件。cerr
6、与与cout的差别在于:的差别在于:(1)cerr不能重定向。不能重定向。(2)cerr不不能能被被缓缓冲冲,它它的的输输出出总总是是直直接接传传达达到到标标准准输输出设备上。出设备上。4clogclog是是不不能能重重定定向向的的,但但是是可可以以被被缓缓冲冲。在在某某些些系系统统中中,由于缓冲,使用由于缓冲,使用clog代替代替cerr可以改进显示速度。可以改进显示速度。clog Error n;返回本节C程序设计电子教案第10章流类库与输入输出10.1.2 C+中的流类库中的流类库nC+语语言言系系统统为为实实现现数数据据的的输输入入和和输输出出定定义义了了一一个个庞庞大大的的类类库库,
7、它它 包包 括括 的的 类类 主主 要要 有有 ios, istream, ostream, iostream,ifstream, ofstream, fstream, istrstream, ostrstream和和strstream等。等。n其其中中ios为为根根基基类类,它它直直接接派派生生四四个个类类:输输入入流流类类istream、输输出出流流 类类 ostream、 文文 件件 流流 基基 类类 fstreambase和和 字字 符符 串串 流流 基基 类类strstreambase,输输入入文文件件流流类类ifstream同同时时继继承承了了输输入入流流类类和和文文件件流流基基类
8、类(当当然然对对于于根根基基类类是是间间接接继继承承),输输出出文文件件流流类类ofstream同同时时继继承承了了输输出出流流类类和和文文件件流流基基类类,输输入入字字符符串串流流类类istrstream同同时时继继承承了了输输入入流流类类和和字字符符串串流流基基类类,输输出出字字符符串串流流类类ostrstream同同时时继继承承了了输输出出流流类类和和字字符符串串流流基基类类,输输入入输输出出流流类类iostream同同时时继继承承了了输输入入流流类类和和输输出出流流类类,输输入入输输出出文文件件流流类类fstream同同时时继继承承了了输输入入输输出出流流类类和和文文件件流流基基类类,
9、输输入入输输出出字字符符串串流类流类strstream同时继承了输入输出流类和字符串流基类。同时继承了输入输出流类和字符串流基类。返回本节C程序设计电子教案第10章流类库与输入输出10.2 格式化格式化I/On10.2.1 ios类中的枚举常量类中的枚举常量n10.2.2 使用使用ios成员函数成员函数n10.2.3 使用使用I/O操作符操作符n10.2.4 检测流操作的错误检测流操作的错误返回首页C程序设计电子教案第10章流类库与输入输出10.2.1 ios类中的枚举常量类中的枚举常量n在根基类在根基类ios中定义有三个用户需要使用的枚举类型,由中定义有三个用户需要使用的枚举类型,由于它们是
10、在公用成员部分定义的,所以其中的每个枚举类于它们是在公用成员部分定义的,所以其中的每个枚举类型常量在加上型常量在加上ios:前缀后都可以为本类成员函数和所有外前缀后都可以为本类成员函数和所有外部函数访问。部函数访问。n在三个枚举类型中有一个无名枚举类型,其中定义的每个在三个枚举类型中有一个无名枚举类型,其中定义的每个枚举常量都是用于设置控制输入输出格式的标志使用的。枚举常量都是用于设置控制输入输出格式的标志使用的。 该枚举类型定义如下:该枚举类型定义如下:enum skipws,left,right,internal,dec,oct,hex,showbase,showpoint, upperc
11、ase,showpos,scientific,fixed,unitbuf,stdio;C程序设计电子教案第10章流类库与输入输出n各枚举常量的含义如下:各枚举常量的含义如下:n(1)skipws。n(2)left,right,internal。n(3)dec,oct,hex。 n(4)showbase。 n(5)showpoint。 n(6)uppercase。 n(7)showpos。 n(8)scientific,fixed。n(9)unitbuf,stdio。返回本节C程序设计电子教案第10章流类库与输入输出10.2.2 使用使用ios成员函数成员函数nios类类提提供供成成员员函函数数
12、对对流流的的状状态态进进行行检检测测和和进进行行输输入入输输出出格格式式控控制制等等操操作,每个成员函数的声明格式和简要说明如下:作,每个成员函数的声明格式和简要说明如下: int bad(); /操作出错时返回非操作出错时返回非0值值int eof(); /读取到流中最后的文件结束符时返回非读取到流中最后的文件结束符时返回非0值值int fail(); /操作失败时返回非操作失败时返回非0值值void clear(); /清清除除bad,eof和和fail所所对对应应的的标标志志状状态态,使使之恢复为正常状态之恢复为正常状态 /值值0,使,使good标志状态恢复为标志状态恢复为1char f
13、ill(); /返回当前使用的填充字符返回当前使用的填充字符char fill(char c); /重重新新设设置置流流中中用用于于输输出出数数据据的的填填充充字字符为符为c的值,返回的值,返回 /此前的填充字符。系统预设置填充字符为空格此前的填充字符。系统预设置填充字符为空格long flags(); /返回当前用于返回当前用于I/O控制的格式状态字控制的格式状态字C程序设计电子教案第10章流类库与输入输出long flags(long f);/重新设置格式状态字为重新设置格式状态字为f的值,返回此前的格式状态字的值,返回此前的格式状态字int good(); /操作正常时返回非操作正常时返
14、回非0值,当操作出错、失败和读到文件值,当操作出错、失败和读到文件 /结束符时均为不正常,则返回结束符时均为不正常,则返回0int precision(); /返回浮点数输出精度,即输出的有效数字的位数返回浮点数输出精度,即输出的有效数字的位数int precision(int n);/设置浮点数的输出精度为设置浮点数的输出精度为n,返回此前的输出精度。系统预设返回此前的输出精度。系统预设 /置的输出精度为置的输出精度为6,即输出的浮点数最多具有,即输出的浮点数最多具有6位为有效数字位为有效数字int rdstate(); /操作正常时返回操作正常时返回0,否则返回非,否则返回非0值,它与值,
15、它与good()正好相反正好相反long setf(long f);/根据参数根据参数f设置相应的格式化标志,返回此前的设置。该参数设置相应的格式化标志,返回此前的设置。该参数/ f所对应的实参为无名枚举类型中的枚举常量(又称格式化常所对应的实参为无名枚举类型中的枚举常量(又称格式化常/量),可以同时使用一个或多个常量,每两个常量之间要用按位或量),可以同时使用一个或多个常量,每两个常量之间要用按位或/操作符连接。如需要左对齐输出,并使数值中的字母大写时,操作符连接。如需要左对齐输出,并使数值中的字母大写时,/则调用该函数的实参为则调用该函数的实参为ios:left | ios:upperca
16、seC程序设计电子教案第10章流类库与输入输出long unsetf(long f);/根根据据参参数数f清清除除相相应应的的格格式式化化标标志志,返回此前的设置。如要,返回此前的设置。如要/清除此前的左对齐输出设置,恢复默认的右对齐输出设置,清除此前的左对齐输出设置,恢复默认的右对齐输出设置,/则调用该函数的实参为则调用该函数的实参为ios:leftint width(); /返返回回当当前前的的输输出出域域宽宽。若若返返回回数数值值0则则表表明没为刚才输出的数明没为刚才输出的数/值值设设置置输输出出域域宽宽。输输出出域域宽宽是是指指输输出出的的值值在在流流中中所所占占有有的的字字节节数数i
17、nt width(int w); /设设置置下下一一个个数数据据值值的的输输出出域域宽宽为为w,返回为输出上一个数据值返回为输出上一个数据值/所规定的域宽,若无规定则返回所规定的域宽,若无规定则返回0。注意:此设置不是一直有。注意:此设置不是一直有/效,而只是对下一个输出数据有效效,而只是对下一个输出数据有效C程序设计电子教案第10章流类库与输入输出n例例10-2:给出以下程序的运行结果。给出以下程序的运行结果。#includevoid main() int x=123; double y=-3.456789; coutx=; cout.width(10); /设设置置输输出出下下一一个个数数
18、据据的的域域宽宽为为10 coutx; /按按默默认认的的右右对对齐齐输输出出,剩剩余余位置填充空格字符位置填充空格字符 couty=; cout.width(10); /设设置置输输出出下下一一个个数数据据的的域域宽宽为为10 coutyendl; cout.setf(ios:left);/设置按左对齐输出设置按左对齐输出C程序设计电子教案第10章流类库与输入输出 coutx=; cout.width(10); coutx; couty=; cout.width(10); coutyendl; cout.fill(*); /设置填充字符为设置填充字符为* cout.precision(3);
19、 /设置浮点数输出精度为设置浮点数输出精度为3 cout.setf(ios:showpos); /设置正数的正号输出设置正数的正号输出 coutx=; cout.width(10); coutx; couty=; cout.width(10); coutyendl;C程序设计电子教案第10章流类库与输入输出此程序运行结果如下:此程序运行结果如下:x= 123y= -3.45679x=123 y=-3.45679x=+123*y=-3.46*C程序设计电子教案第10章流类库与输入输出n例例10-3:给出以下程序的运行结果。给出以下程序的运行结果。#includevoid main() float
20、 x=12, y=-3.456; coutx yendl; cout.setf(ios:showpoint); /强制显示小数点和无效强制显示小数点和无效0 coutx yendl; cout.unsetf(ios:showpoint); /恢复默认输出恢复默认输出 cout.setf(ios:scientific); /设置按科学表示法输出设置按科学表示法输出 coutx yendl; cout.setf(ios:fixed); /设置按定点表示法输出设置按定点表示法输出 coutx yendl;C程序设计电子教案第10章流类库与输入输出程序运行结果如下:程序运行结果如下:12 -3.456
21、12.0000 -3.456001.200000e+001 -3.456000e+00012 -3.456返回本节C程序设计电子教案第10章流类库与输入输出10.2.3 使用使用I/O操作符操作符n数据输入输出的格式控制还有更简便的形式,数据输入输出的格式控制还有更简便的形式,就是使用系统头文件就是使用系统头文件iomanip.h中提供的操作中提供的操作符。使用这些操纵符不需要调用成员函数,只符。使用这些操纵符不需要调用成员函数,只要把它们作为插入操作符要把它们作为插入操作符)的输出对象即可。)的输出对象即可。 C程序设计电子教案第10章流类库与输入输出n例例10-4:给出以下程序的运行结果。
22、给出以下程序的运行结果。 #include /因因iomanip.h中中包包含含有有iostream.h,所所以以该该命命令令可省略可省略#includevoid main() int x=12, y=345, z=6789; coutx y zendl; /按十进制输出按十进制输出 coutoctx y zendl; /按八进制输出按八进制输出 couthexx y zendl; /按十六进制输出按十六进制输出 coutsetiosflags(ios:showbase | ios:uppercase); /设置基指示符和数值中的字母大写输出设置基指示符和数值中的字母大写输出 coutx y
23、zendl; /仍按十六进制输出仍按十六进制输出 coutresetiosflags(ios:showbase | ios:uppercase); /取消基指示符和数值中的字母大写输出取消基指示符和数值中的字母大写输出 coutx y zendl; /仍按十六进制输出仍按十六进制输出 coutdecx y zendl; /按十进制输出按十进制输出C程序设计电子教案第10章流类库与输入输出n例例10-5:给出以下程序的运行结果。给出以下程序的运行结果。#include#includevoid main() int x=123; double y=-3.456789; coutx=setw(10)
24、x; couty=setw(10)yendl; coutsetiosflags(ios:left); /设置按左对齐输出设置按左对齐输出 coutx=setw(10)x; couty=setw(10)yendl;C程序设计电子教案第10章流类库与输入输出coutsetfill(*); /设置填充字符为设置填充字符为* coutsetprecision(3); /设置浮点数输出精度为设置浮点数输出精度为3 coutsetiosflags(ios:showpos); /设置正数的正号输出设置正数的正号输出 coutx=setw(10)x; couty=setw(10)yendl; coutrese
25、tiosflags(ios:left | ios:showpos); coutsetfill( ); 返回本节C程序设计电子教案第10章流类库与输入输出10.2.4 检测流操作的错误检测流操作的错误在在I/O流流的的操操作作过过程程中中可可能能出出现现各各种种错错误误,每每一一个个流流都都有有一一个个状状态态标标志志字字,以以指指示示是是否否发发生生了了错错误误以以及及出出现现了了哪哪种种类类型型的的错错误误,这这种种处处理理技技术术与与格格式式控控制制标标志志字字是是相相同的。同的。ios类定义了以下枚举类型:类定义了以下枚举类型:enum io_state goodbit =0x00, /
26、不设置任何位,一切正常不设置任何位,一切正常 eofbit =0x01, /输入流已经结束,无字符可读入输入流已经结束,无字符可读入 failbit =0x02, /上次读上次读/写操作失败,但流仍可使用写操作失败,但流仍可使用 badbit =0x04, /试图作无效的读试图作无效的读/写操作,流不再可用写操作,流不再可用 hardfail =0x80 /不可恢复的严重错误不可恢复的严重错误;返回本节C程序设计电子教案第10章流类库与输入输出10.3 文件流文件流n10.3.1 文件的概念文件的概念n10.3.2 文件的打开与关闭文件的打开与关闭n10.3.3 文件的读写文件的读写返回首页C
27、程序设计电子教案第10章流类库与输入输出10.3.1 文件的概念文件的概念n在磁盘上保存的信息是按文件的形式组织的,在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名,并且属于某个物每个文件都对应一个文件名,并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目理盘或逻辑盘的目录层次结构中一个确定的目录之下。一个文件名由文件主名和扩展名两部录之下。一个文件名由文件主名和扩展名两部分组成,它们之间用圆点(即小数点)分开,分组成,它们之间用圆点(即小数点)分开,扩展名可以省略,当省略时也要省略掉前面的扩展名可以省略,当省略时也要省略掉前面的圆点。文件主名是由用户命名的一个有效的圆点。
28、文件主名是由用户命名的一个有效的C+标识符,为了同其他软件系统兼容,一般标识符,为了同其他软件系统兼容,一般让文件主名为不超过让文件主名为不超过8个有效字符的标识符,同个有效字符的标识符,同时为了便于记忆和使用,最好使文件主名的含时为了便于记忆和使用,最好使文件主名的含义与所存的文件内容相一致。义与所存的文件内容相一致。 C程序设计电子教案第10章流类库与输入输出n在在C+程序中使用的保存数据的文件按存储格程序中使用的保存数据的文件按存储格式分为两种类型,一种为字符格式文件,简称式分为两种类型,一种为字符格式文件,简称字符文件,另一种为内部格式文件,简称字节字符文件,另一种为内部格式文件,简称
29、字节文件。字符文件又称文件。字符文件又称ASCII码文件或文本文件,码文件或文本文件,字节文件又称二进制文件。字节文件又称二进制文件。 C程序设计电子教案第10章流类库与输入输出nC+程程序序文文件件,利利用用其其他他各各种种语语言言编编写写的的程程序序文文件件,用用户户建建立立的的各各种种文文本本文文件件,各各种种软软件件系系统统中中的的帮帮助助文文件件等等,因因都都是是ASCII码码文文件件,所所以都可以在以都可以在C+中作为字符文件使用。中作为字符文件使用。nC+系统把各种外部设备也看作为相应的文件。系统把各种外部设备也看作为相应的文件。如把标准输入设备键盘和标准输出设备显示器如把标准输
30、入设备键盘和标准输出设备显示器看作为标准输入输出文件,其文件名(又称设看作为标准输入输出文件,其文件名(又称设备名)为备名)为con,当向它输出信息时就是输出到当向它输出信息时就是输出到显示器,当从它输入信息时就是从键盘输入。显示器,当从它输入信息时就是从键盘输入。 返回本节C程序设计电子教案第10章流类库与输入输出10.3.2 文件的打开与关闭文件的打开与关闭流流可可以以分分为为3类类:输输入入流流、输输出出流流以以及及输输入入/输输出出流流 , 相相 应应 地地 必必 须须 将将 流流 说说 明明 为为 ifstream、ofstream以及以及fstream类的对象。例如:类的对象。例如
31、:ifstream ifile; /说明一个输入流说明一个输入流ofstream ofile; /说明一个输出流说明一个输出流fstream iofile; /说说明明一一个个输输入入/输出流输出流C程序设计电子教案第10章流类库与输入输出说说明明了了流流对对象象之之后后,可可使使用用函函数数open()打打开开文文件件。文文件件的的打打开开即即是是在在流流与与文文件件之之间间建建立立一一个个连连接接。open()的函数原型为:的函数原型为:void open(const char * ,int mode,int prot=:openprot);C程序设计电子教案第10章流类库与输入输出ios
32、:in 打开文件进行读操作打开文件进行读操作ios:out 打开文件进行写操作打开文件进行写操作ios:ate 打开时文件指针定位到文件尾打开时文件指针定位到文件尾ios:app 添添加加模模式式,所所有有增增加加都都在在文文件件尾部进行尾部进行ios:trunc 如果文件已存在则清空原文件如果文件已存在则清空原文件ios:nocreate 如果文件不存在则打开失败如果文件不存在则打开失败ios:noreplace 如果文件存在则打开失败如果文件存在则打开失败ios:binary 二进制文件(非文本文件)二进制文件(非文本文件)C程序设计电子教案第10章流类库与输入输出n下面对文件的打开方式作
33、几点说明:下面对文件的打开方式作几点说明:(1)文件的打开方式可以为上述的一个枚举常量,也可)文件的打开方式可以为上述的一个枚举常量,也可以为多个枚举常量构成的按位或表达式。以为多个枚举常量构成的按位或表达式。 (2)使用)使用open成员函数打开一个文件时,若由字符指针成员函数打开一个文件时,若由字符指针参数所指定的文件不存在,则建立该文件。参数所指定的文件不存在,则建立该文件。 (3)当打开方式中不含有)当打开方式中不含有ios:ate或或ios:app选项时,则选项时,则文件指针被自动移到文件的开始位置,即字节地址为文件指针被自动移到文件的开始位置,即字节地址为0的位置。的位置。 (4)
34、当用输入文件流对象调用)当用输入文件流对象调用open成员函数打开一个文成员函数打开一个文件时,打开方式参数可以省略,默认按件时,打开方式参数可以省略,默认按ios:in方式打开,方式打开,若打开方式参数中不含有若打开方式参数中不含有ios:in选项时,则会自动被加选项时,则会自动被加上。上。 C程序设计电子教案第10章流类库与输入输出n下面给出定义文件流对象和打开文件的一些例子:下面给出定义文件流对象和打开文件的一些例子: (1)ofstream fout; fout.open(a:aaa.dat); /字字符符串串中中的的双双反反斜斜线线表表示示一一个个反斜线反斜线(2)ifstream
35、fin; fin.open(a:bbb.dat, ios:in | ios:nocreate);(3)ofstream ofs; ofs.open(a:ccc.dat, ios:app);(4)fstream fio; fio.open(a:ddd.ran, ios:in | ios:out | ios:binary);返回本节C程序设计电子教案第10章流类库与输入输出10.3.3 文件的读写文件的读写n1文件读写方法文件读写方法n(1)使用流运算符直接读写。)使用流运算符直接读写。n(2)使用流成员函数。)使用流成员函数。常用的输出流成员函数如下:常用的输出流成员函数如下: put函数函数
36、write函数函数 get函数函数 read函数函数 getline函数函数 C程序设计电子教案第10章流类库与输入输出n下面对文件的打开方式作几点说明:下面对文件的打开方式作几点说明:n(1)向向字字符符文文件件输输出出数数据据有有两两种种方方法法,一一种种是是调调用用从从ostream流流类类中中继继承承来来的的插插入入操操作作符符重重载载函函数数,另另一一种种是是调调用用从从ostream流流类类中中继继承承来的来的put成员函数。成员函数。n(2)从从打打开开的的字字符符文文件件中中输输入入数数据据到到内内存存变变量量有三种方法。有三种方法。 n(3)当当使使用用流流对对象象调调用用g
37、et()成成员员函函数数时时,通通过过判判断断返返回回值值是是否否等等于于文文件件结结束束符符EOF可可知知文文件中的数据是否被输入完毕。件中的数据是否被输入完毕。 C程序设计电子教案第10章流类库与输入输出n2文本文件的读写文本文件的读写n文文本本文文件件只只适适用用于于那那些些解解释释为为ASCII码码的的文文件件。处处理理文文本本文文件件时时将将自自动动作作一一些些字字符符转转换换,如如输输出出换换行行字字符符0x0A时时将将转转换换为为回回车车0x0D与与换换行行0x0A两两个个字字符符存存入入文文本本文文件件,读读入入时时也也会会将将回回车车与与换换行行两两个个字字符符合合并并为为一
38、一个个换换行行字字符符,这这样样内内存存中中的的字字符符与与写写入入文文件件中中的的字字符符之之间间就就不不再再是是一一一一对对应应关关系系。文文本本文文件件的的结结束束以以ASCII码码的控制字符的控制字符0x1A表示。表示。 C程序设计电子教案第10章流类库与输入输出n例例10-7:向向a盘上的盘上的write1.dat文件输出文件输出010之间的整数,含之间的整数,含0和和10在内。在内。 #include#include#includevoid main(void) ofstream f1(a:/write1.dat); /定义输出文件流,并打开相应文件,若打开定义输出文件流,并打开相
39、应文件,若打开 /失败则失败则f1带回带回0值值 if (!f1) /当当f1打开失败时进行错误处理打开失败时进行错误处理 cerra:/write1.dat open!endl; exit(1); for(int i=0;i10;i+) f1i ; /向向f1文件流输出文件流输出i值值 f1.close(); /关闭关闭f1所对应的文件所对应的文件C程序设计电子教案第10章流类库与输入输出n例例10-9:假假定定一一个个结结构构数数组组a中中的的元元素素类类型型pupil包包含含有有表表示示姓姓名名的的字字符符指指针针域域name和和表表示示成成绩绩的的整整数数域域grade,试试编编写写一
40、一个个函函数数把该数组中的把该数组中的n个元素输出到字符文件个元素输出到字符文件“a:/write3.dat”中。中。#include#includevoid ArrayOut(pupil a, int n) ofstream f3(a:/write3.dat); if (!file3) /当当file3打打开开失失败败时时进进行行错错误误处处理理 cerr a:/write3.dat not open!endl; exit(1);C程序设计电子教案第10章流类库与输入输出 for(int i=0; in; i+) file3ai.nameendlai.gradeendl; ();若已经为输出
41、若已经为输出pupil类型的数据定义了如下插入操作符重载函数:类型的数据定义了如下插入操作符重载函数:ostream& operator(ostream& ostr, pupil& x)ostrx.nameendlx.gradeendl;return ostr;则可将上述函数中则可将上述函数中for循环体语句修改为循环体语句修改为“file3ai;”。C程序设计电子教案第10章流类库与输入输出n例例10-10:从例从例10-7所建立的所建立的a:/write1.dat文件中输入全部数据并依次显文件中输入全部数据并依次显示到屏幕上。示到屏幕上。 #include#include#includev
42、oid main(void) ifstream f1(a:/write1.dat, ios:in | ios:nocreate); /定义输入文件流,并打开相应文件,若打开失定义输入文件流,并打开相应文件,若打开失败则败则file1带回带回0值值 if (!file1) /当当file1打开失败时进行错误处理打开失败时进行错误处理 cerra:/write1.dat open!x) /依次从文件中输入整数到依次从文件中输入整数到x,当读到的当读到的是文件结束符时条件表达式是文件结束符时条件表达式 /的值为的值为0 coutx ; coutendl; (); /关闭关闭file1所对应的文件所对
43、应的文件该程序运行结果如下:该程序运行结果如下:0 1 2 3 4 5 6 7 8 9 C程序设计电子教案第10章流类库与输入输出n3二进制文件的读写二进制文件的读写n二二进进制制文文件件不不同同于于文文本本文文件件,它它可可用用于于任任何何类类型型的的文文件件(包包括括文文本本文文件件),读读写写二二进进制制文文件件的的字字符符不不作作任任何何转转换换,读读写写的的字字符符与与文文件件之之间间是完全一致的。是完全一致的。n一一般般地地,对对二二进进制制文文件件的的读读写写可可采采用用两两种种方方法法:一一种种是是使使用用get()和和put();另另一一种种是是使使用用read()和和wri
44、te()。C程序设计电子教案第10章流类库与输入输出n例例10-12:二进制文件读写的示例程序。二进制文件读写的示例程序。 #includestruct Date int month,day,year;void main() Date dt=02,07,1975; Ofstream ofile(“dsc.dat”,ios:binary); Ofile.write(char *)&dt,sizeof dt);C程序设计电子教案第10章流类库与输入输出n4文件的随机读写文件的随机读写n(1)输出流随机访问函数。)输出流随机访问函数。 n(2)输入流随机访问函数。)输入流随机访问函数。C程序设计电子
45、教案第10章流类库与输入输出n例例10-13:编写一个程序,随机读写指定位置上的字符。编写一个程序,随机读写指定位置上的字符。#include #include int main() ifstream ifile; char fn20; coutfn; ifile.open(fn); if(!ifile) C程序设计电子教案第10章流类库与输入输出 coutfnCannot open this fileendl; return 0; ifile.seekg(0,ios:end); int maxpos=ifile.tellg(); int pos; coutpos; if(posmaxpos)
46、 coutThe position of file isnt rightendl;C程序设计电子教案第10章流类库与输入输出 else char ch; ifile.seekg(pos); ifile.get(ch); coutchendl; ifile.close(); return 1;如果需要读取多个字节的数据,则可将如果需要读取多个字节的数据,则可将ifile.get(ch);改为:改为:ifile.read(char *)&ch,sizeof(char); 返回本节C程序设计电子教案第10章流类库与输入输出10.4 字符串流字符串流n10.4.1 字符串流概述字符串流概述n10.4.
47、2 istrstream类的构造函数类的构造函数n10.4.3 ostrstream类的构造函数类的构造函数返回首页C程序设计电子教案第10章流类库与输入输出10.4.1 字符串流概述字符串流概述n字符串流类包括输入字符串流类字符串流类包括输入字符串流类istrstream,输出字符串流类输出字符串流类ostrstream和输入输出字符串和输入输出字符串流类流类strstream三种。它们都被定义在系统头文三种。它们都被定义在系统头文件件strstrea.h中。只要在程序中带有该头文件,中。只要在程序中带有该头文件,就可以使用任一种字符串流类定义字符串流对就可以使用任一种字符串流类定义字符串流
48、对象。每个字符串流对象简称为字符串流。象。每个字符串流对象简称为字符串流。n字符串流对应的访问空间是内存中由用户定义字符串流对应的访问空间是内存中由用户定义的字符数组,而文件流对应的访问空间是外存的字符数组,而文件流对应的访问空间是外存上由文件名确定的文件存储空间。上由文件名确定的文件存储空间。 C程序设计电子教案第10章流类库与输入输出三种字符串流类的构造函数声明格式分别如下:三种字符串流类的构造函数声明格式分别如下:istrstream(const char* buffer);ostrstream(char* buffer, int n);strstream(char* buffer, i
49、nt n, int mode);C程序设计电子教案第10章流类库与输入输出下面给出定义相应字符串流的例子。下面给出定义相应字符串流的例子。(1)ostrstream sout(a1,50);(2)istrstream sin(a2);( 3) strstream sio(a3,sizeof(a3),ios:in | ios:out);返回本节C程序设计电子教案第10章流类库与输入输出10.4.2 istrstream类的构造函数类的构造函数istrstream类的构造函数的原型分别是:类的构造函数的原型分别是:istrstream:istrstream(char *s);istrstream:
50、istrstream(char *s,int n);这这两两个个构构造造函函数数的的第第一一个个参参数数s是是一一个个字字符符指指针针或或字字符符数数组组,使使用用该该串串来来初初始始化化要要创创建建的的流流对对象象。第第一一个个构构造造函函数数是是使使用用所所指指定定的的串串的的全全部部内内容容来来构构造造流流对对象象,而而第第二二个个构构造造函函数数使使用用串串中中前前n个字符来构造串对象。个字符来构造串对象。C程序设计电子教案第10章流类库与输入输出n下面举例说明上述构造函数的用法。下面举例说明上述构造函数的用法。例例10-14:从从一一个个字字符符串串流流中中输输入入用用逗逗号号分分开
51、开的的每每一一个个整整数数并并显显示示出出来。来。#includevoid main() char a=12,34 ,56, 78,90 ,87,65,43; coutawsxws; /从从流流中中读读入入一一个个整整数数,并并使用操作符使用操作符ws读取读取 /一个整数前后的空白字符一个整数前后的空白字符 coutx ; /输出输出x的值并后跟一个空格的值并后跟一个空格 sin.get(ch); /从从sin流流中中读读入入一一个个字字符符,实实际际读取的是读取的是,或或字符字符 coutendl;此程序的运行结果为:此程序的运行结果为:12,34 ,56, 78,90 ,87,65,431
52、2 34 56 78 90 87 65 43C程序设计电子教案第10章流类库与输入输出n例例10-15:分析下列程序的运行结果。分析下列程序的运行结果。#include #include void main()char buf=1234567;int i,j;istrstream s1(buf);s1i;istrstream s2(buf,3);s2j;couti+jendl;此程序的运行结果为:此程序的运行结果为:返回本节C程序设计电子教案第10章流类库与输入输出10.4.3 ostrstream类的构造函数类的构造函数ostrstream类的构造函数的原型分别是:类的构造函数的原型分别是:
53、ostrstream:ostrstream();ostrstream:ostrstream(char *s,int n,int mode=ios:out);ostrstream类还提供了如下成员函数:类还提供了如下成员函数:int ostrstream:pcount();char *ostrstream:str();C程序设计电子教案第10章流类库与输入输出n例例10-16:从一个字符串中得到每一个整数,并把它们依次存入到一个字从一个字符串中得到每一个整数,并把它们依次存入到一个字符串流中,最后向屏幕输出这个字符串流。符串流中,最后向屏幕输出这个字符串流。 #includevoid main(
54、) char a50; char b50; istrstream sin(a); /定义一个输入字符串流定义一个输入字符串流sin,使用的字符数组为使用的字符数组为a ostrstream sout(b,sizeof(b); /定义一个输出字符串流定义一个输出字符串流sout,使用的字符数组为使用的字符数组为b cin.getline(a,sizeof(a); /假假 定定 从从 键键 盘盘 上上 输输 入入 的的 字字 符符 串串 为为 ab12+34,56*78-90/cd123,ABC45DE:fg67;89 char ch= ;C程序设计电子教案第10章流类库与输入输出int x; w
55、hile(ch!=) /使用使用字符作为字符串流结束标志字符作为字符串流结束标志 if(ch=48 & chx; /从从流流中中读读入入一一个个整整数数,当当碰碰到到非非数数字字字字符时符时 /则就认为一个整数结束。则就认为一个整数结束。 soutx ;/将将x输出到字符串流输出到字符串流sout中中 sin.get(ch);/从从sin流中读入下一个字符流中读入下一个字符C程序设计电子教案第10章流类库与输入输出 soutends;/向向sout流流输输出出作作为为结结束束符符的的字符和一个字符串结束符字符和一个字符串结束符0 coutb; /输输出出字字符符串串流流sout对对应应的的字符串字符串 coutendl;该程序的运行结果如下:该程序的运行结果如下:ab12+34,56*78-90/cd123,ABC45DE:fg67;8912 34 56 78 90 123 45 67 89 返回本节C程序设计电子教案第10章流类库与输入输出