c++第8章.ppt
计算机科学与技术学院计算机科学与技术学院第第八八章章 C+I/O C+I/O流标准库流标准库1 1计算机科学与技术学院计算机科学与技术学院8.1 C+I/O8.1 C+I/O流概述流概述oI/OI/O流流 外部设备外部设备和计算机内存之间流动的一系列字节。和计算机内存之间流动的一系列字节。输入时输入时,字节从输入设备(如从键盘、磁盘等),字节从输入设备(如从键盘、磁盘等)流向内存流向内存;输出输出时时,字节从内存流向输出设备(如显示器、,字节从内存流向输出设备(如显示器、打印机、磁盘等)。打印机、磁盘等)。2 2计算机科学与技术学院计算机科学与技术学院oC+I/OC+I/O流类流类库库3 3iosistreamiostreamostreamifstreamfstreamofstream计算机科学与技术学院计算机科学与技术学院I/OI/O流类列表流类列表 4 4类名类名说明说明包含文件包含文件iosios流的抽象基类流的抽象基类iostream.hiostream.histreamistream(ostream)(ostream)通用输入通用输入(输出输出)流类和其他流类和其他输入输入(输出输出)流的基类流的基类iostream.hiostream.hifstreamifstream(ofstream)(ofstream)输入输入(输出输出)文件流类文件流类fstream.hfstream.hiostreamiostream通用输出通用输出/输出流类和其他输出流类和其他输出输出/输出流的基类输出流的基类iostream.hiostream.hfstreamfstream输入输入/输出文件流类输出文件流类fstream.hfstream.h计算机科学与技术学院计算机科学与技术学院o预定义的预定义的I/OI/O流类对象流类对象 cincin:istream istream 类的对象,处理标准输入设备的输入。类的对象,处理标准输入设备的输入。coutcout:ostream ostream 类的对象,处理标准输出设备的输类的对象,处理标准输出设备的输出。出。cerrcerr:ostream ostream 类的对象,处理在标准输出设备上类的对象,处理在标准输出设备上输出错误信息输出错误信息(非缓冲)。(非缓冲)。clogclog:ostream ostream 类的对象,处理在标准输出设备上类的对象,处理在标准输出设备上输出错误信息输出错误信息(缓冲)(缓冲)。5 5计算机科学与技术学院计算机科学与技术学院o重载的通用的流算符重载的通用的流算符 (提取运算符):输入,从流中获取数据到内存。(提取运算符):输入,从流中获取数据到内存。(插入运算符):输出,将内存数据添加到流中。(插入运算符):输出,将内存数据添加到流中。6 6 1 1、“读读”、“输入输入”、“提取提取”表示的是同样的含义表示的是同样的含义,即即把数据从外部设备传到计算机内存把数据从外部设备传到计算机内存。2 2、“写写”、“输出输出”、“插入插入”表示的是同样的含义表示的是同样的含义,即即把数据从计算机内存传到外部设备把数据从计算机内存传到外部设备。注意注意输入和输出的方向是以内存为核心注意注意计算机科学与技术学院计算机科学与技术学院磁盘文件磁盘文件简介简介o文件:文件:C C+把每个文件都看成是一个有序的字节序列,把每个文件都看成是一个有序的字节序列,每个每个文件文件都以都以文件结束文件结束标志标志终结终结。o按照文件中数据的组织形式可把文件分为:按照文件中数据的组织形式可把文件分为:n文本文件文本文件:文件中信息形式为:文件中信息形式为ASCIIASCII码字符,每个码字符,每个字符占字符占一个一个字节字节。(每个汉字两个字节)。(每个汉字两个字节)n二进制二进制文件文件:文件中信息的形式与其在内存中的形:文件中信息的形式与其在内存中的形式相同。式相同。7 7计算机科学与技术学院计算机科学与技术学院o文件的读写方式:文件的读写方式:n顺序方式:顺序方式:按数据在文件中的物理排列顺序依次读或写。按数据在文件中的物理排列顺序依次读或写。n随机方式:随机方式:在文件的任何位置进行读或写。在文件的任何位置进行读或写。8 8计算机科学与技术学院计算机科学与技术学院输出流输出流9 9计算机科学与技术学院计算机科学与技术学院1 1、定义文件输出流对象、定义文件输出流对象方法方法1 1:定义输出流类对象:定义输出流类对象,调用调用openopen成员成员函数使函数使对象和文件建立关联。对象和文件建立关联。例:例:ofstream ofstream outfile outfile;/创建创建文件文件输出流类对象输出流类对象 outfile.openoutfile.open(e:datal.txt(e:datal.txt,ios,ios:out);:out);/使流对象与文件建立联系(打开文件使流对象与文件建立联系(打开文件)方法方法2 2:在定义输出流类:在定义输出流类对象的同时与文件建立关对象的同时与文件建立关联联例例:ofstream ofstream outfile outfile(e:datal.txt(e:datal.txt,ios,ios:out);:out);1010计算机科学与技术学院计算机科学与技术学院2 2、向、向输出流插入数据输出流插入数据1)1)使用使用输出流插入运算符(输出流插入运算符()流流类库中重载的运算符类库中重载的运算符返回了对其左操作对象的返回了对其左操作对象的引引用用,因此在一条语句中可以连续使用,因此在一条语句中可以连续使用 例例.coutx=3.52coutx=3.52 n;n;1111计算机科学与技术学院计算机科学与技术学院例例1 1 使用插入运算符(使用插入运算符()向文本文件写入信息。)向文本文件写入信息。1212#include#include#include#include void main()void main()ofstream ofstream fout fout(e:test1.txt);(e:test1.txt);if(!fout)if(!fout)coutCannot open the file!endl;coutCannot open the file!endl;exit(1);exit(1);foutThe contents of the file:endl;foutThe contents of the file:endl;foutOOP is not difficult to learn,endl;foutOOP is not difficult to learn,endl;foutas long as you have this book.endl;foutas long as you have this book.endl;fout.close();fout.close();/关闭文件关闭文件 在对打开的文件的写操作完成后,在对打开的文件的写操作完成后,应调用应调用close()close()成员函数关闭该文件。成员函数关闭该文件。计算机科学与技术学院计算机科学与技术学院例例2.2.把从键盘输入的把从键盘输入的1010个整数按由大到小顺序写入文本文件。个整数按由大到小顺序写入文本文件。1313计算机科学与技术学院计算机科学与技术学院2)2)使用使用输出流类成员函数输出流类成员函数put()put()输出字符。输出字符。1414例例 cout.put(H).cout.put(H).put(iput(i).).put(!)endl;put(!)endl;计算机科学与技术学院计算机科学与技术学院文件输出代码框架文件输出代码框架1515 1 1、创建文件流对象、创建文件流对象 2 2、将文件流对象和磁盘文件进行关联、将文件流对象和磁盘文件进行关联(open)(open)3 3、判断关联是否成功、判断关联是否成功 3 3、文件操作、文件操作(输出输出:,get,getline,get,getline)4 4、关闭文件流对象、关闭文件流对象(close)(close)记忆记忆计算机科学与技术学院计算机科学与技术学院1616计算机科学与技术学院计算机科学与技术学院1 1、定义、定义文件文件输入流对象输入流对象 从从一个磁盘文件输入前,需要定义一个一个磁盘文件输入前,需要定义一个ifstreamifstream类的对象(输入流对象)类的对象(输入流对象)。方法。方法主要有两种:主要有两种:方法方法1 1:先定义:先定义文件流对象文件流对象,然后然后调用调用openopen成员成员函函数与文件建立关联。数与文件建立关联。方法方法2 2:在定义:在定义文件流对象的同时文件流对象的同时打开相关联的打开相关联的文件文件 1717例:例:ifstream ifstream infile infile;/;/建立文件输入流对象建立文件输入流对象 infile.open(infile.open(e e:datal.txt,iosdatal.txt,ios:in);:in);/打开文件,使流对象与文件建立联系打开文件,使流对象与文件建立联系例:例:ifstream ifstream infile(infile(e e:datal.txtdatal.txt,ios,ios:in);:in);计算机科学与技术学院计算机科学与技术学院2 2、从、从输入流提取输入流提取数据数据 1 1)使用输入流提取)使用输入流提取运算符运算符()空格符、回车符作为数据间的分割符。若遇到输入的空格符、回车符作为数据间的分割符。若遇到输入的数据类型有错或文件结束符时,提取工作将终止。数据类型有错或文件结束符时,提取工作将终止。1818#include#include#include#include void void main main()()ifstream ifstream fin fin(e:test1.txt);(e:test1.txt);char char one64,two64,three64 one64,two64,three64;if(!fin)if(!fin)exit(1 exit(1););finone;finone;finfintwo;two;finfinthree;three;cout coutonentwoonentwon;n;cout coutthreen;threen;fin.close();/fin.close();/关闭关闭文件文件 设设文本文件文本文件test1.txttest1.txt的内容为:的内容为:The contents of the file:The contents of the file:OOP is not difficult to learn,OOP is not difficult to learn,as long as you have this book.as long as you have this book.程序输出结果:程序输出结果:The The contents contents of of计算机科学与技术学院计算机科学与技术学院例例2.2.读取前面写入文本文件读取前面写入文本文件f1.txtf1.txt的的1010个整数,并将它们显示在个整数,并将它们显示在屏幕上。屏幕上。1919计算机科学与技术学院计算机科学与技术学院2 2)使用输入流类成员函数)使用输入流类成员函数get()get()读入一个读入一个字符字符o不带参数的不带参数的get()get()函数。从输入流中读取一个字符,并函数。从输入流中读取一个字符,并把该字符作为函数返回值,若遇文件结束符,返回把该字符作为函数返回值,若遇文件结束符,返回EOFEOF。例例 char c;char c;while while(c=cin.get()!=EOF)(c=cin.get()!=EOF)cout.put(c);cout.put(c);o有有一个参数的一个参数的get()get()函数。下例中,从输入流中读取一函数。下例中,从输入流中读取一个字符赋给个字符赋给c c,若遇文件结束符,返回,若遇文件结束符,返回0 0,否则返回非,否则返回非0 0。例例 char c;while(cin.get(c)char c;while(cin.get(c)cout.put(c);cout.put(c);2020计算机科学与技术学院计算机科学与技术学院o使用输入流类成员函数使用输入流类成员函数get()get()和和getline()getline()读入字符读入字符串。这两个函数的调用形式串。这两个函数的调用形式为:为:输入流对象输入流对象.get(.get(字符地址字符地址,字符个数字符个数n,n,终止字符终止字符););输入流对象输入流对象.getline(.getline(字符地址字符地址,字符个数字符个数n,n,终止字符终止字符););从从输入流读取输入流读取n-1n-1个字符(若遇终止字符提前结束),个字符(若遇终止字符提前结束),在其后在其后加入加入00,存放在由字符地址指向的内存空间。终存放在由字符地址指向的内存空间。终止字符的缺省值止字符的缺省值为为nn 。它们的差别是:。它们的差别是:get()get()使终止字符使终止字符保留在输入流中,而保留在输入流中,而getline()getline()把终止字符从输入流中删除。把终止字符从输入流中删除。2121计算机科学与技术学院计算机科学与技术学院2222#include#include#include#include void main()void main()ifstream ifstream fin fin(e:test1.txt);(e:test1.txt);char char s164s164,s264,s364;,s264,s364;if(!fin)exit(1);if(!fin)exit(1);fin.getline(s1,sizeof(s1);fin.getline(s1,sizeof(s1);fin.getline(s2,sizeof(s2);fin.getline(s2,sizeof(s2);fin.getline(s3,sizeof(s3);fin.getline(s3,sizeof(s3);couts1ns2 couts1ns2n n cout couts3endl;s3endl;fin.close();fin.close();设文本文件设文本文件test1.txttest1.txt的内容为:的内容为:The contents of the file:The contents of the file:OOP is not difficult to learn,OOP is not difficult to learn,as long as you have this book.as long as you have this book.程序输出结果:程序输出结果:The contents of the file:The contents of the file:OOP is not difficult to learn,OOP is not difficult to learn,as long as you have this book as long as you have this book.例例2 2 使用成员函数使用成员函数getline()getline()从文本文件读信息。从文本文件读信息。计算机科学与技术学院计算机科学与技术学院2323#include#include#include#include void main()void main()ifstream ifstream fin fin(e:test1.txt);(e:test1.txt);char char line64 line64;if(!fin)exit(1);if(!fin)exit(1);while(!fin.eof()while(!fin.eof()fin.getline(line,sizeof(line);fin.getline(line,sizeof(line);coutlinen;coutlinen;fin.close();fin.close();例例3 3 使用成员函数使用成员函数getline()getline()从文本文件读信息。从文本文件读信息。本例适用于本例适用于getlinegetline调用次数未知调用次数未知注意注意从从输入流读数据时,若遇输入流读数据时,若遇文件结束符,成员函数文件结束符,成员函数eofeof()()函数值为非函数值为非0 0,否则为,否则为0 0。计算机科学与技术学院计算机科学与技术学院格式化输入输出格式化输入输出o格式化格式化输入输出是指控制文本模式输入输出是指控制文本模式I/OI/O流的格流的格式。例如,设置字段宽度、对齐方式、输出数式。例如,设置字段宽度、对齐方式、输出数字的精度等。字的精度等。C+C+提供两种进行格式化输入提供两种进行格式化输入 输出的方法输出的方法:o用用iosios类的类的成员函数成员函数设置格式设置格式o使用使用格式格式操纵算子操纵算子格式格式成员函数和格式操纵算子详细情况见书。成员函数和格式操纵算子详细情况见书。2424计算机科学与技术学院计算机科学与技术学院格式化输出成员格式化输出成员函数示例函数示例2525#include#include void main()void main()cout0123456789012345n;cout0123456789012345n;/显示字符位置显示字符位置 cout1234endl;cout1234endl;cout.width(12);cout.width(12);/设置输出宽度设置输出宽度 cout1234endl;cout1234endl;/缺省右对齐缺省右对齐 cout.fill cout.fill(*);(*);/设置填充符设置填充符 cout1234endl;cout1234endl;cout.flags(ios:left);cout.flags(ios:left);/左对齐输出左对齐输出 cout.width(12);cout.width(12);cout1234endl;cout1234endl;cout.flags(ios:right cout.flags(ios:right);/);/左对齐输出左对齐输出 cout.width(12);cout.width(12);cout1234endl;cout1234endl;cout.precision(5);cout.precision(5);/设置有效数字位数设置有效数字位数 cout123.45678endl;cout123.45678endl;成员函数成员函数width()width()只对一个输出项有效。只对一个输出项有效。01234567890123451234 123412341234*1234123.46计算机科学与技术学院计算机科学与技术学院操纵操纵算子示例算子示例2626#include#include#include#include void main()void main()cout0123456789012345 n;cout0123456789012345 n;coutsetw(12)setfill(*)1234endl;coutsetw(12)setfill(*)1234endl;coutsetw(12)setiosflags(ios:left)1234endl;coutsetw(12)setiosflags(ios:left)1234endl;coutsetw(12)resetiosflags(ios:left)1234endl;coutsetw(12)resetiosflags(ios:left)1234endl;cout coutsetw(12)setfillsetw(12)setfill($)($)coutsetprecision(5)coutsetprecision(5)12.34567endl;12.34567endl;0123456789012345*1234 1234*1234$12.346