IO流对象和类入门.ppt_第1页
IO流对象和类入门.ppt_第2页
IO流对象和类入门.ppt_第3页
IO流对象和类入门.ppt_第4页
IO流对象和类入门.ppt_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

I/O流对象和类入门,田秀霞 上海电力学院计信学院,主要内容,流和基本文件I/O 流I/O工具 字符I/O,5.1 流和基本文件I/O,I/O指的是程序的输入(Input)和输出(Output)。 输入可取自键盘,输出可发送至屏幕。 其实,输入也可取自文件,输出可发送至文件。,为什么引入文件I/O,键盘输入和屏幕输出只是和临时数据打交道,一旦程序终止,键盘输入的数据和屏幕上的数据都会消失。 文件则可以永久保存,除非硬盘损坏或病毒破坏等。,5.1.1 流,流是对象,是由一个字符(或其他类型的数据)构成的“流”。对象是一种特殊的变量,它拥有自己的一套特殊用途的函数。 输入流:如果流向程序,则称之为输入流。输入流可以来源于键盘或文件。 cin是连接到键盘的一个输入流. 输出流:如果流向屏幕或文件,则称之为输出流,输出流可来源于程序。 cout是连接到屏幕的一个输出流.,如果in_stream是一个输入流,并且这个流来源于某个文件,那么下面语句什么意思? int number; in_streamnumber;,如果out_stream是一个输出流,并且这个流发送到某个文件,那么下面语句什么意思? int number=100; out_stream“数字为:”number;,5.1.2 文件I/O,读取文件:如果程序从一个文件获取输入,称读取文件。 写入文件:程序将输出发送给文件,称读取文件。 流可以用来从一个文件中获取输入,或将输出发送给文件。 但是在使用流之前必须先声明流,而且必须将流连接到文件。 输入文件流类型名称:ifstream 输出文件流类型名称:ofstream,ifstream in_stream;,ofstream out_stream;,读或写文件第一步,如果要使用ifstream和ofstream类型,则必须引入头文件fstream,即程序中必须包括预编译指令和语句: #include using namespace std;,引入头文件fstream,读或写文件第二步,声明流变量格式: 流类型名称 流变量1,流变量2; 如:ifstream in_stream; ofstream out_stream;,声明流变量,读文件第三步,输入流变量必须连接到一个文件,称之为打开文件。 需要一个名为open的函数执行这个打开操作。 假设需要输入流in_stream连接到一个名为infile.txt的文件,那么程序必须首先执行如下语句,然后才能从该文件读取输入。 in_stream.open(“infile.txt”);,打开文件,执行该语句后,in_stream表示文件infile.txt,除非重新设置in_stream连接的文件。,读取文件第四步,使用提取运算符从文件中获取输入。 如: int num1,num2; in_streamnum1num2;,读取文件,从文件infile.txt中读取两个数字,并分别放入变量num1和num2中。,读取文件第五步,程序结束从一个文件获取输入,每个文件都应该关闭,即断开文件和输入流的连接,此时要用到另一个名为close的函数。 如 in_stream.close(); 如果程序正常终止,但没有正常关闭文件,系统会自动关闭文件。,关闭文件,#include #include /文件流头文件 using namespace std; void main() ifstream indata; /定义一个输入流变量 indata.open(“input_data.txt“); /将文件流变量和磁盘文件联系起来,打开文件 int a; double b; indata a b; /从磁盘文件分别读数据到两个变量中 cout “a=“ a “, b=“ b endl; /查看结果 indata.close(); /关闭文件 ,a=23,b=25.8,写文件第三步,输出流变量必须连接到一个文件,称之为打开文件。 需要一个名为open的函数执行这个打开操作。 假设需要输出流out_stream连接到一个名为outfile.txt的文件,那么程序必须首先执行如下语句,然后才能从该文件读取输入。 out_stream.open(“outfile.txt”);,打开文件,执行该语句后,out_stream表示文件outfile.txt,除非重新设置out_stream连接的文件。,写文件第四步,使用插入运算符向文件写入数据。 如: int num1=45,num2=8; out_streamnum1num2;,写入文件,向文件outfile.txt中写入两个数字。,写文件第五步,程序结束向一个文件写入数据,每个文件都应该关闭,即断开文件和输出流的连接,此时要用到另一个名为close的函数。 如 out_stream.close(); 如果程序正常终止,但没有正常关闭文件,系统会自动关闭文件。,关闭文件,#include /引入文件流头文件 using namespace std; /=测试主函数= int main() ofstream outFile(“ofile.txt“); /声明一个文件输出流对象 outFile“hello,Jack“endl; /向文件输出一个字符串 outFile“Would you mind do me a favor!“endl; /向文件输出一个字符串 outFile.close(); /关闭文件输出流 return 0; ,输入输出文件,P148图5.1,5.1.3 类与对象入门,其实cin,cout,in_stream和out_stream都是对象,对象是一个变量,既然是变量则对应一定的变量类型,如下: ostream cout; istream cin; ifstream in_stream; ofstream out_stream; 和对象关联的既有函数也有数据,这完全由该对象所属的类决定。 in_stream.open(“infile.txt”); out_stream.open(“outfile.txt”);,与对象关联的函数称作成员函数,不同的对象可能含有不同的成员函数,这些函数可能同名。类决定了对象拥有哪些成员函数。,成员函数,在程序中调用一个成员函数时,必须指定一个对象。 如:in_stream.open(“infile”); .称为圆点运算符,圆点之前命名的对象称作调用对象。,对象名.成员函数,5.1.4 检查文件是否成功打开,如果open函数要打开的文件不存在,或其他原因打开失败,则程序可能不会报告任何错误,正常执行,但是得到的是一个非预期的结果。 最好在执行open函数之后,判断open调用是否成功,如果不成功则终止程序。 可以用成员函数fail()来测试一个操作是否失败。 fail函数的返回类型是bool,即布尔类型。 如:in_stream.fail(); /1或0 out_stream.fail();/1或0,fail函数的应用,最好在每个open调用之后,立即调用fail函数。 如: in_stream.open(“infile.txt”); if(in_stream.fail() cout“输入文件打开失败!”endl; exit(1); ,必须在程序中包含预编译指令和语句: #include using namespace std;,完善程序5.1,P152-图5.2,5.1.5 检查文件尾,程序要从文件中读取数据,但是不一定知道文件中数据的个数,怎样才能确定是否已经读取到文件尾了呢? 如:编写程序,计算输入文件中数据的平均值。,#include #include #include using namespace std; int main() ifstream in_stream; ofstream out_stream; in_stream.open(“data.txt“); out_stream.open(“output.txt“); if(in_stream.fail() cout“文件不存在或目录不正确“endl; exit(1); ,int sum=0,count=0; int num; double avg; while(in_streamnum) count+; sum+=num; avg=(double)sum/count; out_streamcount“个整型数据的平均值是:“avgendl; in_stream.close(); out_stream.close(); return 0; ,循环从文件中读取数据,直到将文件中有效数据读取完,此时in_strteamnum的结果为NULL使得循环条件为假。,5.2 流I/O工具,输出格式:程序的输出布局。 如:输出2.00 输出*30 采用流的各种格式操作。,格式化输出,5.2.1 流的格式操作,常用的流状态 showpos,showbase,uppercase,showpoint,boolalpha,left,right,dec,hex,oct,fixed,scientific 有参数的三个常用的流状态 width(int),fill(char),precision(int) 与连用的设置方式,要包含头文件iomanip setw(int),setfill(char),setprecision(int),格式化输出,1)常用的流状态,showpos 在正数(包括0)之前显示+号 showbase在十六进制整数前加0x,八进制整数前加0 uppercase 十六进制格式字母用大写字母表示(默认为小写字母) showpoint浮点输出,即使小数点后都为0也加小数点 boolalpha逻辑值1和0用true和false表示 left左对齐(填充字符填在右边) right右对齐(填充字符填在左边) dec十进制显示整数 hex十六进制显示整数 oct八进制显示整数 fixed定点数格式输出 scientific科学记数法格式输出,#include using namespace std; void main() bool b=23; cout3)3)endl; coutbendl; coutfixed12345.678endl; coutscientific123456.678endl; ,12 +12 +18 12 0x12 0xff 0XFF +123 +123.000 0 0 false +12345.678000 +1.234567E+005,常用的流状态,取消流状态的操作: noshowpos,noshowbase,nouppercase,noshowpoint,noboolalpha Left与right是相对立的,设置了此就取消了彼,dec,oct,hex也是相互独立的。 fixed与scientific和一般显示方式三者相互独立,不过他们的取消方式为cout捆绑函数调用的方式 cout.unsetf(ios:scientific); cout.unsetf(ios:fixed);,取消流状态,#include using namespace std; void main() bool b=23; cout3)3)endl; coutbendl; cout noboolalphabendl;/取消布尔型数的字母输出 coutfixed12345.678endl; cout.unsetf(ios:fixed);/取消定点小数 cout12345.678endl; coutscientific123456.678endl; ,12 +12 18 12 0x12 0xff 0XFF 18 123 123.000 123 0 0 false 0 12345.678000 12345.7 1.234567E+005,2)有参数的三个流状态,width(int) 设置显示宽度 fill(char)设置填充字符 precision(int)设置有效位数(普通显示方式)或精度(定点或科学记数法方式) 注意:这些流状态是以cout捆绑调用它们的形式设置的,不能与流出符连用。width(n)为一次性操作,即第二次显示时将不再有效,默认为width(0),表示仅显示数值。,#include using namespace std; void main() cout.width(8);/只对下面一个数据有效 cout.fill(*); cout 12 endl; /默认右对齐 cout12endl; /默认宽度为0 cout.width(8); cout.fill(*); coutleft12endl; cout.precision(8);/当小数为0时,不显示 cout 2345.00 endl; cout 1234567.789124567endl;/普通显示 coutfixed 1234567.78912endl;/定点显示 coutscientific1234567.78912endl;/科学记数显示 ,*12 12 12* 2345 1234567.8 1234567.78912000 1.23456779e+006,3)与连用的设置方式,setw(int)(必须在每次使用时都设定) setfill(char) setprecision(int) 注意:必须要包含头文件iomanip 只使用setprecision不能输出小数末尾的0,例如0.2只能输出为0.2,而不是0.20。 可以使用下面语句将setw,setprecision和fixed三个结合起来。 coutsetiosflags(ios:fixed); coutfixedsetprecision(2)setw(8)0.2;,#include #include using namespace std; void main() cout setw(8) setfill(*)12endl; cout setw(8) setfill(*)left12endl; cout setprecision(8)1234.00endl; cout1234567.789124567endl; coutsetw(10)fixed setprecision(3)12345.200endl; ,*12 12* 1234 1234567.8 12345.200*,课后练习,将上述所有设置输出格式的程序中的标准输出流cout用一个文件输出流(如:out_stream)替换,观察文件中的输出格式和屏幕格式是否完全相同?,5.2.2 流作为函数实参,流可以作为函数实参。 但是函数对应的形参必须是传引用调用的。 P163图5.6,5.3 字符I/O,所有字符都作为字符数据输入和输出。 如:输出10,实际上输出的是两个字符1和0。 不管程序如何实现,计算机硬件读取的始终是字符1和0。 C+为字符数据的输入输出提供了一些低级的辅助机制,这些机制不支持自动转换。,5.3.1 get成员函数,使用格式: 输入流变量.get(char类型的一个变量)。 输入流可以是cin或文件输入流 含义: get函数允许读取输入的一个字符,并将其存储到char类型的一个变量中。 成员函数get不会忽略空白字符,除非通过编写代码丢弃空白字符。,/* * getfuc.cpp * 分别将字符ABCD输入四个字符变量中 */ #include using namespace std; int main() char ch1,ch2,ch3,ch4; cin.get(ch1); cin.get(ch2); cin.get(ch3); cin.get(ch4); cout“ch1=“ch1endl; cout“ch2=“ch2endl; cout“ch3=“c

温馨提示

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

评论

0/150

提交评论