C辅导四流和文件.docx
- 文档编号:26161256
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:30
- 大小:31.15KB
C辅导四流和文件.docx
《C辅导四流和文件.docx》由会员分享,可在线阅读,更多相关《C辅导四流和文件.docx(30页珍藏版)》请在冰豆网上搜索。
C辅导四流和文件
C++辅导四
---C++流
一、C++流的概念
在C++语言中,数据的输入和输出(简写为I/O)包括对标准输入设备键盘和标准输出设备显示器、对在外存磁盘上的文件和对内存中指定的字符串存储空间(当然可用该空间存储任何信息)进行输入输出这三个方面。
对标准输入设备和标准输出设备的输入输出简称为标准I/O,对在外存磁盘上文件的输入输出简称为文件I/O,对内存中指定的字符串存储空间的输入输出简称为串I/O。
C++语言系统为实现数据的输入和输出定义了一个庞大的类库,它包括的类主要有ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrstream,strstream等,其中ios为根基类,其余都是它的直接或间接派生类。
ios为根基类,它直接派生四个类:
输入流类istream、输出流类ostream、文件流基类fstreambase和字符串流基类strstreambase,输入文件流类同时继承了输入流类和文件流基类(当然对于根基类是间接继承),输出文件流类ofstream同时继承了输出流类和文件流基类,输入字符串流类istrstream同时继承了输入流类和字符串流基类,输出字符串流类ostrstream同时继承了输出流类和字符串流基类,输入输出流类iostream同时继承了输入流类和输出流类,输入输出文件流类fstream同时继承了输入输出流类和文件流基类,输入输出字符串流类strstream同时继承了输入输出流类和字符串流基类。
“流”就是“流动”,是物质从一处向另一处流动的过程。
C++流是指信息从外部输入设备(如键盘和磁盘)向计算机内部(即内存)输入和从内存向外部输出设备(如显示器和磁盘)输出的过程,这种输入输出过程被形象地比喻为“流”。
为了实现信息的内外流动,C++系统定义了I/O类库,其中的每一个类都称作相应的流或流类,用以完成某一方面的功能。
根据一个流类定义的对象也时常被称为流。
如根据文件流类fstream定义的一个对象fio,可称作为fio流或fio文件流,用它可以同磁盘上一个文件相联系,实现对该文件的输入和输出,fio就等同于与之相联系的文件。
C++系统中的I/O类库,其所有类被包含在iostream.h,fstream.h和strstrea.h这三个系统头文件中,各头文件包含的类如下:
iostream.h包含有:
ios,iostream,istream,ostream,iostream_withassign,
istream_withassign,ostream_withassign等。
fstream.h包含有:
fstream,ifstream,ofstream和fstreambase,以及iostream.h
中的所有类。
Strstrea.h包含有:
strstream,istrstream,ostrstream和strstreambase,以及
iostream.h中的所有类。
在一个程序或一个编译单元(即一个程序文件)中当需要进行标准I/O操作时,则必须包含头文件iostream.h,当需要进行文件I/O操作时,则必须包含头文件fstream.h,同样,当需要进行串I/O操作时,则必须包含头文件strstrea.h。
在一个程序或编译单元中包含一个头文件的命令格式为“#include<头文件名>”,当然若头文件是用户建立的,则头文件名的两侧不是使用尖括号,而是使用双引号。
当系统编译一个C++文件对#include命令进行处理时,是把该命令中指定的文件中的全部内容嵌入到该命令的位置,然后再编译整个C++文件生成相应的目标代码文件。
C++不仅定义有现成的I/O类库供用户使用,而且还为用户进行标准I/O操作定义了四个类对象,它们分别是cin,cout,cerr和clog,其中cin为istream_withassign流类的对象,代表标准输入设备键盘,也称为cin流或标准输入流,后三个为ostream_withassign流类的对象,cout代表标准输出设备显示器,也称为cout流或标准输出流,cerr和clog含义相同,均代表错误信息输出设备显示器。
因此当进行键盘输入时使用cin流,当进行显示器输出时使用cout流,当进行错误信息输出时使用cerr或clog。
在istream输入流类中定义有对右移操作符>>重载的一组公用成员函数,函数的具体声明格式为:
istream&operator>>(简单类型标识符&);
简单类型标识符可以为char,signedchar,unsignedchar,short,unsignedshort,int,unsignedint,long,unsignedlong,float,double,longdouble,char*,signedchar*,unsignedchar*之中的任何一种,对于每一种类型都对应着一个右移操作符重载函数。
由于右移操作符重载用于给变量输入数据的操作,所以又称为提取操作符,即从流中提取出数据赋给变量。
当系统执行cin>>x操作时,将根据实参x的类型调用相应的提取操作符重载函数,把x引用传送给对应的形参,接着从键盘的输入中读入一个值并赋给x(因形参是x的别名)后,返回cin流,以便继续使用提取操作符为下一个变量输入数据。
当从键盘上输入数据时,只有当输入完数据并按下回车键后,系统才把该行数据存入到键盘缓冲区,供cin流顺序读取给变量。
还有,从键盘上输入的每个数据之间必须用空格或回车符分开,因为cin为一个变量读入数据时是以空格或回车符作为其结束标志的。
当cin>>x操作中的x为字符指针类型时,则要求从键盘的输入中读取一个字符串,并把它赋值给x所指向的存储空间中,若x没有事先指向一个允许写入信息的存储空间,则无法完成输入操作。
另外从键盘上输入的字符串,其两边不能带有双引号定界符,若带有只作为双引号字符看待。
对于输入的字符也是如此,不能带有单引号定界符。
在ostream输出流类中定义有对左移操作符<<重载的一组公用成员函数,函数的具体声明格式为:
ostream&operator<<(简单类型标识符);
简单类型标识符除了与在istream流类中声明右移操作符重载函数给出的所有简单类型标识符相同以外,还增加一个void*类型,用于输出任何指针(但不能是字符指针,因为它将被作为字符串处理,即输出所指向存储空间中保存的一个字符串)的值。
由于左移操作符重载用于向流中输出表达式的值,所以又称为插入操作符。
如当输出流是cout时,则就把表达式的值插入到显示器上,即输出到显示器显示出来。
当系统执行cout< 当使用插入操作符向一个流输出一个值后,再输出下一个值时将被紧接着放在上一个值的后面,所以为了让流中前后两个值分开,可以在输出一个值之后接着输出一个空格,或一个换行符,或其他所需要的字符或字符串。 二、输入输出格式控制 1.ios类中的枚举常量 在根基类ios中定义有三个用户需要使用的枚举类型,由于它们是在公用成员部分定义的,所以其中的每个枚举类型常量在加上ios: : 前缀后都可以为本类成员函数和所有外部函数访问。 在三个枚举类型中有一个无名枚举类型,其中定义的每个枚举常量都是用于设置控制输入输出格式的标志使用的。 该枚举类型定义如下: enum{skipws,left,right,internal,dec,oct,hex,showbase, showpoint,uppercase,showpos,scientific,fixed,unitbuf,stdio }; 各枚举常量的含义如下: skipws 利用它设置对应标志后,从流中输入数据时跳过当前位置及后面的所有连续的空白字符,从第一个非空白字符起读数,否则不跳过空白字符。 空格、制表符’\t’、回车符’\r’和换行符’\n’统称为空白符。 缺省为设置。 left,right,internal left在指定的域宽内按左对齐输出,right按右对齐输出,而internal使数值的符号按左对齐、数值本身按右对齐输出。 域宽内剩余的字符位置用填充符填充。 缺省为right设置。 在任一时刻只有一种有效。 dec,oct,hex 设置dec对应标志后,使以后的数值按十进制输出,设置oct后按八进制输出,而设置hex后则按十六进制输出。 缺省为dec设置。 showbase 设置对应标志后使数值输出的前面加上“基指示符”,八进制数的基指示符为数字0,十六进制数的基指示符为0x,十进制数没有基指示符。 缺省为不设置,即在数值输出的前面不加基指示符。 showpoint 强制输出的浮点数中带有小数点和小数尾部的无效数字0。 缺省为不设置。 uppercase 使输出的十六进制数和浮点数中使用的字母为大写。 缺省为不设置。 即输出的十六进制数和浮点数中使用的字母为小写。 showpos 使输出的正数前带有正号“+”。 缺省为不设置。 即输出的正数前不带任何符号。 scientific,fixed 进行scientific设置后使浮点数按科学表示法输出,进行fixed设置后使浮点数按定点表示法输出。 只能任设其一。 缺省时由系统根据输出的数值选用合适的表示输出。 unitbuf,stdio 这两个常量很少使用,所以不予介绍。 在ios中定义的第二个枚举类型为: enumopen_mode{in,out,ate,app,trunc,nocreate,noreplace,binany}; 其中的每个枚举常量规定一种文件打开的方式,在定义文件流对象和打开文件时使用。 在ios中定义的第三个枚举类型为: enumseek_dir{beg,cur,end}; 其中的每个枚举常量用于对文件指针的定位操作上。 2.ios类中的成员函数 ios类提供成员函数对流的状态进行检测和进行输入输出格式控制等操作,每个成员函数的声明格式和简要说明如下: intbad();//操作出错时返回非0值。 inteof();//读取到流中最后的文件结束符时返回非0值。 intfail();//操作失败时返回非0值。 voidclear();//清除bad,eof和fail所对应的标志状态,使之恢复为正常状态值0,使good标志状态恢复为1。 charfill();//返回当前使用的填充字符。 charfill(charc);//重新设置流中用于输出数据的填充字符为c的值,返回此前的填充字符。 系统预设置填充字符为空格。 longflags();//返回当前用于I/O控制的格式状态字。 longflags(longf);//重新设置格式状态字为f的值,返回此前的格式状态字。 intgood();//操作正常时返回非0值,当操作出错、失败和读到文件结束符时均为不正常,则返回0。 intprecision();//返回浮点数输出精度,即输出的有效数字的位数。 intprecision(intn);//设置浮点数的输出精度为n,返回此前的输出精度。 系统预设置的输出精度为6,即输出的浮点数最多具有6位为有效数字。 intrdstate();//操作正常时返回0,否则返回非0值,它与good()正好相反。 longsetf(longf);//根据参数f设置相应的格式化标志,返回此前的设置。 该参数f所对应的实参为无名枚举类型中的枚举常量(又称格式化常量),可以同时使用一个或多个常量,每两个常量之间要用按位或操作符连接。 如当需要左对齐输出,并使数值中的字母大写时,则调用该函数的实参为ios: : left|ios: : uppercase。 longunsetf(longf);//根据参数f清除相应的格式化标志,返回此前的设置。 如要清除此前的左对齐输出设置,恢复缺省的右对齐输出设置,则调用该函数的实参为ios: : left。 intwidth();//返回当前的输出域宽。 若返回数值0则表明没有为刚才输出的数值设置输出域宽,输出域宽是指输出的值在流中所占有的字节数。 intwidth(intw);//设置下一个数据值的输出域宽为w,返回为输出上一个数据值所规定的域宽,若无规定则返回0。 注意: 此设置不是一直有效,而只是对下一个输出数据有效。 因为所有I/O流类都是ios的派生类,所以它们的对象都可以调用ios类中的成员函数和使用ios类中的格式化常量进行输入输出格式控制。 下面以标准输出流对象cout为例说明输出的格式化控制。 程序1: #include voidmain() { intx=30,y=300,z=1024; cout< cout.setf(ios: : oct);//设置为八进制输出 cout< cout.unsetf(ios: : oct); //取消八进制输出设置,恢复按十进制输出 cout.setf(ios: : hex);//设置为十六进制输出 cout< cout.setf(ios: : showbase|ios: : uppercase); //设置基指示符输出和数值中的字母大写输出 cout< cout.unsetf(ios: : showbase|ios: : uppercase); //取消基指示符输出和数值中的字母大写输出 cout< cout.unsetf(ios: : hex); //取消十六进制输出设置,恢复按十进制输出 cout< } 此程序的运行结果如下: 303001024 364542000 1e12c400 0X1E0X12C0X400 1e12c400 303001024 程序2: #include voidmain() { intx=468; doubley=-3.425648; cout<<"x="; cout.width(10);//设置输出下一个数据的域宽为10 cout< cout<<"y="; cout.width(10);//设置输出下一个数据的域宽为10 cout< cout.setf(ios: : left);//设置按左对齐输出 cout<<"x="; cout.width(10); cout< cout<<"y="; cout.width(10); cout< cout.fill('*');//设置填充字符为'*' cout.precision(3);//设置浮点数输出精度为3 cout.setf(ios: : showpos);//设置正数的正号输出 cout<<"x="; cout.width(10); cout< cout<<"y="; cout.width(10); cout< } 此程序运行结果如下: x=468y=-3.42565 x=468y=-3.42565 x=+468******y=-3.43***** 程序3: #include voidmain() { floatx=25,y=-4.762; cout< cout.setf(ios: : showpoint);//强制显示小数点和无效0 cout< cout.unsetf(ios: : showpoint);//恢复缺省输出 cout.setf(ios: : scientific);//设置按科学表示法输出 cout< cout.setf(ios: : fixed);//设置按定点表示法输出 cout< } 程序运行结果如下: 25-4.762 25.0000-4.76200 2.500000e+001-4.762000e+000 25-4.762 3.格式控制操作符 数据输入输出的格式控制还有更简便的形式,就是使用系统头文件iomanip.h中提供的操纵符。 使用这些操纵符不需要调用成员函数,只要把它们作为插入操作符<<(个别作为提取操作符>>)的输出对象即可。 这些操纵符及功能如下: dec//转换为按十进制输出整数,它也是系统预置的进制。 oct//转换为按八进制输出整数。 hex//转换为按十六进制输出整数。 ws//从输入流中读取空白字符。 endl//输出换行符’\n’并刷新流。 刷新流是指把流缓冲区的内容立即写入到对应的物理设备上。 ends//输出一个空字符’\0’。 flush//只刷新一个输出流。 setiosflags(longf)//设置f所对应的格式化标志,功能与setf(longf)成员函数相同,当然输出该操纵符后返回的是一个输出流。 如采用标准输出流cout输出它时,则返回cout。 对于输出每个操纵符后也都是如此,即返回输出它的流,以便向流中继续插入下一个数据。 resetiosflags(longf)//清除f所对应的格式化标志,功能与unsetf(longf)成员函数相同。 当然输出后返回一个流。 setfill(intc)//设置填充字符为ASCII码为c的字符。 setprecision(intn)//设置浮点数的输出精度为n。 setw(intw)//设置下一个数据的输出域宽为w。 在上面的操纵符中,dec,oce,hex,endl,ends,flush和ws除了在iomanip.h中有定义外,在iostream.h中也有定义。 所以当程序或编译单元中只需要使用这些不带参数的操纵符时,可以只包含iostream.h文件,而不需要包含iomanip.h文件。 下面以标准输出流对象cout为例,说明使用操作符进行的输出格式化控制。 程序4: #include //因iomanip.h中包含有iostream.h,所以该命令可省略 #include voidmain() { intx=30,y=300,z=1024; cout< cout< cout< cout< : showbase|ios: : uppercase); //设置基指示符和数值中的字母大写输出 cout< cout< : showbase|ios: : uppercase); //取消基指示符和数值中的字母大写输出 cout< cout< } 此程序的功能和运行结果都与程序1完全相同。 程序5: #include #include voidmain() { intx=468; doubley=-3.425648; cout<<"x="< cout<<"y="< cout< : left);//设置按左对齐输出 cout<<"x="< cout<<"y="< cout< cout< cout< : showpos);//设置正数的正号输出 cout<<"x="< cout<<"y="< cout< : left|ios: : showpos); cout< } 此程序的功能和运行结果完全与程序2相同。 程序6: #include voidmain() { floatx=25,y=-4.762; cout< cout< : showpoint); cout< cout< : showpoint); cout< : scientific); cout< cout< : fixed); cout< } 此程序的功能和运行结果也完全与程序3相同。 三、文件操作 1.文件的概念 以前进行的输入输出操作都是在键盘和显示器上进行的,通过键盘向程序输入待处理的数据,通过显示器输出程序运行过程中需要告诉用户的信息。 键盘是C++系统中的标准输入设备,用cin流表示,显示器是C++系统中的标准输出设备,用cout流表示。 数据的输入和输出除了可以在键盘和显示器上进行之外,还可以在磁盘上进行。 磁盘是外部存储器,它能够永久保存信息,并能够被重新读写和携带使用。 所以若用户需要把信息保存起来,以便下次使用,则必须把它存储到外存磁盘上。 在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名,并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目录之下。 一个文件名由文件主名和扩展名两部分组成,它们之间用圆点(即小数点)分开,扩展名可以省略,当省略时也要省略掉前
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 辅导四流和文件 辅导 和文
![提示](https://static.bdocx.com/images/bang_tan.gif)