资源描述
C+程序设计电子教案第10章流类库与输入输出第第10章章 流类库与输入输出流类库与输入输出n10.1 I/O标准流类标准流类n10.2 格式化格式化I/On10.3 文件流文件流n10.4 字符串流字符串流C+程序设计电子教案第10章流类库与输入输出10.1 I/O标准流类标准流类n预定义流预定义流nC+中的流类库中的流类库返回首页C+程序设计电子教案第10章流类库与输入输出n在在C+语言中,数据的输入和输出(简写为语言中,数据的输入和输出(简写为I/O)包括对标准输入设备键盘和标准输出设备显示包括对标准输入设备键盘和标准输出设备显示器、对在外存磁盘上的文件和对内存中指定的器、对在外存磁盘上的文件和对内存中指定的字符串存储空间进行输入输出这三个方面。对字符串存储空间进行输入输出这三个方面。对标准输入设备和标准输出设备的输入输出简称标准输入设备和标准输出设备的输入输出简称为标准为标准I/O,对在外存磁盘上文件的输入输出简对在外存磁盘上文件的输入输出简称为文件称为文件I/O,对内存中指定的字符串存储空间对内存中指定的字符串存储空间的输入输出简称为串的输入输出简称为串I/O。C+程序设计电子教案第10章流类库与输入输出nC+中把数据之间的传输操作称作流。在中把数据之间的传输操作称作流。在C+中,流既可以表示数据从内存传送到某个载体中,流既可以表示数据从内存传送到某个载体或设备中,即输出流;也可以表示数据从某个或设备中,即输出流;也可以表示数据从某个载体或设备传送到内存缓冲区变量中,即输入载体或设备传送到内存缓冲区变量中,即输入流。在进行流。在进行I/O操作时,首先打开操作,使流和操作时,首先打开操作,使流和文件发生联系,建立联系后的文件才允许数据文件发生联系,建立联系后的文件才允许数据流入或流出,输入或输出结束后,使用关闭操流入或流出,输入或输出结束后,使用关闭操作使文件与流断开联系。作使文件与流断开联系。C+程序设计电子教案第10章流类库与输入输出nC+中所有流都是相同的,但文件可以不同。中所有流都是相同的,但文件可以不同。使用流以后,程序用流统一对各种计算机设备使用流以后,程序用流统一对各种计算机设备和文件进行操作,使程序与设备、程序与文件和文件进行操作,使程序与设备、程序与文件无关,从而提高了程序设计的通用性和灵活性。无关,从而提高了程序设计的通用性和灵活性。也就是说,无论与流相联系的实际物理设备差也就是说,无论与流相联系的实际物理设备差别有多大,流都采用相同的方式运行。这种机别有多大,流都采用相同的方式运行。这种机制使得流可以跨越物理设备平台,实现流的透制使得流可以跨越物理设备平台,实现流的透明运作,而与实际的物理设备无关。例如,往明运作,而与实际的物理设备无关。例如,往显示器上输出字符和向磁盘文件或打印机输出显示器上输出字符和向磁盘文件或打印机输出字符,尽管接受输出的物理设备不同,但具体字符,尽管接受输出的物理设备不同,但具体操作过程是相同的。操作过程是相同的。C+程序设计电子教案第10章流类库与输入输出预定义流预定义流n1cout在在ostream输出流类中定义有对左移操作符输出流类中定义有对左移操作符重载的一组重载的一组公用成员函数,函数的具体声明格式为:公用成员函数,函数的具体声明格式为:ostream&operator重载的一组重载的一组公用成员函数,函数的具体声明格式为:公用成员函数,函数的具体声明格式为:istream&operator(简单类型标识符简单类型标识符&);C+程序设计电子教案第10章流类库与输入输出n3cerrcerr类似标准错误文件。类似标准错误文件。cerr与与cout的差别在于:的差别在于:(1)cerr不能重定向。不能重定向。(2)cerr不能被缓冲,它的输出总是直接传达到标准输不能被缓冲,它的输出总是直接传达到标准输出设备上。出设备上。4clogclog是不能重定向的,但是可以被缓冲。在某些系统中,是不能重定向的,但是可以被缓冲。在某些系统中,由于缓冲,使用由于缓冲,使用clog代替代替cerr可以改进显示速度。可以改进显示速度。clog Error n;返回本节C+程序设计电子教案第10章流类库与输入输出C+中的流类库中的流类库nC+语言系统为实现数据的输入和输出定义了一个庞大的类库,语言系统为实现数据的输入和输出定义了一个庞大的类库,它包括的类主要有它包括的类主要有ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrstream和和strstream等。等。n其中其中ios为根基类,它直接派生四个类:输入流类为根基类,它直接派生四个类:输入流类istream、输出输出流类流类ostream、文件流基类文件流基类fstreambase和字符串流基类和字符串流基类strstreambase,输入文件流类输入文件流类ifstream同时继承了输入流类和文同时继承了输入流类和文件流基类(当然对于根基类是间接继承),输出文件流类件流基类(当然对于根基类是间接继承),输出文件流类ofstream同时继承了输出流类和文件流基类,输入字符串流类同时继承了输出流类和文件流基类,输入字符串流类istrstream同时继承了输入流类和字符串流基类,输出字符串流同时继承了输入流类和字符串流基类,输出字符串流类类ostrstream同时继承了输出流类和字符串流基类,输入输出流同时继承了输出流类和字符串流基类,输入输出流类类iostream同时继承了输入流类和输出流类,输入输出文件流类同时继承了输入流类和输出流类,输入输出文件流类fstream同时继承了输入输出流类和文件流基类,输入输出字符串同时继承了输入输出流类和文件流基类,输入输出字符串流类流类strstream同时继承了输入输出流类和字符串流基类。同时继承了输入输出流类和字符串流基类。返回本节C+程序设计电子教案第10章流类库与输入输出10.2 格式化格式化I/Onios类中的枚举常量类中的枚举常量n使用使用ios成员函数成员函数n使用使用I/O操作符操作符n检测流操作的错误检测流操作的错误返回首页C+程序设计电子教案第10章流类库与输入输出类中的枚举常量类中的枚举常量n在根基类在根基类ios中定义有三个用户需要使用的枚举类型,由中定义有三个用户需要使用的枚举类型,由于它们是在公用成员部分定义的,所以其中的每个枚举类于它们是在公用成员部分定义的,所以其中的每个枚举类型常量在加上型常量在加上ios:前缀后都可以为本类成员函数和所有外前缀后都可以为本类成员函数和所有外部函数访问。部函数访问。n在三个枚举类型中有一个无名枚举类型,其中定义的每个在三个枚举类型中有一个无名枚举类型,其中定义的每个枚举常量都是用于设置控制输入输出格式的标志使用的。枚举常量都是用于设置控制输入输出格式的标志使用的。该枚举类型定义如下:该枚举类型定义如下:enum skipws,left,right,internal,dec,oct,hex,showbase,showpoint,uppercase,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章流类库与输入输出使用使用ios成员函数成员函数nios类提供成员函数对流的状态进行检测和进行输入输出格式控制等操类提供成员函数对流的状态进行检测和进行输入输出格式控制等操作,每个成员函数的声明格式和简要说明如下:作,每个成员函数的声明格式和简要说明如下:int bad();/操作出错时返回非操作出错时返回非0值值int eof();/读取到流中最后的文件结束符时返回非读取到流中最后的文件结束符时返回非0值值int fail();/操作失败时返回非操作失败时返回非0值值void clear();/清除清除bad,eof和和fail所对应的标志状态,使所对应的标志状态,使之恢复为正常状态之恢复为正常状态 /值值0,使,使good标志状态恢复为标志状态恢复为1char fill();/返回当前使用的填充字符返回当前使用的填充字符char fill(char c);/重新设置流中用于输出数据的填充字重新设置流中用于输出数据的填充字符为符为c的值,返回的值,返回 /此前的填充字符。系统预设置填充字符为空格此前的填充字符。系统预设置填充字符为空格long flags();/返回当前用于返回当前用于I/O控制的格式状态字控制的格式状态字C+程序设计电子教案第10章流类库与输入输出long flags(long f);/重新设置格式状态字为重新设置格式状态字为f的值,返回此前的格式状态字的值,返回此前的格式状态字int good();/操作正常时返回非操作正常时返回非0值,当操作出错、失败和读到文件值,当操作出错、失败和读到文件 /结束符时均为不正常,则返回结束符时均为不正常,则返回0int precision();/返回浮点数输出精度,即输出的有效数字的位数返回浮点数输出精度,即输出的有效数字的位数int precision(int n);/设置浮点数的输出精度为设置浮点数的输出精度为n,返回此前的输出精度。系统预设返回此前的输出精度。系统预设 /置的输出精度为置的输出精度为6,即输出的浮点数最多具有,即输出的浮点数最多具有6位为有效数字位为有效数字int rdstate();/操作正常时返回操作正常时返回0,否则返回非,否则返回非0值,它与值,它与good()正好相反正好相反long setf(long f);/根据参数根据参数f设置相应的格式化标志,返回此前的设置。该参数设置相应的格式化标志,返回此前的设置。该参数/f所对应的实参为无名枚举类型中的枚举常量(又称格式化常所对应的实参为无名枚举类型中的枚举常量(又称格式化常/量),可以同时使用一个或多个常量,每两个常量之间要用按位或量),可以同时使用一个或多个常量,每两个常量之间要用按位或/操作符连接。如需要左对齐输出,并使数值中的字母大写时,操作符连接。如需要左对齐输出,并使数值中的字母大写时,/则调用该函数的实参为则调用该函数的实参为ios:left|ios:uppercaseC+程序设计电子教案第10章流类库与输入输出long unsetf(long f);/根据参数根据参数f清除相应的格式化标清除相应的格式化标志,返回此前的设置。如要志,返回此前的设置。如要/清除此前的左对齐输出设置,恢复默认的右对齐输出设置,清除此前的左对齐输出设置,恢复默认的右对齐输出设置,/则调用该函数的实参为则调用该函数的实参为ios:leftint width();/返回当前的输出域宽。若返回数值返回当前的输出域宽。若返回数值0则表则表明没为刚才输出的数明没为刚才输出的数/值设置输出域宽。输出域宽是指输出的值在流中所占有的字节值设置输出域宽。输出域宽是指输出的值在流中所占有的字节数数int width(int w);/设置下一个数据值的输出域宽为设置下一个数据值的输出域宽为w,返回为输出上一个数据值返回为输出上一个数据值/所规定的域宽,若无规定则返回所规定的域宽,若无规定则返回0。注意:此设置不是一直有。注意:此设置不是一直有/效,而只是对下一个输出数据有效效,而只是对下一个输出数据有效C+程序设计电子教案第10章流类库与输入输出n例例10-2:给出以下程序的运行结果。给出以下程序的运行结果。#includevoid main()int x=123;double y=-3.456789;coutx=;cout.width(10);/设置输出下一个数设置输出下一个数据的域宽为据的域宽为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);/设置浮点数输出精度为设置浮点数输出精度为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 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.45612.0000-3.456001.200000e+001-3.456000e+00012-3.456返回本节C+程序设计电子教案第10章流类库与输入输出使用使用I/O操作符操作符n数据输入输出的格式控制还有更简便的形式,数据输入输出的格式控制还有更简便的形式,就是使用系统头文件就是使用系统头文件iomanip.h中提供的操作中提供的操作符。使用这些操纵符不需要调用成员函数,只符。使用这些操纵符不需要调用成员函数,只要把它们作为插入操作符要把它们作为插入操作符)的输出对象即可。)的输出对象即可。C+程序设计电子教案第10章流类库与输入输出n例例10-4:给出以下程序的运行结果。给出以下程序的运行结果。#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 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)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;coutresetiosflags(ios:left|ios:showpos);coutsetfill();返回本节C+程序设计电子教案第10章流类库与输入输出检测流操作的错误检测流操作的错误在在I/O流的操作过程中可能出现各种错误,每一个流都有一个状态标志字,以指示是流的操作过程中可能出现各种错误,每一个流都有一个状态标志字,以指示是否发生了错误以及出现了哪种类型的错误,这种处理技术与格式控制标志字是否发生了错误以及出现了哪种类型的错误,这种处理技术与格式控制标志字是相同的。相同的。ios类定义了以下枚举类型:类定义了以下枚举类型:enum io_state goodbit=0 x00,/不设置任何位,一切正常不设置任何位,一切正常 eofbit =0 x01,/输入流已经结束,无字符可读入输入流已经结束,无字符可读入 failbit =0 x02,/上次读上次读/写操作失败,但流仍可使用写操作失败,但流仍可使用 badbit =0 x04,/试图作无效的读试图作无效的读/写操作,流不再可用写操作,流不再可用 hardfail=0 x80 /不可恢复的严重错误不可恢复的严重错误;返回本节C+程序设计电子教案第10章流类库与输入输出10.3 文件流文件流n文件的概念文件的概念n文件的打开与关闭文件的打开与关闭n文件的读写文件的读写返回首页C+程序设计电子教案第10章流类库与输入输出文件的概念文件的概念n在磁盘上保存的信息是按文件的形式组织的,在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名,并且属于某个物每个文件都对应一个文件名,并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目理盘或逻辑盘的目录层次结构中一个确定的目录之下。一个文件名由文件主名和扩展名两部录之下。一个文件名由文件主名和扩展名两部分组成,它们之间用圆点(即小数点)分开,分组成,它们之间用圆点(即小数点)分开,扩展名可以省略,当省略时也要省略掉前面的扩展名可以省略,当省略时也要省略掉前面的圆点。文件主名是由用户命名的一个有效的圆点。文件主名是由用户命名的一个有效的C+标识符,为了同其他软件系统兼容,一般标识符,为了同其他软件系统兼容,一般让文件主名为不超过让文件主名为不超过8个有效字符的标识符,个有效字符的标识符,同时为了便于记忆和使用,最好使文件主名的同时为了便于记忆和使用,最好使文件主名的含义与所存的文件内容相一致。含义与所存的文件内容相一致。C+程序设计电子教案第10章流类库与输入输出n在在C+程序中使用的保存数据的文件按存储格程序中使用的保存数据的文件按存储格式分为两种类型,一种为字符格式文件,简称式分为两种类型,一种为字符格式文件,简称字符文件,另一种为内部格式文件,简称字节字符文件,另一种为内部格式文件,简称字节文件。字符文件又称文件。字符文件又称ASCII码文件或文本文件,码文件或文本文件,字节文件又称二进制文件。字节文件又称二进制文件。C+程序设计电子教案第10章流类库与输入输出nC+程序文件,利用其他各种语言编写的程序程序文件,利用其他各种语言编写的程序文件,用户建立的各种文本文件,各种软件系文件,用户建立的各种文本文件,各种软件系统中的帮助文件等,因都是统中的帮助文件等,因都是ASCII码文件,所码文件,所以都可以在以都可以在C+中作为字符文件使用。中作为字符文件使用。nC+系统把各种外部设备也看作为相应的文件。系统把各种外部设备也看作为相应的文件。如把标准输入设备键盘和标准输出设备显示器如把标准输入设备键盘和标准输出设备显示器看作为标准输入输出文件,其文件名(又称设看作为标准输入输出文件,其文件名(又称设备名)为备名)为con,当向它输出信息时就是输出到当向它输出信息时就是输出到显示器,当从它输入信息时就是从键盘输入。显示器,当从它输入信息时就是从键盘输入。返回本节C+程序设计电子教案第10章流类库与输入输出文件的打开与关闭文件的打开与关闭流可以分为流可以分为3类:输入流、输出流以及输入类:输入流、输出流以及输入/输出输出流,相应地必须将流说明为流,相应地必须将流说明为ifstream、ofstream以及以及fstream类的对象。例如:类的对象。例如:ifstream ifile;/说明一个输入流说明一个输入流ofstream ofile;/说明一个输出流说明一个输出流fstream iofile;/说明一个输入说明一个输入/输出流输出流C+程序设计电子教案第10章流类库与输入输出说明了流对象之后,可使用函数说明了流对象之后,可使用函数open()打开文件。打开文件。文件的打开即是在流与文件之间建立一个连接。文件的打开即是在流与文件之间建立一个连接。open()的函数原型为:的函数原型为:void open(const char*mode,int prot=);C+程序设计电子教案第10章流类库与输入输出ios:in 打开文件进行读操作打开文件进行读操作ios:out 打开文件进行写操作打开文件进行写操作ios:ate 打开时文件指针定位到文件尾打开时文件指针定位到文件尾ios:app 添加模式,所有增加都在文件添加模式,所有增加都在文件尾部进行尾部进行ios:trunc 如果文件已存在则清空原文件如果文件已存在则清空原文件ios:nocreate 如果文件不存在则打开失败如果文件不存在则打开失败ios:noreplace 如果文件存在则打开失败如果文件存在则打开失败ios:binary 二进制文件(非文本文件)二进制文件(非文本文件)C+程序设计电子教案第10章流类库与输入输出n下面对文件的打开方式作几点说明:下面对文件的打开方式作几点说明:(1)文件的打开方式可以为上述的一个枚举常量,也可)文件的打开方式可以为上述的一个枚举常量,也可以为多个枚举常量构成的按位或表达式。以为多个枚举常量构成的按位或表达式。(2)使用)使用open成员函数打开一个文件时,若由字符指针成员函数打开一个文件时,若由字符指针参数所指定的文件不存在,则建立该文件。参数所指定的文件不存在,则建立该文件。(3)当打开方式中不含有)当打开方式中不含有ios:ate或或ios:app选项时,则选项时,则文件指针被自动移到文件的开始位置,即字节地址为文件指针被自动移到文件的开始位置,即字节地址为0的位置。的位置。(4)当用输入文件流对象调用)当用输入文件流对象调用open成员函数打开一个文成员函数打开一个文件时,打开方式参数可以省略,默认按件时,打开方式参数可以省略,默认按ios:in方式打方式打开,若打开方式参数中不含有开,若打开方式参数中不含有ios:in选项时,则会自选项时,则会自动被加上。动被加上。C+程序设计电子教案第10章流类库与输入输出n下面给出定义文件流对象和打开文件的一些例子:下面给出定义文件流对象和打开文件的一些例子:(1)ofstream fout;fout.open(a:aaa.dat);/字符串中的双反斜线表示一个字符串中的双反斜线表示一个反斜线反斜线(2)ifstream 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章流类库与输入输出文件的读写文件的读写n1文件读写方法文件读写方法n(1)使用流运算符直接读写。)使用流运算符直接读写。n(2)使用流成员函数。)使用流成员函数。常用的输出流成员函数如下:常用的输出流成员函数如下:put函数函数 write函数函数 get函数函数 read函数函数 getline函数函数 C+程序设计电子教案第10章流类库与输入输出n下面对文件的打开方式作几点说明:下面对文件的打开方式作几点说明:n(1)向字符文件输出数据有两种方法,一种)向字符文件输出数据有两种方法,一种是调用从是调用从ostream流类中继承来的插入操作符流类中继承来的插入操作符重载函数,另一种是调用从重载函数,另一种是调用从ostream流类中继流类中继承来的承来的put成员函数。成员函数。n(2)从打开的字符文件中输入数据到内存变)从打开的字符文件中输入数据到内存变量有三种方法。量有三种方法。n(3)当使用流对象调用)当使用流对象调用get()成员函数时,通成员函数时,通过判断返回值是否等于文件结束符过判断返回值是否等于文件结束符EOF可知文可知文件中的数据是否被输入完毕。件中的数据是否被输入完毕。C+程序设计电子教案第10章流类库与输入输出n2文本文件的读写文本文件的读写n文本文件只适用于那些解释为文本文件只适用于那些解释为ASCII码的文件。码的文件。处理文本文件时将自动作一些字符转换,如输处理文本文件时将自动作一些字符转换,如输出换行字符出换行字符0 x0A时将转换为回车时将转换为回车0 x0D与换行与换行0 x0A两个字符存入文本文件,读入时也会将回两个字符存入文本文件,读入时也会将回车与换行两个字符合并为一个换行字符,这样车与换行两个字符合并为一个换行字符,这样内存中的字符与写入文件中的字符之间就不再内存中的字符与写入文件中的字符之间就不再是一一对应关系。文本文件的结束以是一一对应关系。文本文件的结束以ASCII码码的控制字符的控制字符0 x1A表示。表示。C+程序设计电子教案第10章流类库与输入输出n例例10-7:向向a盘上的盘上的write1.dat文件输出文件输出010之间的整数,含之间的整数,含0和和10在内。在内。#include#include#includevoid main(void)ofstream f1(a:/write1.dat);/定义输出文件流,并打开相应文件,若打开定义输出文件流,并打开相应文件,若打开 /失败则失败则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,试编写一个函数试编写一个函数把该数组中的把该数组中的n个元素输出到字符文件个元素输出到字符文件“”中。中。#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;();若已经为输出若已经为输出pupil类型的数据定义了如下插入操作符重载函数:类型的数据定义了如下插入操作符重载函数:ostream&operator(ostream&ostr,pupil&x)ostrx.nameendlx.gradeendl;return ostr;则可将上述函数中则可将上述函数中for循环体语句修改为循环体语句修改为“file3ai;”。C+程序设计电子教案第10章流类库与输入输出n例例10-10:从例从例10-7所建立的文件中输入全部数据并依次显示到屏幕上。所建立的文件中输入全部数据并依次显示到屏幕上。#include#include#includevoid 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所对应的文件所对应的文件该程序运行结果如下:该程序运行结果如下:0 1 2 3 4 5 6 7 8 9 C+程序设计电子教案第10章流类库与输入输出n3二进制文件的读写二进制文件的读写n二进制文件不同于文本文件,它可用于任何类二进制文件不同于文本文件,它可用于任何类型的文件(包括文本文件),读写二进制文件型的文件(包括文本文件),读写二进制文件的字符不作任何转换,读写的字符与文件之间的字符不作任何转换,读写的字符与文件之间是完全一致的。是完全一致的。n一般地,对二进制文件的读写可采用两种方法:一般地,对二进制文件的读写可采用两种方法:一种是使用一种是使用get()和和put();另一种是使用另一种是使用read()和和write()。C+程序设计电子教案第10章流类库与输入输出n例例10-12:二进制文件读写的示例程序。二进制文件读写的示例程序。#includestruct Date int month,day,year;void main()Date dt=02,07,1975;Ofstream ofile(“dsc.dat”,ios:binary);O(char*)&dt,sizeof dt);C+程序设计电子教案第10章流类库与输入输出n4文件的随机读写文件的随机读写n(1)输出流随机访问函数。)输出流随机访问函数。n(2)输入流随机访问函数。)输入流随机访问函数。C+程序设计电子教案第10章流类库与输入输出n例例10-13:编写一个程序,随机读写指定位置上的字符。编写一个程序,随机读写指定位置上的字符。#include#include int main()ifstream ifile;char fn20;coutfn;i(fn);if(!ifile)C+程序设计电子教案第10章流类库与输入输出 coutfnCannot open this fileendl;return 0;i(0,ios:end);int maxpos=i();int pos;coutpos;if(posmaxpos)coutThe position of t rightendl;C+程序设计电子教案第10章流类库与输入输出 else char ch;i(pos);i(ch);coutchendl;i();return 1;如果需要读取多个字节的数据,则可将如果需要读取多个字节的数据,则可将i(ch);改为:改为:i(char*)&ch,sizeof(char);返回本节C+程序设计电子教案第10章流类库与输入输出10.4 字符串流字符串流n字符串流概述字符串流概述nistrstream类的构造函数类的构造函数nostrstream类的构造函数类的构造函数返回首页C+程序设计电子教案第10章流类库与输入输出字符串流概述字符串流概述n字符串流类包括输入字符串流类字符串流类包括输入字符串流类istrstream,输出字符串流类输出字符串流类ostrstream和输入输出字符串和输入输出字符串流类流类strstream三种。它们都被定义在系统头三种。它们都被定义在系统头文件文件strstrea.h中。只要在程序中带有该头文中。只要在程序中带有该头文件,就可以使用任一种字符串流类定义字符串件,就可以使用任一种字符串流类定义字符串流对象。每个字符串流对象简称为字符串流。流对象。每个字符串流对象简称为字符串流。n字符串流对应的访问空间是内存中由用户定义字符串流对应的访问空间是内存中由用户定义的字符数组,而文件流对应的访问空间是外存的字符数组,而文件流对应的访问空间是外存上由文件名确定的文件存储空间。上由文件名确定的文件存储空间。C+程序设计电子教案第10章流类库与输入输出三种字符串流类的构造函数声明格式分别如下:三种字符串流类的构造函数声明格式分别如下:istrstream(const char*buffer);ostrstream(char*buffer,int n);strstream(char*buffer,int 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章流类库与输入输出istrstream类的构造函数类的构造函数istrstream类的构造函数的原型分别是:类的构造函数的原型分别是:istrstream:istrstream(char*s);istrstream:istrstream(char*s,int n);这两个构造函数的第一个参数这两个构造函数的第一个参数s是一个字符指针是一个字符指针或字符数组,使用该串来初始化要创建的流对或字符数组,使用该串来初始化要创建的流对象。第一个构造函数是使用所指定的串的全部象。第一个构造函数是使用所指定的串的全部内容来构造流对象,而第二个构造函数使用串内容来构造流对象,而第二个构造函数使用串中前中前n个字符来构造串对象。个字符来构造串对象。C+程序设计电子教案第10章流类库与输入输出n下面举例说明上述构造函数的用法。下面举例说明上述构造函数的用法。例例10-14:从一个字符串流中输入用逗号分开的每一个整数并显示出从一个字符串流中输入用逗号分开的每一个整数并显示出来。来。#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,4312 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章流类库与输入输出ostrstream类的构造函数类的构造函数ostrstream类的构造函数的原型分别是:类的构造函数的原型分别是: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()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;while(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 返回本节
展开阅读全文