《C++ STL-数据结构与算法实现》课件第3章 输入输出流_第1页
《C++ STL-数据结构与算法实现》课件第3章 输入输出流_第2页
《C++ STL-数据结构与算法实现》课件第3章 输入输出流_第3页
《C++ STL-数据结构与算法实现》课件第3章 输入输出流_第4页
《C++ STL-数据结构与算法实现》课件第3章 输入输出流_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

第三章输入输出流STL中I/O流类标准输入输出流前修课文件输入输出流前修课字符串输入输出流1/33STL:提供若干个类模板,实现输入输出功能。位于std命名空间内:usingnamespacestd;使用灵活、方便,功能强大标准I/O流类istream,ostream,iostream文件I/O流类ifstream,ofstream,fstream字符串I/O流类istringstream,ostringstream,stringstreamSTL中I/O流类2/33标准输入输出流对象cin,cout,重载运算符>>和<<标准输入输出流类空白字符空格/换行/TAB…数据分隔符,>>跳过这些空白字符。如何改进程序?3/33流对象的get系列成员函数int

get();

//无参数功能:读一个字符(含空白字符)返回:该字符的ASCII值(int)

get(char*ch,intn,charc='\n');

//3个参数

getline(char*ch,intn,charc='\n');功能:读n-1个字符(含空白字符),存入字符数组

ch;遇终止字符c提前结束区别:get遇终止字符时,读位置停留在终止符前,

下次从该位置读取;getline则跳过终止符。返回:输入流对象*thisget系列成员函数4/33intmain(){charch[20]; cout<<"输入字符串:";//Howareyou?

intn=cin.get();cout<<n<<endl;

cin.getline(ch,20);

cout<<"该字符串是:"<<ch<<endl;cout<<"输入字符串:";//12345\7890

cin.getline(ch,20);

//cin.getline(ch,20,'\\');cout<<"该字符串是:"<<ch<<endl;return0;}get系列流成员函数例把上面getline都改为get,输出?5/33问题引入本要输入int数据,结果输入含有其他字符,如何发现和处理这类错误呢?用相关成员函数booleof()返回true:已到达流的末尾boolfail()返回true:I/O操作失败,遇到非法数据(如读取数字时遇到其他字符),流可以继续使用。boolbad()返回true:遇致命错误(物理的),流不能使用。利用流错误信息6/33intmain(){

inta;cout<<"请输入一个整数:";while(1)

{cin>>a;//要求输入整数

if(cin.fail()) {//--------输入数据非法----------- cout<<"输入有错!请重新输入"<<endl;

cin.clear();

//清除流所有标志位

cin.sync();

//清空流缓冲区

}else//---输入数据合法-----------

{cout<<a<<endl;break;}}}例:流错误信息这样写的保护代码并不好!逐个字符判断是否数字。7/33文件I/O流类二进制文件与文本文件二进制文件——字节序列

文件数据与内存数据的格式相同。shortint:5678

内存格式:0001011000101110

存入文件

2字节

每个字节不对应一个字符

人不能阅读(乱码)文本文件——字符序列用某编码ASCII,UNICODE,…把内存数据转换为字符序列后

存入文件。举例:shortint:5678转换为字符序列5678

4字符存入文件4字节

十进制ASCII:5(53),6(54),7(55),8(56)

00110101001101100011011100111000

5

6

788/33文件流类流对象与某个文件绑定/关联后,流对象即该文件。读写该流对象,就是读写该文件cin:系统定义的流对象,绑定为键盘设备文件cout:系统定义的流对象,绑定为屏幕设备文件ofstream:输出类,写文件:内存→文件ifstream:输入类,读文件:内存←文件fstream:

I/O类,读/写文件头文件#include<fstream>文件I/O流类9/33读写文件的三步打开文件

选择文件流类,创建流对象,与文件绑定读写文件写(Output):内存变量→文件读(Input):内存变量←文件关闭文件读写文件完毕后,及时关闭文件下面讲述具体操作读写文件的步骤10/30打开文件创建流对象的同时打开文件

ifstream

in("test.dat",ios::in);创建流对象后,用open成员函数打开

ofstream

out1,out2;out1.open("d:\\test.dat",ios::out);out2.open("..\\test.dat",ios::out);文件名(含路径)

文件名包含路径(绝对路径/相对路径/缺省路径)

可用字符串变量保存文件名,例如:

charfilename[]="d:\\test.dat";

in.open(filename,ios::in);打开文件缺省路径绝对路径相对路径11/30打开文件方式标志的组合举例ios::in|ios::binary二进制方式,读文件ios::out|ios::binary二进制方式,写文件ios::in|ios::out

文本文件方式,可读写

ios::in|ios::out|ios::binary

二进制方式,可读写多个标志共用一个32bits

整数的若干位标志位组合:|

文件打开标志12/30检查文件打开是否成功方式一用流对象的成员函数fail检查

ifstream

in;in.open("test.dat",ios::in)if(in.fail()==true)cout<<"打开文件失败";elsecout<<"打开文件成功";检查文件打开13/30方式二

检查流对象是否等于0if流对象=0,打开失败

else,打开成功---------------------------------------------------

ifstreamin("test.dat",ios::in);if(in==0)//if(!fin)cout<<"打开文件失败";elsecout<<"打开文件成功";检查文件打开14/30文件操作完后应及时关闭,同时打开的文件数有限文件关闭解除流对象与文件的绑定/关联。解绑后,该流对象还可与其他的文件绑定。举例:ofstreamout("demo.txt",ios::out);//out与demo.txt文件关联...…;out.close();//用完后及时关闭out.open("test.dat",ios::out|ios::binary);//out与test.dat文件关联关闭文件15/30读写文本文件写入文本文件:<<流插入符读取文本文件:

>>流提取符与cout<<,cin>>用法和效果一样cin,cout

换成了文件流对象关联某文件>>读文本文件①有字符转换;②忽略空白字符不希望字符转换:用二进制函数read

不希望忽略空白字符:用函数get,getline读写文本文件16/30<<写文本文件例<<

可输出不同类型的数据\t输出数据对齐

tab制表符endl输出\n回车符17/33getline()

读文本文件例18/33读写二进制文件任何类型文件均可用二进制方式读写不用<<

和>>读写字符转换——不希望的文件打开方式默认为文本方式in.open("myfile.dat",ios::in|ios::binary);二进制文件读写函数ostream&file.write((char*)buffer,intlen);istream&file.read((char*)buffer,intlen);file流对象

buffer内存块首地址 len读写字节数,sizeof(…)获得char*按字节读写

读写二进制文件filebufferwriteread19/30举例:读写二进制文件20/33举例:读写二进制文件21/33随机访问文件顺序访问文件:从头至尾读写文件随机访问文件:从文件内任意位置处开始读写注意:文本文件存在字符转换文件位置指示符(文件指针)定义:文件的当前读写位置,存在于流对象内部文件读写过程:

每读写一个字节,文件指针前移一个字节

前移:文件头→尾方向移动随机读写文件22/30移动文件指针,实现随机读写文件ostream&seekp(long,int)//p:put,写文件用

istream&seekg(long,int)//g:get,读文件用

移动文件指针到指定位置:(long,int)int

取值:ios::beg文件头ios::end

文件尾

ios::cur

目前位置(current)long

取值:偏移量(字节)232=4GB

正数

:文件指针→向文件尾移动的字节数

负数

:文件指针←向文件头移动的字节数随机读写文件的函数文件头文件尾当前位置-+23/30移动文件指针例:

out.seekp(20L,ios::beg);//out:流对象获得文件指针longtellp()//写文件用longtellg()//读文件用

返回

值:

//232=4GB——现在的读写位置(相对文件头的字节数)——0:文件头用以上流成员函数,即可实现文件随机读写随机读写文件的函数24/30例:随机读写文本文件光标在这25/30#include<iostream>#include<fstream>usingnamespacestd;voidmain()

{

ifstreamfile("demo.txt",ios::in);if(!file){cout<<"文件打开失败";return;}

longoffset;//偏移量

charch;

//当前读取的字符

int

温馨提示

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

评论

0/150

提交评论