第十一章 输入输出流_第1页
第十一章 输入输出流_第2页
第十一章 输入输出流_第3页
第十一章 输入输出流_第4页
第十一章 输入输出流_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、114:14第十一章第十一章 输入输出流输入输出流214:14主要内容主要内容n 输出流输出流n 输入输入流流n 输入输出流输入输出流314:14流流n 数据在程序和设备之间数据在程序和设备之间“流动流动”n 流的实质:字节序列流的实质:字节序列逻辑逻辑设备设备内部内部程序程序数据数据输入流输入流输出流输出流数据数据逻辑逻辑设备设备414:14n 文件:一文件:一个个逻辑设备逻辑设备对应一个对应一个文件文件v 磁盘文件磁盘文件v 显示器、键盘、打印机、通信端口显示器、键盘、打印机、通信端口n 流对象:流对象:v 程序用程序用流对象流对象与某个与某个文件文件(逻辑设备)对象(逻辑设备)对象建立建

2、立连接连接v 程序程序操作流对象操作流对象,流对象通过文件系统对所连接的,流对象通过文件系统对所连接的文件文件对象产生作用对象产生作用。v cin、cout、cerr、clogn 读读操作:操作:(从流中)提取数据(从流中)提取数据n 写操作:写操作:(向流中)插入数据。(向流中)插入数据。514:14I/O流类的层次流类的层次流流类类体系体系iosistreamiostreamostreamstreambufifstreamistringstreamofstreamostringstreamfstreamfilebuf标准输入流类标准输入流类标准标准输出流输出流类类标准标准输入输入/输出流输

3、出流类类标准标准缓冲缓冲流类流类614:14缓冲区缓冲区逻辑逻辑设备设备内部内部程序程序数据数据输入流输入流输出流输出流数据数据逻辑逻辑设备设备内存缓冲区内存缓冲区内存缓冲区内存缓冲区引入缓冲的引入缓冲的目的目的: 解决解决CPUCPU的运行速度和外设操作的运行速度和外设操作速度不速度不匹配匹配的矛的矛盾。如输出时先写入缓冲区,再成批输出盾。如输出时先写入缓冲区,再成批输出。 成批成批写出数据比一个一个写出数据节约时间。写出数据比一个一个写出数据节约时间。一般地,缓冲区在内存中。一般地,缓冲区在内存中。714:14n 缓冲区示例:缓冲区示例:int mai() int a, b;cinab;c

4、outabc;cout“c=“cendl;输入:12 34 xyz输出:12 34c=x原因:输入数据放在缓冲区中814:14 输出流输出流n 三三个输出流:个输出流:v ostream,标准输出流,标准输出流v ofstream,文件输出流,文件输出流v ostringstream,字符串输出流,字符串输出流n 标准输出流对象(包含标准输出流对象(包含iostream头文件头文件),c+已经已经定义定义v cout :标准输出:标准输出 ,可以重定向,可以重定向v cerr :标准:标准错误输出,没有缓冲,发送给它的内容立即错误输出,没有缓冲,发送给它的内容立即被输出被输出。(不可重定向)。

5、(不可重定向)v clog :类似于:类似于cerr,但是有缓冲,缓冲区满时被输出,但是有缓冲,缓冲区满时被输出。(不可重定向)(不可重定向)914:14标准输出流标准输出流n ostream类中重载了类中重载了运算符运算符v 插入插入()运算符是所有运算符是所有标准标准C+数据类型预先设计的。数据类型预先设计的。v 用于传送字节到一个输出流对象。用于传送字节到一个输出流对象。编译器会编译器会将将 coutxy; 解释成解释成 (cout.operator(x) .operator(y); 返回返回 cout1014:14缺省输出格式缺省输出格式n 不同类型数据的输出有其缺省的不同类型数据的输

6、出有其缺省的(默认的默认的)输出格式输出格式:v 整型整型数:十进制、域宽为数:十进制、域宽为0、右对齐右对齐、空格填充空格填充。v 实数实数:精度:精度6位、浮点输出位、浮点输出、 域域宽为宽为0、右对齐、空格填充、右对齐、空格填充。 若若整数部分超过整数部分超过7 位或位或在小数点后第在小数点后第4 位位之后,自之后,自动动转为科学计数法格式输出转为科学计数法格式输出。v 字符(字符(char类型):类型):域宽为域宽为0、右对齐、空格填充。、右对齐、空格填充。 v 字符串字符串( char * 类型):类型):域宽为域宽为0、右对齐、空格填充。、右对齐、空格填充。 v bool类型:类型

7、:true则输出则输出1,false 输出输出0若数的实际宽度超过域宽,若数的实际宽度超过域宽,则按实际长度输出。则按实际长度输出。1114:14double y1=1414.25543543;double y2=0.0000005245;double *p=&y1;char *c=Nothing is impossible!;cout“y1=”y1,“y2=”y2endl;coutp=p,*p=*pendl;coutc=cendl;1214:14格式化输出格式化输出n 控制输出格式化的方法控制输出格式化的方法v 操纵符操纵符算子算子 (头文件(头文件)v 成员成员函数函数1314:14n 输

8、出宽度输出宽度v 为了调整输出,可以通过在流中放入为了调整输出,可以通过在流中放入setw操纵符或调用操纵符或调用width成员函数为每个项指定输出宽度成员函数为每个项指定输出宽度。v 只只对紧随其后的数据产生作用,然后恢复默认值对紧随其后的数据产生作用,然后恢复默认值n 用成员函数用成员函数width()()#include using namesoace std;int main() double values = 1.23,35.36,653.7,4358.24; for(int i=0;i4;i+) cout.width(10); cout valuesi n; 1414:14v 用用

9、setw()指定宽度指定宽度#include #include using namespace std;int main() double values=1.23,35.36,653.7,4358.24; char *names=Zoot,Jimmy,Al,Stan; for(int i=0;i4;i+) coutsetw(6)namesi setw(10)valuesi endl; 1514:14n 对齐方式等对齐方式等:参见:参见教材教材n 精度设置:精度设置:v 默认情况下,浮点数的输出精度为默认情况下,浮点数的输出精度为6(6位有效数字位有效数字)v 用用 setprecision(

10、n )/设为设为 n 位有效数字位有效数字v 例外:例外:1) 用用setioflags(ios_base:fixed):设置为定点数输出:设置为定点数输出2) 用用setioflags(ios_base:scientific):设置为科学计数法输出:设置为科学计数法输出 上述两种情况,则设置的精度表示的是上述两种情况,则设置的精度表示的是小数点后的位数小数点后的位数。1614:14#include #include using namespace std;int main(int argc, char *argv) /浮点数、定点数、科学计数法输出精度的控制浮点数、定点数、科学计数法输出精度

11、的控制 double x1=31.415926,x2=0.00031415926; coutx1=x1 x2=x2endl; coutsetprecision(5)x1=x1 x2=x2endl; coutsetiosflags(ios_base:fixed)setprecision(4)x1=“x1 x2=x2endl; coutresetiosflags(ios_base:fixed)setiosflags(ios_base:scientific)x1=x1 x2=x2endl; return 0;1714:14n 运行结果运行结果v 默认精度默认精度6(有效数字)(有效数字)v 设置精度

12、设置精度5(有效数字)(有效数字)v 定点数输出,精度定点数输出,精度4(小数点后(小数点后4位)位)v 科学计数法输出,精度科学计数法输出,精度4 (小数点后(小数点后4位)位)1814:14n 在在ostream类中定义了一些公有成员函数,用于类中定义了一些公有成员函数,用于输出输出v ostream & ostream:put(char );/输出一个字符输出一个字符v ostream & ostream:write(const char *, int);/输出输出n个字符个字符v ostream& flush( ); /刷新输出流刷新输出流 例:例:int i=97; cout.put

13、( char(i) ); char c=*; cout.put( c ).put(c); cout.write(abcd, 2);运行结果:运行结果:a a* * *abab1914:14字符串输出流字符串输出流n 字符串流(头文件字符串流(头文件)v 字符串字符串流流对象对象可以可以连接连接string对象或对象或字符串字符串v 字符串字符串流提取数据时对字符串按变量类型解释;插入数据时流提取数据时对字符串按变量类型解释;插入数据时把其他类型数据把其他类型数据转换成转换成字符串字符串v 字符串字符串流流I/OI/O具有格式化具有格式化功能功能v 继承继承自自istream,故具有,故具有is

14、tream类的所有成员函数类的所有成员函数n 字符串输出流对象字符串输出流对象v ostringstream outs;2014:14#include#include using namespace std;int main(int argc, char *argv)ostringstream outs;/outs为字符串输出流对象为字符串输出流对象int a=20,b=5,c;string s1=you are welcomen;string s2=a+b=;outss1s2a+b=(a+b)endl; coutouts.str();/返回返回string 对象对象const char *p

15、tr=outs.str().c_str();/得到得到string的的char *coutptr;return 0;2114:14文件输出流文件输出流n 文件:文件:v 磁盘文件磁盘文件v 设备设备n 磁盘文件:磁盘文件:v 文本文件:文本文件:存放存放的是的是“文本流文本流”- 一串一串 ASCII 字符字符v 二进制二进制文件文件:存放存放的是的是“二进制流二进制流” - 按按内存的二进制格式存放(内存映象内存的二进制格式存放(内存映象)n 在在“流流”中的数据是以字节为单位的。中的数据是以字节为单位的。n 文件文件操作:对操作:对文件中的内容进行文件中的内容进行读读/写写。2214:14

16、n 文件使用(操作的基本过程):文件使用(操作的基本过程):v 定义定义一个文件流对象一个文件流对象v 打开打开文件文件v 对对文件进行文件进行读读/写写操作操作v 关闭文件关闭文件n 1、输出文件流对象(不同于标准输出流对象、输出文件流对象(不同于标准输出流对象cout,文件输出流对象需自己定义)文件输出流对象需自己定义):( #include )v ofstream outFile1; /outFile调用调用ofstream 类的默认构造函数类的默认构造函数v ofstream outFile2(“a.txt”);/,调用带参的构造函数,调用带参的构造函数,outFile2对对象与当前目

17、录下的象与当前目录下的a.txt文件建立联系,则通过文件建立联系,则通过outFile2对对a.txt文件进行写操文件进行写操作作2314:14n 2、打开文件、打开文件 (open函数)函数)v void ofstream:open(const char *, int=ios:out, int=filebuf:openprot);1) 参数参数1:文件名(可给出文件的相对路径、绝对路径):文件名(可给出文件的相对路径、绝对路径)2) 参数参数2:文件的打开方式:文件的打开方式 open_mode3) 参数参数3:打开文件时:打开文件时 的保护方式的保护方式v 如如: 1) outFile1(

18、“e:cplusa.txt”, ios_base:out|ios_base:app) 将将e:cplusa.txt文件与文件与outFile1对象关联,该文件作为输出文件且对象关联,该文件作为输出文件且 以以追加(在文件尾添加)的方式打开追加(在文件尾添加)的方式打开注意文件路径注意文件路径 必须用双斜线(转义字符)必须用双斜线(转义字符)2414:14v 文件的打开方式:文件的打开方式:1) 见书见书p488(郑莉版):表(郑莉版):表11-22) 尤其关注:尤其关注: ios_base:app/追加追加 ios_base:trunc/如为已有的文件,先删除其中的内容(默认)如为已有的文件,

19、先删除其中的内容(默认) ios_base:ate /打开已有的文件,并移动文件指针到文件尾打开已有的文件,并移动文件指针到文件尾 ios_base:binary /以二进制模式打开(默认文本文件)以二进制模式打开(默认文本文件)3) 可用可用 | 运算符,组合多种模式运算符,组合多种模式 2514:14n 3、对文件的写操作(输出)、对文件的写操作(输出)v int x=123;v outFile2“Hello !“x; /Hello !123已写入已写入a.txt文件文件在对文件进行读写时,我们将文件看成在对文件进行读写时,我们将文件看成字节流字节流文件流文件流 读写位置指针读写位置指针随

20、着文件的读写,指针移动。随着文件的读写,指针移动。 2614:14n 4.close()函数函数v 切断输出文件流与指定磁盘文件间的关联切断输出文件流与指定磁盘文件间的关联v 文件读写完毕必须关闭文件读写完毕必须关闭v 若流对象的生存期没有结束若流对象的生存期没有结束,该流对象可重新关联一个,该流对象可重新关联一个新文件新文件v 如:如:1) outFile2.close();/切断与切断与a.txt的联系的联系2) outFile2.open( “e:cplusb.txt”);/与与b.txt关联关联2714:14文本文件的写操作文本文件的写操作n 文本文件的特点文本文件的特点v 是默认是默

21、认方式方式打开打开v 用用文本文件流进行读文本文件流进行读/ /写写操作操作v 是是顺序存取顺序存取文件(从头到尾依次读写)文件(从头到尾依次读写)v 支持格式化输入输出(如同标准输入输出的格式化控制)支持格式化输入输出(如同标准输入输出的格式化控制)2814:14 int main()() ofstream ost ; ost.open ( d:my2.dat ) ; ost 1234567890 endl ; int a = 123 ; ost a endl ; ost setw ( 10 ) a endl ; ost resetiosflags ( ios : right ) setio

22、sflags ( ios : left ) setfill ( # ) setw ( 10 ) a endl ; ost resetiosflags ( ios : left ) setiosflags ( ios : right ) setprecision ( 5 ) setw ( 10 ) 12.34567890 endl ; ost . close ( ) ; return 0;1234567890123 123123#12.3462914:14二进制文件的写操作二进制文件的写操作n 二进制文件的特点:二进制文件的特点:v 以以基本类型数据在内存的基本类型数据在内存的二进制表示形式二进

23、制表示形式存放存放数据数据v 不对不对写入或读出的数据做格式转换写入或读出的数据做格式转换 (非格式化读非格式化读/ /写写)v 二进制二进制文件的读写方式由文件的读写方式由程序控制程序控制v 用用binarybinary方式打开方式打开v 随机存取随机存取文件,可以在指定位置读文件,可以在指定位置读/ /写写v 不能不能用用运算符运算符ios_base:begios_base: endios_base:cur3014:14n 可无格式输出的成员函数:可无格式输出的成员函数:v ostream & ostream : put ( char c ) ;1)1) 作用:向流插入一个字节数据作用:向

24、流插入一个字节数据v ostream & ostream : write ( char * buf , int n ) ;1)1) 作用:向流插入作用:向流插入 buf buf 指向的单元中,由指向的单元中,由第二个参数指定第二个参数指定数目的字节数据数目的字节数据char * s = string buffer ;cout . write ( s , strlen ( s ) ) ;/ 插入一串字符插入一串字符cout . put ( n ) ;/ 插入一个插入一个新换行符新换行符3114:14n 二进制文件的输出示例(书二进制文件的输出示例(书p489(郑莉版)(郑莉版):例例11-5)s

25、truct Date int m,d,y; ;int main() Date dt2=6,10,92,3,1,98;ofstream tfile(date.dat,ios_base:binary); tfile.write(char *) &dt, sizeof(dt); tfile.close();3214:14输入流输入流n 三个输入流:三个输入流:v 标准标准输入流:输入流:istreamv 文件输入流:文件输入流:fstreamv 字符串输入流:字符串输入流:istringstream3314:14标准输入流对象标准输入流对象n cin:v 带缓冲的输入流对象,带缓冲的输入流对象,当输

26、入一行结束按回车(当输入一行结束按回车(Enter)时时,操作系统,操作系统将输入内容放入输入将输入内容放入输入缓冲区缓冲区v 然后然后 cin 从输入缓冲区提取数据从输入缓冲区提取数据。n 输入数据输入数据的类型必须与提取数据的变量类型的类型必须与提取数据的变量类型一致一致n 输入数据输入数据时,在缺省的情况下,数据之间的分隔符时,在缺省的情况下,数据之间的分隔符为为:v 键(空格键键(空格键)v 键(制表键键(制表键)v 键(回车键键(回车键)v 上述三上述三个键通称个键通称为为 空白字符空白字符3414:14标准输入流标准输入流n 输入流的函数输入流的函数函数函数功能功能read无格式输

27、入指定字节数无格式输入指定字节数get从流中提取从流中提取1个字符,包括空格个字符,包括空格getline从流中提取一行字符,含空格,遇换行符结束从流中提取一行字符,含空格,遇换行符结束ignore提取并丢弃流中指定字符提取并丢弃流中指定字符peek返回流中下一个字符,但不从流中删除(偷看一眼)返回流中下一个字符,但不从流中删除(偷看一眼)gcount统计最后输入的字符个数统计最后输入的字符个数putback( char c)将字符将字符c放回输入流中放回输入流中unget()将刚由将刚由get()提取的字符放回输入流中提取的字符放回输入流中建议自学:建议自学:http:/ 问题:从键盘输入一

28、个整数或字符串,并将之输出问题:从键盘输入一个整数或字符串,并将之输出int main () char c; int n; char str256; cout = 0) & (c n; cout You have entered number n str; cout You have entered word str 的区别,前者要提取空白字符,的区别,前者要提取空白字符,后者不提取后者不提取n 故:下述代码是死循环故:下述代码是死循环 cinc; while(c!=n) coutc;应改为应改为;while(c=cin.get()!=n) /要提取空白字符要提取空白字符 cout.put(c

29、);3814:14n 补充:非成员函数的补充:非成员函数的getline()istream& getline ( istream& is, string& str, char delim ); istream& getline ( istream& is, string& str );用法:用法: string str; cout Please enter full name: ; getline (cin,str); cout Thank you, str .n;3914:14字符串输入流字符串输入流n istringstream类,构造函数为:类,构造函数为:n istringstream

30、 ( const string & str, openmode which = ios_base:in );n 如:如: string s(“The result is 75!”); istringstream iss(s ); 将字符串输入流对象将字符串输入流对象iss与字符串对象与字符串对象s绑定,则绑定,则iss对象的输入对象的输入将从字符串将从字符串s中提取数据中提取数据 作用:可实现数字字符串向数值转换作用:可实现数字字符串向数值转换4014:14int main () int n,val; string str; str = 125 320 512 750 333; istring

31、stream iss (str); /将将iss流对象与流对象与str建立关联,以建立关联,以str的内容的内容作为作为iss流对象的输入流对象的输入 for (n=0; n val;/从输入字符串流提取数据从输入字符串流提取数据 cout val*2 endl; return 0;4114:14输入输出流输入输出流的的状态状态n C+提供一提供一套机制套机制,用于检测输入输出流状态,以,用于检测输入输出流状态,以发现错误并清除错误发现错误并清除错误状态,状态,n 用于查看输入输出流状态的函数:用于查看输入输出流状态的函数: v rdstate( ) 返回当前状态字返回当前状态字v bad(

32、) 如果如果badbit被置位,返回真,否则返回假被置位,返回真,否则返回假v clear(int _i=0) 用用参数参数 _i 置新的状态字置新的状态字v eof( ) 若若流流结束标志置位,结束标志置位,返回真,否则返回假返回真,否则返回假v fail( ) 如果如果badbit或或failbit被置位被置位,返回真返回真,否则返回假否则返回假v good( ) 如果无任何错误返回真,否则返回假如果无任何错误返回真,否则返回假4214:14文件输入流文件输入流n ifstream类类v 构造函数为:构造函数为:v void ifstream:open(const char *, int=

33、ios:in, int=filebuf:openprot);n 文件输入的基本过程同于输出操作文件输入的基本过程同于输出操作n 主要函数主要函数;v get()()v getline()()/有成员函数,与非成员函数形式有成员函数,与非成员函数形式v read()()4314:14文件的读取文件的读取n 将当前目录下的文件读入,并在屏幕上输出将当前目录下的文件读入,并在屏幕上输出 int main()string str;ifstream ifile(test1.txt,ios_base:in); while(ifile.good()/输入流状态正常,则反复读入输入流状态正常,则反复读入get

34、line(ifile, str);coutstr;ifile.close(); return 0;4414:14n 二进制文件的读入二进制文件的读入4514:14n 输入出错处理输入出错处理#include #include using namespace std;int main()int a, sum=0;while(cina) /反复输入至按下反复输入至按下ctrl+D为止(结束输入)为止(结束输入)sum+=a;cin.clear();cin.ignore( numeric_limits:max( ), n );/也可用也可用cin.get(),从流中将结束符提取,从流中将结束符提取c

35、outThe sum is:sumendl;4614:14输入输出文件流输入输出文件流n fstream类:即作为输出流也可作为输入流类:即作为输出流也可作为输入流4714:14n 读写位置控制读写位置控制文件内容文件内容读写位置指针读写位置指针读写数据后自动移动读写数据后自动移动读写位置指针读写位置指针istream类和类和ostream类类提供成员函数提供成员函数 ,控制读写位置指针的移动,控制读写位置指针的移动,实现文件的随机读写。实现文件的随机读写。文件刚打开时:文件刚打开时:.4814:14控制读写位置指针的成员函数:控制读写位置指针的成员函数:istream & istream:s

36、eekg( streampos ); istream & istream:seekg( streamoff, ios:seek_dir );streampos & istream:tellg( );ostream & ostream:seekp( streampos );ostream & ostream:seekp( streamoff, ios:seek_dir );streampos & ostream:tellp( );另外,在另外,在 ios 类中定义枚举类型:类中定义枚举类型: enum seek_dir beg=0, /文件开始处,使用文件开始处,使用 ios:beg cur=1, /当前位置,当前位置, 使用使用 ios:cur end=2 /文件结束处,使用文件结束处,使用 ios:end;用于指定移动文件用于指定移动文件指针时的参照点。指针时的参照点。4914:14例例 14.29 将将Fibonnaci数列的前数列的前40项写入二进制文件项写入二进制文件fib.bin中,中,然后输出其中的奇数项,每行输出然后输出其中的奇数项,每行输出5个数。个数。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论