C++大学基础教程第十二章_第1页
C++大学基础教程第十二章_第2页
C++大学基础教程第十二章_第3页
C++大学基础教程第十二章_第4页
C++大学基础教程第十二章_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、2022-2-21北京邮电大学电信工程学院计算机技术中心1C+大学基础教程大学基础教程第第1212章章 I/OI/O流及输入输出流及输入输出 北京邮电大学电信工程学院北京邮电大学电信工程学院 计算机技术中心计算机技术中心2022-2-21北京邮电大学电信工程学院计算机技术中心-2-C+语言没有输入/输出语句,但C+编译系统带有一个面向对象的输入/输出软件包,它就是I/O流类库。软件包有时称为库文件(.lib文件),类库是指用面向对象方法实现的软件包。 12.1 12.1 流类库概述流类库概述12.2 12.2 输出流输出流12.3 12.3 输入流输入流 12.4 12.4 输入输入/ /输出

2、流输出流 12.5 12.5 重载插入和提取运算符重载插入和提取运算符第第1212章章 I/OI/O流及输入输出流及输入输出2022-2-21北京邮电大学电信工程学院计算机技术中心-4-C C语言中读写文件语言中读写文件步骤步骤: :n打开文件打开文件n读读/ /写文件写文件n关闭文件关闭文件例例: : 写文件写文件#include struct Date int month, date, year; ;void main() const N=30;short k;struct Date dtN;FILE *pf;fopen(f:date.dat,”wb”);for(k=0; kN; k+)

3、dtk.year=2006;dtk.month=4;dtk.date=k+1;fwrite(dt,sizeof(Date), N,pf);fclose();2022-2-21北京邮电大学电信工程学院计算机技术中心-5-C C语言中读写文件语言中读写文件步骤步骤: :n打开文件打开文件n读读/ /写文件写文件n关闭文件关闭文件例例: : 读文件读文件#include struct Date int month, date, year; ;void main() const N=30;short k;struct Date dtN;FILE *pf;fopen(f:date.dat,”rb”);

4、fread(dt,sizeof(Date), N,pf);for(k=0; kN; k+) coutdtk.yeardtk.monthdtk.date插入运算符:插入运算符:12.1 12.1 流类库概述流类库概述 2022-2-21北京邮电大学电信工程学院计算机技术中心13 12.2 12.2 输出流输出流2022-2-21北京邮电大学电信工程学院计算机技术中心-14-系统已经定义了标准设备输出流类,并且已经定义系统已经定义了标准设备输出流类,并且已经定义了该类的对象:了该类的对象:ncout cout 标准输出,缓冲区满时被输出。标准输出,缓冲区满时被输出。ncerr cerr 标准错误输

5、出,没有缓冲,发送给它的内容立即标准错误输出,没有缓冲,发送给它的内容立即被输出。被输出。nclog clog 类似于类似于cerrcerr,但是有缓冲,缓冲区满时被输出。但是有缓冲,缓冲区满时被输出。 程序中只需程序中只需# #include include ,可以直接使用可以直接使用这些对象,从键盘输入,向显示器输出。这些对象,从键盘输入,向显示器输出。 12.2.1 12.2.1 设备输出流设备输出流 2022-2-21北京邮电大学电信工程学院计算机技术中心-15-标准输出设备一般指显示器,但可以在操作系统标准输出设备一般指显示器,但可以在操作系统下修改为别的设备,比如,重定向为磁盘文件

6、。下修改为别的设备,比如,重定向为磁盘文件。流流cerrcerr和和clogclog把信息输出到默认错误日志上,该把信息输出到默认错误日志上,该日志通常是指显示器,不能重定向。日志通常是指显示器,不能重定向。 12.2.1 12.2.1 设备输出流设备输出流 2022-2-21北京邮电大学电信工程学院计算机技术中心-16-例例12.112.1:将:将4 4个浮点数输出到屏幕显示,每行输出一个浮点数输出到屏幕显示,每行输出一个数,靠右对齐,占个数,靠右对齐,占1010个字符的宽度,不足个字符的宽度,不足1010个字个字符在数的前面用符在数的前面用“* *”号填充。号填充。 /例例12.112.1

7、:使用成员函数控制输出格式:使用成员函数控制输出格式#include using namespace std;void main() double values = 1.23,35.36,653.7,4358.24; for(int i=0;i4;i+) cout.width(10); cout.fill(*); cout valuesi n; 使用使用widthwidth函数控制输出宽函数控制输出宽度为度为1010个字符,默认的个字符,默认的按右对齐,不足按右对齐,不足1010个字个字符的前边加空格,如果符的前边加空格,如果不想使用默认的空格填不想使用默认的空格填充符,可以调用充符,可以调用

8、fillfill函数函数设置填充字符的值。设置填充字符的值。 2022-2-21北京邮电大学电信工程学院计算机技术中心-17-可以使用操纵符或调用成员函数进行输出格式控制可以使用操纵符或调用成员函数进行输出格式控制,可以根据需要灵活选用。可以根据需要灵活选用。 操纵符是在标准头文件操纵符是在标准头文件iomanipiomanip中定义的。中定义的。 12.2.1 12.2.1 设备输出流设备输出流 操纵符操纵符成员函数成员函数功能描述功能描述decflags(10)按按1010进制输出进制输出hexflag(16)按按1616进制输出进制输出octflag(8)按按8 8进制输出进制输出set

9、fill(c)fill(c)设置填充字符为设置填充字符为c csetprecision(n)precision(n)显示小数精度为显示小数精度为n n位位width(n)设置输出宽度为设置输出宽度为n n个字符个字符setw(n)只有只有setw()setw()不是持续性的,使用一次,只负责设置一次不是持续性的,使用一次,只负责设置一次输出的宽度,其它操纵符都是持续性的。输出的宽度,其它操纵符都是持续性的。 2022-2-21北京邮电大学电信工程学院计算机技术中心-18-操纵符操纵符成员函数成员函数功能描述功能描述fixedflags(ios:fixed)按十进制表示法显示浮点数按十进制表示法

10、显示浮点数scientificflags(ios:scientific)按科学记数法显示浮点数按科学记数法显示浮点数leftflags(ios:left)左对齐左对齐rightflags(ios:right)右对齐右对齐uppercaseflags(ios:uppercase)16进制数大写输出进制数大写输出lowercaseflags(ios:lowercase)16进制数小写输出进制数小写输出showpointflags(ios:showpoint)总是显示小数点总是显示小数点noshowpointflags(ios:noshowpoint)仅当小数部分不为仅当小数部分不为0时才显示小数点

11、时才显示小数点boolalphaflags(ios:boolalphi)用符号用符号true和和false显示逻辑值显示逻辑值noboolalphaflags(ios:noboolalphi)用用1和和0显示逻辑值显示逻辑值showposflags(ios:showpos)显示正数前有显示正数前有“+”号号noshowposflags(ios:noshowpos)显示正数前没有显示正数前没有“+”号号2022-2-21北京邮电大学电信工程学院计算机技术中心-19-例例12.212.2:输出:输出8 8进制和进制和1616进制数进制数 #include #include using namesp

12、ace std;void main() int num=1000;cout.flags(ios:uppercase);coutDecimal:decnumendl;coutHexadecimal:hexnumendl;coutOctal:octnumendl;把正数把正数10001000按按8 8进制、进制、1616进制等输出进制等输出到屏幕显示,使用操纵符进行控到屏幕显示,使用操纵符进行控制。制。1616进制显示时,如果遇到进制显示时,如果遇到A-FA-F,要求用大写,调用成员函数进行要求用大写,调用成员函数进行控制。控制。2022-2-21北京邮电大学电信工程学院计算机技术中心-20-例例

13、12.412.4:使用操纵符:使用操纵符showpointshowpoint控制浮点数显示出小数点;使用控制浮点数显示出小数点;使用showposshowpos控制正数显示出控制正数显示出“+”“+”号,默认的是不显示。号,默认的是不显示。 /例例12.4:强制显示小数点和符号:强制显示小数点和符号#include #include using namespace std;void main() cout10.0/5endl;coutshowpoint10.0/5endl;cout10 -20endl;coutshowpos10 -20open(“filename.dat”, iosmode)

14、; 12.2.2 12.2.2 文件输出流文件输出流 2022-2-21北京邮电大学电信工程学院计算机技术中心-23-Ofstream类构造函数原型类构造函数原型ofstream();ofstream( const char* szName, int nMode = ios:out, int nProt = filebuf:openprot );ofstream:openvoid open( const char* szName, int nMode = ios:out, int nProt = filebuf:openprot );文件名文件名共享方式,一般共享方式,一般用缺省值。用缺省值。

15、文件打开方式,表文件打开方式,表12-3ios:in,ios:out,ios:nocreate,ios:binary2022-2-21北京邮电大学电信工程学院计算机技术中心-24-例例12.512.5:把学生信息保存到磁盘文件。学生的信息包括:把学生信息保存到磁盘文件。学生的信息包括:学号、姓名、年龄等,是一个结构类型学号、姓名、年龄等,是一个结构类型studentstudent,结构结构变量在定义时就初始化。变量在定义时就初始化。#include #include using namespace std;struct student long num; char name20; char s

16、ex; int age; s t u = 2 0 0 4 111 8 , L i Li,F,18;void main() ofstream ofile(student.txt); ofilesetw(8)stu.num setw(20) setw(3)stu.sex setw(3)stu.ageendl;2022-2-21北京邮电大学电信工程学院计算机技术中心-25-在输出到文件时,同样可以使用操纵符,在输出到文件时,同样可以使用操纵符,或使用与操纵符等价的成员函数进行格或使用与操纵符等价的成员函数进行格式控制。式控制。 12.2.2 12.2.2 文件输出流文件输出流 202

17、2-2-21北京邮电大学电信工程学院计算机技术中心-26-文件输出流常用的一些其它的成员函数文件输出流常用的一些其它的成员函数:openopen函数:打开文件函数:打开文件putput函数:把一个字符写到输出流中函数:把一个字符写到输出流中. 例例:cout.put(c);writewrite函数:把内存中的一块内容写到一个输出文件函数:把内存中的一块内容写到一个输出文件流中流中.n把内存中的一块内容写到一个输出文件流中,该函数带两把内存中的一块内容写到一个输出文件流中,该函数带两个参数:一个个参数:一个charchar指针(指向内存数据的起始地址)和一指针(指向内存数据的起始地址)和一个所写

18、的字节数。常用于二进制文件的输出。个所写的字节数。常用于二进制文件的输出。 closeclose函数:关闭文件函数:关闭文件 12.2.2 12.2.2 文件输出流文件输出流 2022-2-21北京邮电大学电信工程学院计算机技术中心-27-例例12.712.7:把数组中:把数组中1010个整数保存到磁盘文件中。个整数保存到磁盘文件中。其中包含整数其中包含整数1010。 /二进制输出文件二进制输出文件#include using namespace std;void main() short a10=82, 36, 25, 79, 44, 10, 51, 90, 63, 28; ofstream

19、 ofile(“f:temptest.dat”, ios:binary); ofile.write(char*)a, 20); ofile.close;2022-2-21北京邮电大学电信工程学院计算机技术中心28 12.3 12.3 输入流输入流 2022-2-21北京邮电大学电信工程学院计算机技术中心-29-系统已经预先定义了标准设备输入流,并且已经定系统已经预先定义了标准设备输入流,并且已经定义了该类的对象义了该类的对象cincin。一般不需要构造新的设备输。一般不需要构造新的设备输入流对象,只使用预先定义的入流对象,只使用预先定义的cincin对象。对象。 从输入流提取时,也可以使用的操

20、纵符进行输入格从输入流提取时,也可以使用的操纵符进行输入格式的控制。式的控制。 从输入流提取时,也可以使用流类定义的函数进行从输入流提取时,也可以使用流类定义的函数进行输入操作。输入操作。 12.3.1 12.3.1 标准设备输入流标准设备输入流 2022-2-21北京邮电大学电信工程学院计算机技术中心-30-从输入流提取时,也可以使用流类定义的函数进行输从输入流提取时,也可以使用流类定义的函数进行输入操作。常用的函数有:入操作。常用的函数有: getget函数函数: : 非格式化非格式化getget函数的功能与提取运算符(函数的功能与提取运算符()很相)很相象,主要的不同点是象,主要的不同点

21、是getget函数在读取数据时包括空函数在读取数据时包括空格字符,而提取运算符在默认情况下以空格字符格字符,而提取运算符在默认情况下以空格字符作为分隔符,无法读取。作为分隔符,无法读取。 2022-2-21北京邮电大学电信工程学院计算机技术中心-31-#include using namespace std;void main() char letter; while(!cin.eof() letter =cin.get(); letter =toupper(letter); if(letter=Y) cout Y be met.; break; cout letter; 例例12.812.8

22、:用:用getget函数循环读取字符,转换成大写输函数循环读取字符,转换成大写输出,直到用户键入出,直到用户键入YY时结束。时结束。 2022-2-21北京邮电大学电信工程学院计算机技术中心-32-getline函数函数 非格式化非格式化getlinegetline成员函数的功能是允许从输入成员函数的功能是允许从输入流中读取多个字符,并且允许指定输入终止字符流中读取多个字符,并且允许指定输入终止字符(默认值是换行符)。在读取完成后,从读取的(默认值是换行符)。在读取完成后,从读取的内容中删除该终止字符。可以读取一个包含空格内容中删除该终止字符。可以读取一个包含空格的文本块,然后再进行分析。的文

23、本块,然后再进行分析。 2022-2-21北京邮电大学电信工程学院计算机技术中心-33-例例12.912.9:使用:使用getlinegetline从键盘输入中读取,直到遇到从键盘输入中读取,直到遇到$字符。或者最多读取字符。或者最多读取8080个字符,然后把读个字符,然后把读取的信息再输出到屏幕显示出来。取的信息再输出到屏幕显示出来。 /例例12.9:使用输入流的成员函数:使用输入流的成员函数getline()()#include using namespace std;void main() char line80;coutInput a string terminated by $end

24、l;cin.getline(line,80,$);coutlineendl;2022-2-21北京邮电大学电信工程学院计算机技术中心-34-文件输入流类文件输入流类ifstreamifstream,支持从磁盘文件读取。,支持从磁盘文件读取。如果需要一个仅用于读取的磁盘文件,可以构如果需要一个仅用于读取的磁盘文件,可以构造一个造一个ifstreamifstream类的对象,并且可以指定使用类的对象,并且可以指定使用二进制或文本模式。二进制或文本模式。可以在定义流对象的同时,指定相关联的文件,可以在定义流对象的同时,指定相关联的文件,在构造该对象时自动打开文件;也可以先定义在构造该对象时自动打开文

25、件;也可以先定义流对象,随后调用流对象,随后调用openopen成员函数,指定相关联成员函数,指定相关联的文件并打开。的文件并打开。 12.3.2 12.3.2 文件输入流文件输入流 2022-2-21北京邮电大学电信工程学院计算机技术中心-35-很多格式化选项和成员函数都可以应用于很多格式化选项和成员函数都可以应用于ifstreamifstream类对象类对象 nreadread函数函数 read read成员函数从一个文件把字节流读到一个指定的成员函数从一个文件把字节流读到一个指定的存储区,由长度参数确定要读的字节数。当读了指存储区,由长度参数确定要读的字节数。当读了指定的字节数或遇到文件

26、结束符时读结束。定的字节数或遇到文件结束符时读结束。 12.3.2 12.3.2 文件输入流文件输入流 2022-2-21北京邮电大学电信工程学院计算机技术中心-36-#include #include #include using namespace std;void main()coutFile of values to be averaged: ;char *FileName=“f:temptest.dat”;ifstream file(FileName,ios:binary);if (! file)cerrCannot open FileName for averaging.endl;

27、exit(1);例例12.1312.13:设计一个通用目的的平均值计算器,参加平均计算的:设计一个通用目的的平均值计算器,参加平均计算的数都存在一个文件中。运行计算器程序时,把该文件的文件名数都存在一个文件中。运行计算器程序时,把该文件的文件名从键盘读进来,打开文件,读取其中的数据进行平均计算,把从键盘读进来,打开文件,读取其中的数据进行平均计算,把计算结果输出到屏幕显示。计算结果输出到屏幕显示。 2022-2-21北京邮电大学电信工程学院计算机技术中心-37- int a20, Numbers (20);float Sum = 0;file.read(char*)a,Numbers); fo

28、r(int i=0;i 0)float Average = Sum/Numbers;coutAverage of values from FileName is Averageendl;elsecerrNo values to average in FileNameendl;2022-2-21北京邮电大学电信工程学院计算机技术中心38 12.4 12.4 输入输入/ /输出流输出流2022-2-21北京邮电大学电信工程学院计算机技术中心-39-输入输出流类输入输出流类iostreamiostream,该类对象可以该类对象可以是数据的源或目的。是数据的源或目的。iostreamiostream类

29、有一个重要的派生类:类有一个重要的派生类:fstreamfstream,它支持磁盘文件的输入和输出,它支持磁盘文件的输入和输出,如果程序需要对同一个磁盘文件既要读如果程序需要对同一个磁盘文件既要读又要写,可以构造一个又要写,可以构造一个fstreamfstream对象。对象。 12.4 12.4 输入输入/ /输出流输出流 2022-2-21北京邮电大学电信工程学院计算机技术中心-40-#include #include using namespace std;struct student /声明新的数据类型声明新的数据类型 long num;/学号学号 char name20; /姓名姓名

30、char sex;/性别性别 int age;/年龄年龄 stu=20041110,zhang hua,M,21;void main()student s1;fstream myfile(student.dat,ios:in|ios:out|ios:app|ios:binary);例例12.1412.14:打开一个已有的文件,在文件中增加一个学生的记录,并:打开一个已有的文件,在文件中增加一个学生的记录,并把所有记录输出显示。把所有记录输出显示。 2022-2-21北京邮电大学电信工程学院计算机技术中心-41-if (myfile.good() myfile.write(char*)&stu,

31、 sizeof(stu);myfile.seekg(0);myfile.read(char*) &s1, sizeof(s1);while (!myfile.eof()couts1.num endl;myfile.read(char*) &s1, sizeof(s1);elsecoutCant open file! (istream & ins, MyClass & obj);ostream & operator (ostream & outs, MyClass & obj); 注意:不能将重载的插入和提取运算符定义为类的成注意:不能将重载的插入和提取运算符定义为类的成员函数,只能定义为一般的函数或者类的友元函数。员函数,只能定义为一般的函数或者类的友元函数。12.5 12.5 重载

温馨提示

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

评论

0/150

提交评论