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

下载本文档

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

文档简介

1、输入输出流输入输出流 1提纲提纲nC+的输入和输出的输入和输出n标准输出流标准输出流n标准输入流标准输入流n文件操作与文件流文件操作与文件流n字符串流字符串流2提纲提纲nC+的输入和输出的输入和输出n标准输出流标准输出流n标准输入流标准输入流n文件操作与文件流文件操作与文件流n字符串流字符串流3C+的输入和输出的输入和输出n在在C+中,输入输出是通过流完成的。中,输入输出是通过流完成的。qC+的的输出输出操作将一个操作将一个对象的状态对象的状态转换成一个转换成一个字符序列字符序列,输出到,输出到某个地方某个地方。q输入操作则是从输入操作则是从某个地方某个地方接收一个接收一个字符序列字符序列,然

2、后将其转换成一个然后将其转换成一个对象的状态对象的状态所要求的格式所要求的格式n把接收存放输出数据的地方叫做把接收存放输出数据的地方叫做目标目标,把,把输入数据来自的地方叫做输入数据来自的地方叫做源源,输入和输出,输入和输出操作可以看成操作可以看成字符序列在源、目标和对象字符序列在源、目标和对象之间的流动之间的流动。C+把与输入和输出有关的操把与输入和输出有关的操作定义为一个作定义为一个类体系类体系,放在一个系统库里,放在一个系统库里4C+的输入和输出(续)的输入和输出(续)n这个执行输入和输出操作的类体系叫做这个执行输入和输出操作的类体系叫做流流类类,提供流类实现的系统叫做,提供流类实现的系

3、统叫做流类库流类库。5iosstreambufistreamostreamiostream一个指针成员一个指针成员指向该类对象指向该类对象ofstreamifstreamfstreamC+的输入和输出(续)的输入和输出(续) n前面是简化的前面是简化的流类库的基本类等级图流类库的基本类等级图,而,而不是直接的继承关系图。不是直接的继承关系图。n它们都是它们都是模板类模板类,箭头表示的是类等级关,箭头表示的是类等级关系。系。q在图中,在图中,ios类中一个指针成员指向类中一个指针成员指向streambuf类类的对象。的对象。Streambuf类管理流的缓冲区。类管理流的缓冲区。q由于数据隐蔽和封

4、装的需要,普通用户只使用由于数据隐蔽和封装的需要,普通用户只使用ios、istream和和ostream类类提供的公有接口,完提供的公有接口,完成流的成流的提取提取和和插入插入操作。操作。6C+的输入和输出(续)的输入和输出(续) qios类是类是istream类和类和ostream类的虚基类类的虚基类;q从从ios类公有派生类公有派生出出istream类和类和ostream类分别类分别提供提供对流进行提取和插入操作的成员函数对流进行提取和插入操作的成员函数;qiostream类通过组合类通过组合istream类和类和ostream类支持类支持对一个流进行双向操作,它并没有提供新成员对一个流进

5、行双向操作,它并没有提供新成员函数。函数。qiostream中预定义四个流对象,它们分别是中预定义四个流对象,它们分别是cin、cout、cerr、clog。事实上可以将。事实上可以将cin视为视为istream的一个对象,而的一个对象,而cout视为视为ostream的一个的一个对象。对象。7C+的输入和输出(续)的输入和输出(续) nC+的流类库预定义的四个流的流类库预定义的四个流所连接的设备所连接的设备如表所示:如表所示: 流流 设备设备 cin 标准输入设备标准输入设备 cout 标准输出设备标准输出设备 cerr 标准错误输出设备(标准错误输出设备(非缓冲非缓冲方式)方式) clog

6、 标准错误输出设备(标准错误输出设备(缓冲缓冲方式)方式) 8C+的输入和输出(续)的输入和输出(续) n与与iostream类库有关的头文件类库有关的头文件q iostream类库中不同的类的声明被放在不同的类库中不同的类的声明被放在不同的头文件中,用户在程序中用头文件中,用户在程序中用#include命令包含所命令包含所需的头文件就相当于需的头文件就相当于在程序中声明了所需的类在程序中声明了所需的类q iostream 输入输出流输入输出流操作操作q fstream 管理管理文件的文件的I/O操作操作q strstream 字符流的字符流的I/O操作操作q stdiostream 混合使用

7、混合使用C和和C+q iomanip 使用使用格式化格式化I/O操作操作9提纲提纲nC+的输入和输出的输入和输出n标准输出流标准输出流n标准输入流标准输入流n文件操作与文件流文件操作与文件流n字符串流字符串流10标准输出流标准输出流n标准输出流是标准输出流是流向标准输出设备流向标准输出设备的数据的数据。nostream类定义类定义cout、cerr和和clog三个流对象三个流对象ncout流对象流对象qcout流在内存开辟一个流在内存开辟一个缓冲区存放流中的数据缓冲区存放流中的数据,当,当遇到遇到endl时,立即时,立即输出输出流中的所有数据,流中的所有数据,然后然后插入一个换行符插入一个换行

8、符并并清空缓冲区清空缓冲区。ncerr流对象流对象qcerr流对象是流对象是标准出错流标准出错流。它向。它向标准出错设备标准出错设备输出有关出错的信息。输出有关出错的信息。11cerr流对象流对象举例举例n例例7.1 编写程序,从键盘输入编写程序,从键盘输入a,b,c的值的值求解求解一元二次方程一元二次方程。如果。如果a=0或或判别式的值判别式的值0,输出出错信息。,输出出错信息。12cerr流对象流对象举例举例13输入方程的系数输入方程的系数 a,b,ca=0TF报告输入报告输入系数系数 a的值的值等于等于0,出,出错!错!b2-4ac0TF报告判别报告判别式的值小式的值小于于0,出错!,出

9、错!分别计算一元分别计算一元二次方程的两二次方程的两个根个根X1和和X2。cerr流对象流对象举例举例int main() float a, b, c, disc; coutabc; if (a=0) cerra 等于等于0,错误,错误!endl; else if (disc=b*b-4*a*c)0) cerr“判别式判别式b*b-4*a*c0”endl; else coutx1=(-b+sqrt(disc)/(2*a)endl; cout“x2=”(-b-sqrt(disc)/(2*a)endl; return 0;14cerr流对象流对象举例举例15标准输出流标准输出流ncout的输出可以

10、重定向到一个文件中,而的输出可以重定向到一个文件中,而cerr必须输出在显示器上。必须输出在显示器上。nclog流对象流对象qclog流对象也是标准出错流,它与流对象也是标准出错流,它与cerr的区别是的区别是,cerr不经过缓冲区直接向显示器输出出错信不经过缓冲区直接向显示器输出出错信息息,clog把出错信息存放在缓冲区,当缓冲区把出错信息存放在缓冲区,当缓冲区满或遇到满或遇到endl时向显示器输出出错信息。时向显示器输出出错信息。16标准输出流标准输出流n对于为什么有对于为什么有cerr和和clogq比如,你的程序遇到比如,你的程序遇到调用栈用完了的威胁调用栈用完了的威胁(无(无限,没有出

11、口的递归)。限,没有出口的递归)。q到什么地方到什么地方借内存借内存,存放你的错误信息存放你的错误信息?q所以有了所以有了cerr。其目的,就是在你最需要它的。其目的,就是在你最需要它的紧急情况下紧急情况下,还能得到,还能得到输出功能输出功能的支持。的支持。q缓冲区的目的,就是减少刷屏的次数。有了缓缓冲区的目的,就是减少刷屏的次数。有了缓冲,你将看到若干句子冲,你将看到若干句子“同时同时”就出现在了屏就出现在了屏幕上(由内存翻新到显存,然后刷新屏幕)。幕上(由内存翻新到显存,然后刷新屏幕)。17格式输出格式输出n在输出数据时,如不指定格式,则采用系在输出数据时,如不指定格式,则采用系统给定的统

12、给定的默认格式默认格式。n可以通过可以通过控制符或流的成员函数控制符或流的成员函数设置输出设置输出格式。格式。n用控制符设置输出格式用控制符设置输出格式q表表7.3列出了列出了输出格式的控制符输出格式的控制符。这些控制符在。这些控制符在头文件头文件iomanip中定义。中定义。q例例7.2 用用控制符控制输出格式控制符控制输出格式。1819例例7.2 用控制符控制输出格式用控制符控制输出格式int main()int a; couta; cout“dec:decaendl ; couthex:hexaendl; coutoct:setbase(8) aendl; char *pt=China;

13、 coutsetw(10) ptendl; coutsetfill(*) setw(10) ptendl; double pi=22.0/7.0;20例例7.2 用控制符控制输出格式用控制符控制输出格式 coutsetiosflags(ios:scientific)setprecision(8) ; coutpi=piendl; coutpi= setprecision(4) piendl; coutpi= setiosflags(ios:fixed) piendl; return 0;21例例7.2 用控制符控制输出格式用控制符控制输出格式22例例7.2 用控制符控制输出格式用控制符控制输出

14、格式2 coutsetiosflags(ios:scientific)setprecision(8) ; coutpi=piendl; coutpi= setprecision(4) piendl; coutpi= resetiosflags(ios:scientific) setiosflags(ios:fixed) piendl; return 0;23例例7.2 用控制符控制输出格式用控制符控制输出格式224流对象的成员函数控制输出格式流对象的成员函数控制输出格式n用于用于控制输出格式控制输出格式的常用的常用成员函数成员函数见表见表7.4n流成员函数流成员函数setf和控制符和控制符se

15、tiosflags括号中参括号中参数是数是格式标志格式标志,在类,在类ios中定义它是枚举值中定义它是枚举值25流对象的成员函数控制输出格式流对象的成员函数控制输出格式n在引用这些格式标志时要以在引用这些格式标志时要以ios:开始。开始。26流对象的成员函数控制输出格式流对象的成员函数控制输出格式n例例7.3 用流控制成员函数输出数据。用流控制成员函数输出数据。int main()int a=21; cout.setf(ios:showbase); / 强制输出整数的基数(强制输出整数的基数(0,0 x) coutdec:aendl; cout.unsetf(ios:dec); cout.se

16、tf(ios:hex); couthex:aendl; cout.unsetf(ios:hex); cout.setf(ios:oct); coutoct:aendl; char *pt=“China”;27流对象的成员函数控制输出格式流对象的成员函数控制输出格式 cout.width(10); coutptendl; cout.width(10); cout.fill(*);coutptendl; double pi=22.0/7.0; cout.setf(ios:scientific); coutpi=; cout.width(14); coutpiendl; cout.unsetf(io

17、s:scientific); cout.setf(ios:fixed);28流对象的成员函数控制输出格式流对象的成员函数控制输出格式 cout.width(12); cout.setf(ios:showpos); /正数输出正数输出“+”号号 cout.setf(ios:internal); /数符出现在左侧 cout.precision(6); coutpi=0;i-) cout.put(*(a+i); cout.put(n); return 0;33提纲提纲nC+的输入和输出的输入和输出n标准输出流标准输出流n标准输入流标准输入流n文件操作与文件流文件操作与文件流n字符串流字符串流34标准

18、输入流标准输入流ncin是是istream类的对象,从类的对象,从标准输入设备标准输入设备读读取数据。取数据。q流提取运算符流提取运算符在流中提取数据时通常跳过流在流中提取数据时通常跳过流中的中的空格、空格、tab键、换行符键、换行符等字符。等字符。q只有输入回车键只有输入回车键时输入的数据才进入键盘缓冲时输入的数据才进入键盘缓冲区,形成输入流,提取运算符才能提取数据。区,形成输入流,提取运算符才能提取数据。q当遇到无效字符(与变量数据类型不一致)或当遇到无效字符(与变量数据类型不一致)或文件结束符时,输入流文件结束符时,输入流cin就处于就处于出错状态出错状态,此,此时对时对cin流的所有操

19、作都被终止。流的所有操作都被终止。q当输入流出错时,当输入流出错时,cin的值是的值是false,所以可以根,所以可以根据据cin的值的值判断流对象是否处于判断流对象是否处于正常状态正常状态。35标准输入流标准输入流n例例 7.5 测试测试cin的值,判断流对象的状态。的值,判断流对象的状态。int main()float grade; coutgrade) if(grade=85) coutgrade GOOD!endl; if(grade60) coutgrade fail!endl; coutenter grade:; coutThe end.endl; return 0;36标准输入流

20、标准输入流37输入字符的流成员函数输入字符的流成员函数n用用get函数函数读入一个字符读入一个字符,格式:格式:cin.get()q函数的类型是字符,函数的功能是函数的类型是字符,函数的功能是从输入流中从输入流中提取一个字符作为函数值返回提取一个字符作为函数值返回。q如在流中遇到如在流中遇到文件结束符文件结束符EOF时,返回时,返回-1。n例例7.6 用用get函数读入字符。函数读入字符。int main()char c; coutenter a sentence:endl; while(c=cin.get()!=EOF) cout.put(c); return 0; 38输入字符的流成员函数

21、输入字符的流成员函数n带一个参数的带一个参数的get函数函数, cin.get(字符变量字符变量)q功能:从输入流中提取一个字符功能:从输入流中提取一个字符赋予字符变量赋予字符变量。如遇到文件结束符就结束提取。输入回车后。如遇到文件结束符就结束提取。输入回车后再输入文件结束符。再输入文件结束符。n例例7.6.2 把例把例7.6改写如下:改写如下:int main()char c; coutenter a sentence:endl; while(cin.get(c) cout.put(c); coutendendl; return 0;39输入字符的流成员函数输入字符的流成员函数40输入字符的

22、流成员函数输入字符的流成员函数n带三个参数的带三个参数的get函数函数q格式:格式: cin.get(字符指针字符指针,n,终止字符终止字符)q函数从键盘缓冲区函数从键盘缓冲区最多顺序提取最多顺序提取n-1个字符个字符,顺,顺序放入字符指针所指的字符数组。序放入字符指针所指的字符数组。q如果在提取过程中遇到如果在提取过程中遇到终止字符终止字符,无论是否满,无论是否满足指定的字符个数都要终止提取。足指定的字符个数都要终止提取。void main()char ch20; coutenter a sentence:endl; cin.get(ch,10,n); coutchendl;41输入字符的流

23、成员函数输入字符的流成员函数ncin.get() 中中不带参数和只带一个参数不带参数和只带一个参数的函数的函数,都是以,都是以文件结束符文件结束符作为终止提取的控制作为终止提取的控制符。如提取一个字符结束会把指针移到下符。如提取一个字符结束会把指针移到下一个字符。一个字符。n cin.get() 中带三个参数的函数,以中带三个参数的函数,以字符个字符个数或指定终止提取字符数或指定终止提取字符为终止提取的控制为终止提取的控制符。如提取字符结束不会把指针移到下一符。如提取字符结束不会把指针移到下一个字符。个字符。ncin.get( )函数族函数族不忽略提取的空白字符不忽略提取的空白字符。42成员函

24、数成员函数getline读入一行字符读入一行字符n格式:格式:cin.getline(字符指针字符指针,n,终止字符终止字符)n函数功能与带三个参数的函数功能与带三个参数的get函数类似函数类似。n带三个参数的带三个参数的cin.get和和cin.getline相同的是相同的是它们它们都不忽略提取过程中遇到的空白字符都不忽略提取过程中遇到的空白字符,当遇到终止字符时就停止提取。,当遇到终止字符时就停止提取。n带三个参数的带三个参数的cin.get和和cin.getline不同的是不同的是停止提取时停止提取时,cin.getline会把会把指针移到终止指针移到终止字符后相邻的字节字符后相邻的字节

25、,而带三个参数的,而带三个参数的cin.get函数不会。函数不会。43成员函数成员函数getline读入一行字符读入一行字符int main(int argc, char* argv)char ch20;char c1;cout输入一句话输入一句话:ch;cout第一次第一次 cin 提取的字符串是提取的字符串是:chendl;c1=cin.get();cout第二次第二次 cin.get() 提取的字符串是提取的字符串是:c1endl;cin.get(c1);cout第三次第三次 cin.get(c1) 提取的字符串是提取的字符串是:c1endl;cin.get( ch, 20, /);44

26、成员函数成员函数getline读入一行字符读入一行字符cout“第四次第四次 cin.get( ch, 20, /) 提取的字符串是提取的字符串是:”chendl;cin.getline(ch,20,/);cout第五次第五次 cin.getline (ch,20,/)提取的字符串是提取的字符串是:chendl;cin.getline(ch,20,/);cout第六次第六次 cin.getline (ch,20,/)提取的字符串是提取的字符串是:ch 的的重载重载,cin可以可以提取其他类型的数据提取其他类型的数据;而;而cin.getline只能输入只能输入字符串字符串。n例例7.7 用成员

27、函数用成员函数getline读入一行字符。读入一行字符。47成员函数成员函数getline读入一行字符读入一行字符#include using namespace std;void main()char ch20; cout输入一句话输入一句话:ch; cout第一次第一次 cin 提取的字符串是提取的字符串是:chendl;cin.getline(ch,20,/);cout第二次第二次 cin.getline 提取的字符串是提取的字符串是: chendl;cin.getline(ch,20);cout第三次第三次 cin.getline 提取的字符串是提取的字符串是: chendl; 48成

28、员函数成员函数getline读入一行字符读入一行字符49成员函数成员函数getline读入一行字符读入一行字符#include using namespace std;void main()char ch20; cout输入一句话输入一句话:ch; cout第一次第一次 cin 提取的字符串是提取的字符串是:chendl;cin.get( ch, 20, /);cout第二次第二次 cin.get 提取的字符串是提取的字符串是: ch endl;cin.getline(ch,20);cout第三次第三次 cin.getline 提取的字符串是提取的字符串是: chendl; 50成员函数成员函

29、数getline读入一行字符读入一行字符51成员函数成员函数getline读入一行字符读入一行字符52I likeC+./I studyC+./Iam h p ap y.istream类其他函数类其他函数n eof()函数函数n当输入缓冲区的指针遇到当输入缓冲区的指针遇到文件结束符时文件结束符时函数函数值为值为真真,否则显,否则显假假。从键盘用。从键盘用ctrl+z输入文输入文件结束符件结束符。n例例7.8 从键盘输入字符串,以文件结束符作从键盘输入字符串,以文件结束符作为结束标志,逐个为结束标志,逐个输出非空格字符输出非空格字符。53istream类其他函数类其他函数54void main(

30、)char c; while(!cin.eof() if(c=cin.get()!= ) /cout.put(c); cout c ; 当当(!cin.eof()(c=cin.get()!= TF输出输出Cistream类其他函数类其他函数55提纲提纲nC+的输入和输出的输入和输出n标准输出流标准输出流n标准输入流标准输入流n文件操作与文件流文件操作与文件流n字符串流字符串流56文件操作与文件流文件操作与文件流n文件的概念文件的概念q文件是指文件是指存储在存储介质上的数据集合存储在存储介质上的数据集合。q操作系统把存储介质上的操作系统把存储介质上的相关数据抽象为文件相关数据抽象为文件,用,用标

31、识符为其取名标识符为其取名并由并由文件系统管理文件文件系统管理文件。q操作系统操作系统可以可以按名存取文件信息按名存取文件信息。q根据文件中数据的根据文件中数据的表示形式表示形式,文件分为,文件分为ASCII文件和二进制文件文件和二进制文件。nASCII文件就是文件就是文本文件文本文件,每个字节表示一个字符。,每个字节表示一个字符。n二进制文件是把内存中的二进制文件是把内存中的数据、指令按其在内存的数据、指令按其在内存的格式格式存放在磁盘上。存放在磁盘上。57文件操作与文件流文件操作与文件流q字符信息在内存也是以字符信息在内存也是以ASCII码形式存放,所码形式存放,所以以字符在字符在ASCI

32、I码文件和在二进制文件中形式码文件和在二进制文件中形式是一样是一样的。对于数值数据,两者是不一样的。的。对于数值数据,两者是不一样的。q例如,一个例如,一个十进制长整数十进制长整数100000,用二进制表,用二进制表示时用示时用四个字节四个字节;而用;而用ASCII码表示时用码表示时用六个六个字节字节。58文件操作与文件流文件操作与文件流59文件流类与文件流对象文件流类与文件流对象 n文件流文件流是以外存文件为输入输出对象的数是以外存文件为输入输出对象的数据流。据流。q输出文件流输出文件流是从内存流向外存文件的数据流是从内存流向外存文件的数据流;q输入文件流输入文件流是从外存文件流向内存的数据

33、流。是从外存文件流向内存的数据流。q为了弥补访问内存和访问外存的速度差,每个为了弥补访问内存和访问外存的速度差,每个文件流都有一个文件流都有一个内存缓冲区内存缓冲区。n在在C+的的I/O类库里定义了几种文件类,专类库里定义了几种文件类,专门用于门用于文件的输入和输出文件的输入和输出操作。操作。60文件流类与文件流对象文件流类与文件流对象 n标准输入、输出流标准输入、输出流类派生出三个文件流类类派生出三个文件流类q ifstream类,支持从磁盘文件输入类,支持从磁盘文件输入;q ofstream类,支持向磁盘文件输出类,支持向磁盘文件输出;q fstream类,支持对磁盘文件输出和输出类,支持

34、对磁盘文件输出和输出;61文件的打开与关闭文件的打开与关闭 n打开文件是指在读写文件前做必要的准备打开文件是指在读写文件前做必要的准备工作,包括:工作,包括:q在在文件流对象文件流对象和和磁盘文件磁盘文件之间建立关联。之间建立关联。q指定文件的指定文件的格式和操作方式格式和操作方式。n打开文件有两种方法打开文件有两种方法q建立文件流对象,用对象建立文件流对象,用对象调用类成员函数调用类成员函数open 例:例:ofstream outfile; outfile.open( “f1.txt”, ios:out);62文件的打开与关闭文件的打开与关闭 n调用成员函数的一般形式为调用成员函数的一般形

35、式为 文件流对象文件流对象.open(文件名,输入输出方式文件名,输入输出方式); 文件名文件名可以包括路径可以包括路径,如省略路径,如省略路径,默认文件在当前默认文件在当前目录目录(工程文件目录工程文件目录)。n输入输出方式在输入输出方式在ios类中定义类中定义,它们是枚举常量,有,它们是枚举常量,有多种选择。多种选择。q在在定义定义文件流对象时文件流对象时指定参数指定参数n文件流类对象文件流类对象(文件名,输入输出方式文件名,输入输出方式);n 例:例:ofstream outfile ( “f1.txt”, ios:out);n打开文件操作可能成功也可能失败,可以测试文件打开文件操作可能

36、成功也可能失败,可以测试文件流对象判定。文件流对象是流对象判定。文件流对象是真真,表示成功;否则表,表示成功;否则表示失败。示失败。 63文件的打开与关闭文件的打开与关闭 64文件的打开与关闭文件的打开与关闭 n关闭磁盘文件关闭磁盘文件q文件使用结束,必须关闭文件,用文件流对象文件使用结束,必须关闭文件,用文件流对象调用关闭文件成员函数调用关闭文件成员函数实现。实现。q格式:格式:文件流对象文件流对象.close();q功能:解除文件流对象与磁盘文件的关联。功能:解除文件流对象与磁盘文件的关联。65对对ASCII码文件操作码文件操作nASCII码文件也是文本文件,文件中码文件也是文本文件,文件

37、中一个字一个字节存放一个字符节存放一个字符。q对对ASCII码文件操作包括向文件码文件操作包括向文件写入字符和从写入字符和从文件读取字符文件读取字符。q读写读写ASCII码文件有用文件流对象与码文件有用文件流对象与提取、插提取、插入运算符入运算符和用文件流对象调用类的和用文件流对象调用类的成员函数成员函数put, get, getline 两种方法。两种方法。q例例7.11 定义一个有十个元素的整型数组,从键定义一个有十个元素的整型数组,从键盘输入十个整数,将它们放入数组,同时用盘输入十个整数,将它们放入数组,同时用插插入运算符入运算符将它们写入当前目录下的将它们写入当前目录下的f1.txt文

38、件。文件。66对对ASCII码文件操作码文件操作67定义文件输出流对象定义文件输出流对象outfile关闭文件流对象关闭文件流对象outfileTF打开失败打开失败输出出错信息输出出错信息终止程序终止程序exitint k=0, k 10, k+ 输入一个整数给输入一个整数给ak 写文件写文件outfile akif 语句语句for 语句语句对对ASCII码文件操作码文件操作int main()int a10; ofstream outfile(f1.txt); if(!outfile) cerropen error!endl; exit(1); coutenter 10 integer nu

39、mbers:endl; for(int i=0;iai; outfileai ; outfile.close(); return 0;68对对ASCII码文件操作码文件操作69对对ASCII码文件操作码文件操作n程序中用文件流类程序中用文件流类ofstream,它是在头文件,它是在头文件fstream中定义的,中定义的,源码中源码中要把这个头文件要把这个头文件包含进来。包含进来。n建立输出流对象建立输出流对象默认就是向文件输出默认就是向文件输出,所,所以对文件的操作方式可以省略。以对文件的操作方式可以省略。n对文本文件写数值数据时,两个数据之间对文本文件写数值数据时,两个数据之间要要用空格或换

40、行符用空格或换行符隔开,便于读文件。隔开,便于读文件。n例例7.12从例从例7.11建立的建立的f1.txt文件中文件中读取读取10个个整数整数放入数组中,找出并放入数组中,找出并输出最大数和它输出最大数和它的下标值的下标值。70定义文件流对象定义文件流对象infile打开打开文件文件输出最大数及其下标输出最大数及其下标TF打开失败打开失败输出出错信息输出出错信息终止程序终止程序exitint k=0, k ak 输出一个整数输出一个整数 akif 语句语句for 语句语句在数组中找最大数及其下标在数组中找最大数及其下标关闭文件流对象关闭文件流对象infile71设置变量设置变量max=a0T

41、Fmax akint k=1, k 10, k+ if 语句语句for 语句语句设置变量设置变量order=0max = akorder = kn对程序分析对程序分析从顶到下,逐步细化从顶到下,逐步细化。这是结。这是结构化程序设计的基本功。前面分析中先设构化程序设计的基本功。前面分析中先设计出一个计出一个大框架大框架,然后再把不能用语句表,然后再把不能用语句表示的功能细化成能示的功能细化成能用语句组合表示的功能用语句组合表示的功能72读读文件操作文件操作int main() int a10,max,i,order; ifstream infile(f1.txt,ios:in); if(!inf

42、ile) cerropen error!endl; exit(1); for(i=0;iai; coutai ; coutendl;73读读文件操作(续)文件操作(续)infile.close();max=a0; order=0; for(i=1;imax) max=ai; order=i; coutmax=maxendlorder=order endl;return 0;74读读文件操作(续)文件操作(续)75读读文件操作(续)文件操作(续)n例例7.13 从键盘读入一行字符,把其中的字从键盘读入一行字符,把其中的字母字符存放到磁盘文件母字符存放到磁盘文件f2.txt中。再从中。再从f2.t

43、xt读入数据,把其中的小写字母改写为大写读入数据,把其中的小写字母改写为大写字母并存入磁盘文件字母并存入磁盘文件f3.txt。n分析:程序中使用两个文件,其中分析:程序中使用两个文件,其中f2先做输先做输出文件(出文件(写入字母写入字母),再做输入文件(),再做输入文件(读读取字母取字母),),f3做输出文件(做输出文件(写入大写字母写入大写字母)76关闭文件关闭文件f2.txt定义文件流对象定义文件流对象outfile打开文件打开文件f2.txt检查文件按条件写文件检查文件按条件写文件定义文件流对象定义文件流对象infile打开文件打开文件f2.txt 检查文件检查文件定义文件流对象定义文件

44、流对象outfile打开文件打开文件f3.txt 检查文件检查文件读文件读文件f2.txt ,写文件,写文件f3.txt关闭文件关闭文件f2.txt, f3.txt77读读文件操作(续)文件操作(续)void save_to_file() / 写文件写文件ofstream outfile(f2.txt); if(!outfile) cerropen f2.txt error!=65 & ci=97 & ci=122) outfile(ci); coutci; coutendl; outfile.close(); 78读读文件操作(续)文件操作(续)void get_from_f

45、ile()char ch; ifstream infile(f2.txt,ios:in); if(!infile) cerropen f2.txt error!endl; exit(1); ofstream outfile(f3.txt); if(!outfile) cerropen f3.txt error!=97 & ch=122) ch=ch-32; outfilech; coutch; coutendl; infile.close(); outfile.close();int main() save_to_file(); get_from_file(); return 0; 8

46、0读读文件操作(续)文件操作(续)81读文件程序读文件程序void display_file(char *filename) ifstream infile(filename,ios:in); if(!infile) cerropen error!endl; exit(1); char ch; while(infile.get(ch) cout(ch); coutendl; infile.close(); int main() display_file(f3.txt); return 0; 82读文件程序读文件程序83对二进制文件操作对二进制文件操作n二进制文件是按二进制文件是按内存中的数据存

47、储形式内存中的数据存储形式写写入磁盘文件,因此又称为内存数据的映象入磁盘文件,因此又称为内存数据的映象文件。文件。q对二进制文件操作与对文本文件操作相似的是对二进制文件操作与对文本文件操作相似的是先定义文件流对象先定义文件流对象,然后,然后打开文打开文件,使用完要件,使用完要关闭文件关闭文件。q在打开时必须在打开时必须指定文件的存储形式是二进制形指定文件的存储形式是二进制形式式,二进制文件即可以作为输入文件也可以作,二进制文件即可以作为输入文件也可以作为输出文件,还可以作为为输出文件,还可以作为既能输入又能输出既能输入又能输出的的文件。这是与文件。这是与ASCII文件不同的地方。文件不同的地方

48、。84对二进制文件操作对二进制文件操作(续)(续) n分别用成员函数分别用成员函数read和和write读写文件读写文件q读二进制文件用读二进制文件用istream类类read成员函数;成员函数;q写二进制文件用写二进制文件用ostream类类write成员函数。成员函数。q它们的函数原型分别是:它们的函数原型分别是: istream&read(char * bu, int len); ostream&write( const char * bu, int len);q字符指针字符指针bu指向指向内存要读或写的数据起始位置内存要读或写的数据起始位置qlen是是一次要读写的数据字

49、节个数一次要读写的数据字节个数(数据长度)(数据长度)q调用格式:调用格式: n输入文件流对象输入文件流对象.read( 内存指针内存指针, 长度长度);n输出文件流对象输出文件流对象.write( 内存指针内存指针, 长度长度);85对二进制文件操作对二进制文件操作(续)(续)n例例7.14 把一批数据把一批数据以二进制形式以二进制形式写入磁盘写入磁盘文件。文件。#include #include using namespace std;struct studentchar name20; int num; int age; char sex;86对二进制文件操作对二进制文件操作(续)(续)

50、87定义数据数组,定义文件定义数据数组,定义文件流对象流对象outfile打开文件打开文件TF打开失败打开失败输出出错信息输出出错信息终止程序终止程序exit写文件写文件outfile .write (char *)&stud,sizeof(stud);if 语句语句关闭文件流对象关闭文件流对象infile对二进制文件操作对二进制文件操作(续)(续)int main() student stud3= Li, 1001,18,f, Fun,1002,19,m, “Wang”,1004,17, f ; ofstream outfile(stud.dat,ios:binary); if(!o

51、utfile) cerropen error!endl; abort(); outfile.write( (char *)&stud,sizeof(stud); outfile.close(); return 0;88对二进制文件操作对二进制文件操作(续)(续)n例例7.15 从例从例7.14产生的文件中产生的文件中读数据并显示读数据并显示到屏幕上到屏幕上。n分析:从文件读取数据必须先放入内存,分析:从文件读取数据必须先放入内存,所以必须设置一个与文件数据格式相同的所以必须设置一个与文件数据格式相同的数据结构既数据结构既结构数组结构数组。然后再将。然后再将结构数组结构数组元素元素逐个输

52、出。逐个输出。89定义文件流对象定义文件流对象infile关闭文件关闭文件infile.close()TF打开失败打开失败输出出错信息输出出错信息终止程序终止程序exitint k=0, k 3, k+ 输出输出studk 各各个数据成员个数据成员if 语句语句for 语句语句打开文件打开文件stud.dat读文件读文件stud.dat 写数组写数组stud90对二进制文件操作对二进制文件操作(续)(续)#include #include using namespace std;struct studentchar name20; int num; int age; char sex; ;91

53、对二进制文件操作对二进制文件操作(续)(续)int main() student stud3; int i; ifstream infile(stud.dat,ios:binary); if(!infile) cerropen error!endl; abort(); infile.read(char*)stud,sizeof(stud); infile.close();92对二进制文件操作对二进制文件操作(续)(续)for(i=0;i3;i+) coutNO.i+1endl; cout姓名姓名:endl; cout学号学号:studi.numendl; cout年龄年龄:

54、studi.ageendl; cout性别性别:studi.sexendl; return 0;93对二进制文件操作对二进制文件操作(续)(续)94与文件指针有关的流类成员函数与文件指针有关的流类成员函数n为了随机读取二进制文件中数据,磁盘文为了随机读取二进制文件中数据,磁盘文件件用一个指针表示当前要访问的位置用一个指针表示当前要访问的位置。n每次读或写文件后会每次读或写文件后会自动修改指针自动修改指针。使指。使指针针总是指向当前要访问的位置总是指向当前要访问的位置。n对于二进制文件,允许对于二进制文件,允许程序控制指针移动程序控制指针移动,实现随机访问文件,实现随机访问文件。文件流类提供了有

55、。文件流类提供了有关关文件指针文件指针的成员函数。的成员函数。n表表7.7列出这些函数。列出这些函数。95与文件指针有关的流类成员函数与文件指针有关的流类成员函数n这些函数名头或尾字母不是这些函数名头或尾字母不是g就是就是p。q带带g的用于输入,带的用于输入,带p的用于输出。的用于输出。q对于输入输出文件不区分对于输入输出文件不区分g和和p。n函数参数文件中的函数参数文件中的位置和位移量位置和位移量以字节为以字节为单位,是长整型。单位,是长整型。96与文件指针有关的流类成员函数与文件指针有关的流类成员函数n参照位置表示参照位置表示以什么作为移动起点以什么作为移动起点。ios类类定义为:定义为:

56、q ios:beg 以文件开始为起点,这是默认值。以文件开始为起点,这是默认值。q ios:cur 以指针当前位置为起点。以指针当前位置为起点。q ios:end 以文件结尾为起点。以文件结尾为起点。q例:例: infile.seekg( 100 );q infile.seekg( -50,ios:cur);q outfile.seekp( -75,ios:end);97与文件指针有关的流类成员函数与文件指针有关的流类成员函数n随机访问二进制数据文件随机访问二进制数据文件q利用流类的成员函数利用流类的成员函数移动文件指针移动文件指针,实现随机,实现随机访问文件中任何一个字节里的数据。访问文件中

57、任何一个字节里的数据。q例:有五个学生的数据,要求:例:有五个学生的数据,要求:n 把它们写入磁盘文件把它们写入磁盘文件n 从磁盘文件读从磁盘文件读第第1,3,5学生学生数据并显示数据并显示n 修改第修改第3 个学生的数据个学生的数据并保存到原来位置并保存到原来位置n 从磁盘文件读入修改过的从磁盘文件读入修改过的5个学生数据并显示个学生数据并显示98与文件指针有关的流类成员函数与文件指针有关的流类成员函数struct student int num; char name20; float score;int main()int i; student stud5=1001,“Li”,85,100

58、2,“Fun”,97.5, 1004, Wang”,54, 1006,Tan,76.5,1010,ling,96; fstream iofile(stud.dat,ios:in|ios:out|ios:binary); if(!iofile) cerropen error!endl; abort(); 99与文件指针有关的流类成员函数与文件指针有关的流类成员函数for(i=0;i5;i+) iofile.write(char *)&studi,sizeof(studi); student stud15; for(i=0;i5;i=i+2) iofile.seekg(i*sizeof(s

59、tudi),ios:beg); iofile.read(char *)&stud1i/2,sizeof(stud1i); coutstud1i/2.num“ ”stud1i/2.name“ ”stud1i/2.scoreendl; coutendl; stud2.num=1012; strcpy(,Wu); stud2.score=60;100与文件指针有关的流类成员函数与文件指针有关的流类成员函数 iofile.seekp(2*sizeof(stud0),ios:beg); iofile.write(char *)&stud2,sizeof(stud2);

60、 iofile.seekg(0,ios:beg); for(i=0;i5;i+) iofile.read(char *)&studi,sizeof(studi); coutstudi.num studi.scoreendl; iofile.close(); return 0;101与文件指针有关的流类成员函数与文件指针有关的流类成员函数102提纲提纲nC+的输入和输出的输入和输出n标准输出流标准输出流n标准输入流标准输入流n文件操作与文件流文件操作与文件流n字符串流字符串流103字符串流字符串流n字符串流字符串流以内存中用户定义的以内存中用户定义的字符数组字符数组(字符串)为输入输出对象,即将数据写入字符串)为输入输出对象,即将数据写入内存数

温馨提示

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

评论

0/150

提交评论