谭浩强版C++程序设计-第13章--输入输出流.ppt
《谭浩强版C++程序设计-第13章--输入输出流.ppt》由会员分享,可在线阅读,更多相关《谭浩强版C++程序设计-第13章--输入输出流.ppt(28页珍藏版)》请在冰豆网上搜索。
第13章输入输出流,本章要点C+的输入和输出概述标准输出流标准输入流文件操作与文件流,13.1C+的输入和输出,1.输入输出的含义C+的输入输出包括三方面内容:
对系统指定的标准设备的输入输出。
以磁盘文件为对象输入输出。
对内存指定的空间进行输入输出。
2.C+的输入输出流,输入输出是数据传送的过程,C+形象地称之为流(stream)。
流是指由若干字节组成的字节序列,字节中的数据顺序从一个对象传送到另一对象。
C+中,输入输出流被定义为类,称为流类。
数据的流动就是由I/O流类来实现的。
用流类定义的对象称为流对象。
数据流入和流出的对象通常是指计算机中的屏幕、内存、文件等一些输入输出设备。
cin和cout为预定义流对象。
I/O流类说明表,I/O流类说明表(续),流类库的结构,streambuf,filebuf,strstreambuf,stdiobuf,ostream,ios,istream,ifstream,istrstream,istream_withassign,ofstream,ostrstream,ostream_withassign,iostream,fstream,strstream,stdiostream,Iostream_init,ios,istream,ostream,ifstream,ofstream,iostream,fstream,与文件输入输出相关的文件流类结构,13.2标准输出流,cout流对象,对应标准输出设备显示器。
用流插入运算符“(重载左移运算符)向cout流插入数据(标准数据类型),数据输出到屏幕。
输出格式使用控制符P425表13.3使用流对象的成员函数,表13.4,表13.5控制符在头文件iomanip中定义,成员函数在iostream中定义.,注意:
输出宽度控制:
setw和width
(1)宽度的设置仅适用于下一个插入或读取的数据。
(2)在输出流中控制域宽,如果输出数据的宽度比设置的域宽小,将以默认右对齐方式输出数据,左边空位会用填充字符来填充(默认是空格)。
(3)如果输出数据的宽度比设置的宽度大,数据不会被截断,将输出所有位数。
例:
使用setw控制符控制域宽,#include#includeusingnamespacestd;voidmain()cout123endl;coutsetw(5)4.56.7endl;,程序运行结果为:
1234.56.7,例:
使用width成员函数控制域宽,#includeusingnamespacestd;voidmain()char*str3=“abc”,“abcde”,“abcdef”;for(inti=0;i3;i+)cout.width(5);coutstriendl;,程序运行结果为:
abcabcdeabcdef,注意:
输出精度控制setprecision,precision所设置的精度值,在程序没有设置计数法情况下,表示浮点数的有效数字的个数(缺省为6位)。
若程序设置了计数法(ios:
fixed或ios:
scientific),则表示小数点后数字的个数。
ios:
fixed表示以定点法输出浮点数(不带指数)。
ios:
scientific表示以科学计数法输出浮点数。
13.3标准输入流,cin流是istream类的对象,它从标准输入设备(键盘)获取数据,程序中的数据通过流提取符从流中提取数据.输入流在正常状态时,cin的值为”真”,当遇到无效字符或文件结束(Ctrl+Z)时,输入流处于出错状态,cin的值为”假”.,例13.5通过测试cin的真值,判断输入结束,#includeusingnamespacestd;intmain()floatgrade;coutgrade)if(grade=85)coutgradeGOOD!
endl;if(grade60)coutgradefail!
endl;coutentergrade:
;coutTheend.endl;return0;,1.文件的概念文件是指存储在外部介质上的数据的集合.文件包括程序文件和数据文件,数据文件又分为ASCII文件和二进制文件.ASCII文件又称文本文件,它的每个字节存放一个ASCII码;二进制文件以数据在内存中存储形式输出到磁盘.ASCII文件用于显示和打印的数据存放,二进制文件用于暂时保存中间结果数据.,13.4文件操作与文件流,2.文件流与文件流对象,处理文件输入输出的流类主要有ofstream、ifstream和fstream三个类。
均定义在fstream.h中。
向文件输出数据即将数据保存到文件中时,要使用ofstream类;从文件中读取数据即从文件中输入数据时,要使用ifstream类。
而使用fstream类可以同时进行输入及输出操作。
对磁盘文件的操作通过文件流对象实现.即用文件流定义一个流对象.,3.文件的打开与关闭,
(1)打开磁盘文件方法一调用文件流成员函数open函数用法如下:
文件I/O流类名流对象名;/声明一个流对象流对象名.open(文件名,打开方式);/调用open函数打开文件如:
ofstreammy_file;my_file.open(“boot.dat”,ios:
out);参数“文件名”:
用于指定要打开文件的文件名若为不带路径的文件名表示与当前应用程序在同一文件夹.若带路径的文件名,注意包括路经.,参数“打开方式”,用于指定文件的打开方式,
(1)打开磁盘文件方法二,在构造函数中直接指定文件名及打开方式用法如下:
文件I/O流类名流对象名(文件名,打开方式);如:
ifstreaminfile(“D:
hello.dat”,ios:
binary);
(2)关闭磁盘文件调用文件流成员函数close如:
my_file.close(),说明:
如果使用以上两种方法打开文件不成功(如文件路径不正确),文件流对象将为0,因此习惯上可用如下方式判断打开操作是否失败:
if(!
my_file)/如果打开文件的操作不成功,4.对ASCII文件的操作,对ASCII文件的读,写操作有两种方法:
用“”运算符输入输出标准类型数据;如:
ofstreammy_file(“D:
data.txt”,ios:
out);my_filesi;用put,get,getline等成员函数进行字符的输入输出.,例13.11有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组送到磁盘文件中存放。
#includeusingnamespacestd;intmain()inta10;ofstreamoutfile(f1.dat,ios:
out);if(!
outfile)cerrai;outfileai;outfile.close();return0;,例13.12从例13.11建立的数据文件f1.dat中读入10个整数放在数组中,找出并输出10个数中的最大者和它在数组中的序号。
#includeintmain()inta10,max,i,order;ifstreaminfile(f1.dat,ios:
in|ios:
nocreate);if(!
infile)cerrai;coutai;coutendl;,max=a0;order=0;for(i=1;imax)max=ai;order=i;coutmaxorderendl;infile.close();return0;,5.对二进制文件的操作,二进制文件又称为字节文件,可以按字节数对文件进行读写操作。
(1)读写二进制文件的成员函数read,write函数原型:
read(char*buffer,intlen);write(constchar*buffer,intlen);调用方式:
a.read(p,50);b.write(p,20);,文件流对象,例13.14-15将一批数据以二进制形式存放在磁盘文件中,再从文件读出显示。
#includeusingnamespacestd;structstudentcharname20;intnum;intage;charsex;,intmain()studentstud3=“Li”,1001,18,f,“Fun”,1002,19,m,“Wang”,1004,17,f;studentstud2;intiofstreamoutfile(stud.dat,ios:
binary);for(inti=0;i3;i+)outfile.write(char*),ifstreaminfile(stud.dat,ios:
binary);for(i=0;i3;i+)infile.read(char*),
(2)与文件指针有关的成员函数,在磁盘文件中有一个文件指针,用来指明当前读写的位置,对于二进制文件允许对指针进行控制。
说明:
“参照位置”参数是下面三者之一:
ios:
beg文件开头(默认值)ios:
cur指针当前位置ios:
end文件末尾“位移量”参数为long型整数,正数表示向前(文件尾方向)移动,负数表示向后(文件头方向)移动。
例:
infile.seekg(100);infile.seekg(-50,ios:
cur);outfile.seekp(-80,ios:
end);,