冶金工业出版社高等教育“十一五”规划教材1文件流与文件操作冶金工业出版社高等教育“十一五”规划教材2输入输出流的概念•输入流(InputStream)表示的是数据从输入设备(如键盘、磁盘等)流向内存,输出流(OutputStream)表示的是数据从内存流向输出设备(如屏幕、打印机、磁盘等)。输入输出流(I/OStream)是输入流和输出流的合称。具体如下图所示。输入流输出流冶金工业出版社高等教育“十一五”规划教材3•流是与内存缓冲区相对应的,或者说缓冲区中的数据就是流。•C++将输入输出流(简称I/O流)分成三种类型:•(1)标准输入输出流:流向标准输入输出设备(即键盘、显示器)的数据。•(2)文件输入输出流:流向外存磁盘文件的数据。•(3)字符串输入输出流:对内存中指定的空间(通常用一个字符数组作为存储空间)进行输入输出操作,流向这里的数据。冶金工业出版社高等教育“十一五”规划教材4•C++的输入/输出功能是由流类提供的,C++的流类有两个平行基类:ios、streambuf。其中:streambuf负责缓冲区的处理,提供设置缓冲区、从缓冲区提取字节、向缓冲区插入字节等对缓冲区的低级操作。ios是抽象基类,提供流的高级I/O所需的公共操作。所有流类都是由这两个基类派生出来的。冶金工业出版社高等教育“十一五”规划教材5基流类派生流类示意图(一)一个指针成员指向该类对象iosstreambufistreamostreamifstreamiostreamofstreamfstream冶金工业出版社高等教育“十一五”规划教材6基流类派生流类示意图(二)iosistreamfstreambasestrstreambaseostreamifstreamistrstreamofstreamostrstreamiostreamfstreamstrstream冶金工业出版社高等教育“十一五”规划教材7类库的几个常见流类类名说明声明的头文件抽象流基类ios流基类iostream标准I/O类istream标准输入流和其他输入流的基类ostream标准输出流和其他输出流的基类iostream标准输入输出流和其他I/O流的基类文件I/O类ifstream文件输入流类fstreamofstream文件输出流类fstream文件输入输出流类冶金工业出版社高等教育“十一五”规划教材8有缓冲冶金工业出版社高等教育“十一五”规划教材9•说明:•①cin是编译系统能够直接识别的系统级标准输入流对象,cin变量名…是从输入流中获取数据,这种操作称为“提取”,运算符也就称为提取运算符。•②cout等是编译系统能够直接识别的系统级标准输出流对象,cout数据…是向输出流输出数据,这种操作称为“插入”,类似的,运算符称为插入运算符。冶金工业出版社高等教育“十一五”规划教材10标准输出流•15.2.1输出流对象•在C++中,默认的标准输出设备是屏幕,在iostream头文件已定义了cout、cerr和clog三个输出流对象:•(1)cout:不是C++关键字,是ostream对象,它与插入运算符、输出内容一起构成输出语句,形式为:cout………,能够连续输出多项内容。•(2)cerr:是consoleerror的缩写,表示标准错误流,在屏幕上显示出错信息,其功能、用法与cout类似,不同之处是只能在屏幕上,不能在磁盘文件上写入错误信息。•(3)clog:也是标准错误流,是consolelog的缩写,它的作用与cerr一样,都是在屏幕上显示错误信息。两者之间的差别是:clog带有缓冲区,而cerr不带缓冲区。冶金工业出版社高等教育“十一五”规划教材11•15.2.2格式输出•大多对于输出没有格式要求,所以直接调用cout……形式的输出语句。•格式控制的方法有两种:一种是选用格式控制符,另一种是选用流对象的成员函数。•需要指出的是在VC++6.0中进行格式控制时引用的头文件是iomanip,该文件不仅包含了iostream的全部内容,还包含有控制数据输入/输出格式的内容,所以,可以用iomanip替代iostream。但是在VS2005中iostream的功能有所加强,而iomanip的功能则减弱了,所以在格式控制时使用的仍是iostream,而不是iomanip。冶金工业出版社高等教育“十一五”规划教材12(n)设置输出数据项的位数setfill(c)设置填充字符,通常与setw(n)合用setiosflags(ios::left)设置左对齐方式设置对齐方式setiosflags(ios::internal)设置居中对齐方式setiosflags(ios::right)设置右对齐方式setiosflags(ios::showpos)输出正数时显示“+”号setiosflags(ios::showpoint)强制显示小数点和尾部的0setiosflags(ios::scientific)浮点数以科学记数法显示设置浮点数的显示方式setiosflags(ios::fixed)浮点数以定点数方式显示setpreciion(n)设置精度(有效数字)setiosflags(ios::uppercase)数值用16进制输出时以大写方式显示。(默认为小写方式)resetiosflags(参数)清除参数所进行的设置冶金工业出版社高等教育“十一五”规划教材13•(1)输出不同进制的数:dec(十进制)、hex(十六进制)、oct(八进制)。•(2)设置域宽:setw(n)。当n小于数据的实际宽度时,按数据的实际宽度输出,即这种设置无效;当n大于数据宽度时,多余字符用系统默认填充字符——空格补足。•(3)设置填充字符:setfill(c),需要与setw(n)合用。•(4)设置对齐方式:•setiosflags(ios::left)(左对齐)•setiosflags(ios::right)(右对齐)•(5)强制显示小数点和尾0:setiosflags(ios::showpoint)•(6)设置浮点数的输出是以科学记数法还是定点数。•(7)设置精度(有效数字):setpreciion(n),会自动进行四舍五入。•(8)输出十六进制数时控制英文字母的大小写:setiosflags(ios::uppercase)冶金工业出版社高等教育“十一五”规划教材14(n)setprecision(n)设置实数的精度width(n)setw(n)设置字段的宽度fill(c)setfill(c)设置填充字符setf(格式标志)setiosflags(格式标志)设置输出格式,格式标志形如:ios::~unsetf(格式标志)resetiosflags(格式标志)取消已有的设置,格式标志同上冶金工业出版社高等教育“十一五”规划教材15将数值转换成10进制将数值转换不同进制ios::hex将数值转换成16进制ios::oct将数值转换成8进制ios::left设置左对齐方式设置对齐方式ios::internal设置居中对齐方式ios::right设置右对齐方式ios::showpos输出正数时显示“+”号ios::showpoint强制显示小数点和尾部的0ios::scientific浮点数以科学记数法显示设置浮点数的显示方式ios::fixed浮点数以定点数法显示ios::uppercase数值用16进制输出时以大写方式显示。(默认为小写方式)冶金工业出版社高等教育“十一五”规划教材16•15.2.3用流成员函数put()输出字符•在C++中,还可以利用流成员函数put()(英文单词put的本意是:放,置,指离你而去)直接输出字符,这样就可以不需要插入运算符()参与输出操作。•格式:•put(字符型数据);•功能:只输出一个字符。冶金工业出版社高等教育“十一五”规划教材17标准输入流•15.3.1输入流对象•cin不是C++关键字,而是istream对象,它与提取运算符、变量名或数组名一起构成输入语句,形式为“cin………;”,能够连续输入多项内容。•执行时,系统会将输入内容自动转换为所定义变量或数组的类型,并存放到对应变量或数组中去。•15.3.2用于字符输入的流成员函数•get()有三种形式:•1)不带参数的get()函数•格式:•cin.get()•功能:读入一个字符(包括回车、tab、空格等空白字符)。冶金工业出版社高等教育“十一五”规划教材18•2)带一个参数的get()函数•格式:•cin.get(ch)//这里的ch是用来存放输入字符的变量•功能:还是输入一个字符,并把输入字符放入字符变量中。如果读取成功则返回非0值(真),若失败(如遇到文件结束符)则函数返回0值(假)。•3)带三个参数的get()函数•格式:•cin.get(字符数组,字符个数n[,终止字符])•或•cin.get(字符指针,字符个数n[,终止字符])•功能:从输入流中读取n-1字符,赋给字符数组或字符指针所指向的空间。假设在读取n-1个字符之前遇到终止字符(如果不写,默认为‘\n’),则提前结束。如果成功读取字符串则返回非0,失败则返回0。•利用这种格式,可以输入含空格等空白字符的英文句子。冶金工业出版社高等教育“十一五”规划教材19•2.getline()函数•getline()函数的功能、用法与带三个参数的get()一样,只是它的函数名更容易理解、记忆•格式:•cin.getline(字符数组或字符指针,字符个数n[,终止字符])•功能:与带三个参数的get()功能类似。从输入流中读取n-1字符,赋给字符数组或字符指针所指向的空间。如果在读取n-1个字符之前遇到终止字符(如果不写,默认为‘\n’),则提前结束。冶金工业出版社高等教育“十一五”规划教材20•15.3.3几个与流操作有关的判断函数•在进行流操作时,经常要进行条件判断,熟悉和掌握一些判断函数,可以达到目的。具体如下:•(1)eof()函数:是“endoffile”的缩写,表示“文件结束”。到达文件末尾(即遇到文件结束符)时为“真”,否则为“假”。这个函数使用频率较高。•(2)fail()函数:操作失败时返回“真”,操作成功时返回“假”。•(3)!运算符经过了重载,它的功能与fail()函数相同。例如:!cin与cin.fail()等价;!cout与