第十讲 i/o 流

44
第第第 I/O 第 第第第第 第第第第第第 第第第第第第 :一一 第第 第第第第 第第第第第第第第第第第第第第第第第 一, 第第第第第 第第第第第第第第第 ,。

Upload: justus

Post on 17-Mar-2016

125 views

Category:

Documents


3 download

DESCRIPTION

第十讲 I/O 流. 流 :数据从一个对象到另一个对象的流动 流是一种抽象,负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。. ios. 抽象流基类. istream. 通用输入流类和其他输入流的基类. ifstream. 输入文件流类. istream_withassign. cin 的输入流类. istrstream. 输入字符串流类. ostream. 通用输出流类和其他输出流的基类. ofstream. 输出文件流. ostream_withassign. cout,cerr,clog 的输入流类. ostrstream. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第十讲  I/O 流

第十讲 I/O 流流流:数据从一个对象到另一个对象的流动

流是一种抽象,负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。

Page 2: 第十讲  I/O 流

iosios 抽象流基类抽象流基类istreamistream 通用输入流类和其他输入流的基类通用输入流类和其他输入流的基类ifstreamifstream 输入文件流类输入文件流类

istream_withassignistream_withassign cincin 的输入流类的输入流类istrstreamistrstream 输入字符串流类输入字符串流类ostreamostream 通用输出流类和其他输出流的基类通用输出流类和其他输出流的基类ofstreamofstream 输出文件流输出文件流

ostream_withassignostream_withassign cout,cerr,clogcout,cerr,clog 的输入流类的输入流类ostrstreamostrstream 输出字符串流类输出字符串流类iostreamiostream 通用输入输出流类和其他输入输出流的基类通用输入输出流类和其他输入输出流的基类fstreamfstream 输入输出文件流类输入输出文件流类strstreamstrstream 输入输出字符串流类输入输出字符串流类stdiostreamstdiostream 标准标准 I/OI/O 文件的输入输出类文件的输入输出类

Page 3: 第十讲  I/O 流

I/O 流类库各个类之间的关系iosios

istreamistream

ostreamostream

istrstreamistrstream

istream_withassignistream_withassign

ifstreamifstream

ostrstreamostrstream

ostream_withassignostream_withassign

ofstreamofstream

iostreamiostream

fstreamfstream

strstreamstrstream

stdiostreamstdiostream

public

public

public

publicpublic

public

publicpublic

public

public

public

Page 4: 第十讲  I/O 流

iosiosistreamistreamifstreamifstream

istream_withassignistream_withassign

istrstreamistrstreamostreamostreamofstreamofstream

ostream_withassignostream_withassign

ostrstreamostrstreamiostreamiostreamfstreamfstreamstrstreamstrstreamstdiostreamstdiostream

iostream.hiostream.hiostream.hiostream.hfstream.hfstream.hiostream.hiostream.hstrstrea.hstrstrea.hiostream.hiostream.hfstream.hfstream.hiostream.hiostream.hstrstrea.hstrstrea.hiostream.hiostream.hfstream.hfstream.hstrstrea.hstrstrea.hstdiostr.hstdiostr.h

I/OI/O 流类所在包含文件流类所在包含文件

Page 5: 第十讲  I/O 流

I/O 流操作标准流类文件流类串流类控制符重载插入运算符

Page 6: 第十讲  I/O 流

标准流类标准头文件: iostream.hiostream.h对应标准设备表:cincin: 键盘coutcout: 屏幕cerrcerr: 屏幕 //// 错误信息不再重定向,没有缓错误信息不再重定向,没有缓冲冲clogclog: 打印机 //// 类似类似 cerrcerr ,有缓冲,缓冲区,有缓冲,缓冲区满输出满输出

Page 7: 第十讲  I/O 流

标准流对象的定义标准流对象的定义:cin : istream cin;cout: ostream coutcerr: ostream cerrclog: ostream clog

Page 8: 第十讲  I/O 流

文件流类ofstream,ifstream,fstreamofstream,ifstream,fstream

文件流类定义的操作应用于外部设备,最典型的设备是磁盘中的文件。文件输出流文件输出流输出流成员函数输出流成员函数文件输入流文件输入流输入流成员函数输入流成员函数

Page 9: 第十讲  I/O 流

文件输出流构造对象时指定文件名和模式

Ofstream::ofstream(char* pFileName,int mode=ios::out,int prot=filebuf::openprot)

pFileNamepFileName: 文件名modemode :: 文件打开模式protprot :: 文件共享方式

Page 10: 第十讲  I/O 流

使用成员函数打开文件void open( const char* szName,

int nMode = ios::out, int nProt = filebuf::openprot );

在对象消失时,由析构函数关闭析构函数关闭由构造函数或 open 成员函数打开的文件。

Page 11: 第十讲  I/O 流

文件打开选项文件打开选项ios::ateios::ate 如果文件存在,输出内容加在末尾如果文件存在,输出内容加在末尾ios::inios::in 具有输入能力具有输入能力ios::outios::out 具有输出能力具有输出能力ios::truncios::trunc 如果文件存在,清除文件内容如果文件存在,清除文件内容

ios::nocreateios::nocreate 如果文件不存在,返回错误如果文件不存在,返回错误ios::noreplaceios::noreplace 如果文件存在,返回错误如果文件存在,返回错误ios::binaryios::binary 以二进制方式打开文件以二进制方式打开文件 (( 不转换字符不转换字符 ))

可以用‘可以用‘ |’|’ 组合打开方式组合打开方式

Page 12: 第十讲  I/O 流

文件保护方式选项Filebuf::openprotFilebuf::openprot 兼容共享方式兼容共享方式

Filebuf::sh_noneFilebuf::sh_none 独占,不共享独占,不共享

Filebuf::sh_readFilebuf::sh_read 允许读共享允许读共享

Filebuf::sh_writeFilebuf::sh_write 允许写共享允许写共享

Page 13: 第十讲  I/O 流

例:/*/* 向文件向文件 myfilemyfile 中写入一些信息,如果文件不中写入一些信息,如果文件不存在,则创建该文件存在,则创建该文件 */*///// 构造对象时打开文件构造对象时打开文件

ofstream fout("e:\\temp\\myfile.txt");fout<<"this is"<<endl;

//// 使用成员函数使用成员函数ofstream fout;fout.open("e:\\temp\\myfile.txt");fout<<"this is"<<endl;

Page 14: 第十讲  I/O 流

//// 向文件向文件 myfilemyfile 中追加一些信息:中追加一些信息://// 构造对象时打开文件构造对象时打开文件

ofstream fadd("e:\\temp\\myfile.txt",ios::ate);fadd<<"a new file"<<endl;//// 调用成员函数调用成员函数

ofstream fout;fout.open("e:\\temp\\myfile.txt",ios::ate);fout<<" a new file "<<endl;

Page 15: 第十讲  I/O 流

输出流成员函数PutPut 函数函数 输出一个字符输出一个字符

ostream& put( char ch );ofstream fout("e:\\temp\\myfile.txt",ios::ate);fout.put(‘A’)<<endl;//// 宽度和填充方式不起作用宽度和填充方式不起作用fout<<‘A’<<endl;//// 宽度和填充方式起作用宽度和填充方式起作用

Page 16: 第十讲  I/O 流

例:cout<<setw(10);cout.put('a')<<endl;

cout<<setw(10);cout<<'a'<<endl;

输出结果:a_ _ _ _ _ _ _ _ _ a

Page 17: 第十讲  I/O 流

write 函数 内存中的一块内容写到输出文件流中ostream& write( const char* pch, int nCount );pch: 内存数据起始地址nCount:字节数ofstream fout("e:\\temp\\myfile.txt",ios::ate);char a[]={"write"};fout.write(a,sizeof(a));

Page 18: 第十讲  I/O 流

如果需要向文件流写整形或实型数据时,要先将他们转换成字符串 :

#include <stdio.h>……

float f=123.4567;char fstr[20];sprintf(fstr,”%f”,f);

Page 19: 第十讲  I/O 流

seekpseekp: 设置文件指针ostream& seekp( streampos pos );ostream& seekp( streamoff off, ios::seek_dir dir );

pos: 长整形,指针的新位置off: 长整形,指针的偏移量dir: 相对位置:ios::beg 文件头ios::cur 文件指针的当前位置ios::end 文件尾

Page 20: 第十讲  I/O 流

tellp: 返回文件指针streampos tellp();ofstream fout("e:\\temp\\myfile.txt");fout.seekp(10);//// 从文件头部向后移动从文件头部向后移动 1010 个字节个字节fout<<"10";int pos;pos=fout.tellp();pos=pos+2;fout.seekp(pos);//// 从当前位置向后移动从当前位置向后移动 22 个字节个字节fout<<"12";

Page 21: 第十讲  I/O 流

close() 函数关闭文件 , 当在同一个流对象上打开了另外的文件,调用 close() 函数。

ofstream fout;fout.open(“file1”);……fout.close();fout.open(“file2”);……fout.close();

Page 22: 第十讲  I/O 流

错误处理函数bad: 出现不可恢复的错误,返回非 0 值fail: 出现不可恢复的错误或一个预期条件,返回非 0 值good: 没有错误,没有文件结束,返回非 0 值eof: 文件结束,返回非 0 值clear: 清除所有错误位rdstate: 返回当前错误状态

if(cout.fail())cerr<<“ 文件未打开” <<endl;

Page 23: 第十讲  I/O 流

文件输入流构造对象时打开文件

ifstream( const char* szName, int nMode = ios::in, int nProt = filebuf::openprot );

Page 24: 第十讲  I/O 流

调用成员函数void open( const char* szName,

int nMode = ios::in, int nProt = filebuf::openprot );析构函数关闭由构造函数和成员函数打开的文件。当打开多个文件时可以使用 close 函数关闭文件。

Page 25: 第十讲  I/O 流

输入流成员函数get 函数

输入一个字符char a[10]; int i=0;ifstream fin("e:\\temp\\myfile.txt");while(!fin.eof()){

a[i]=fin.get();//// 输入带空格输入带空格//// 或或 fin>>a[i];fin>>a[i]; 自动过滤空格自动过滤空格i++;

}

Page 26: 第十讲  I/O 流

getline 函数istream& getline( char* pch,

int nCount, char delim = '\n' );

从流中向存储器 pch 读入多个字符,直到遇到以下情况之一:所读字符个数将达到 nCount ;将遇到终止字符;文件结束。

Page 27: 第十讲  I/O 流

read 函数istream& read( char* pch,

int nCount );// 从文件读 nCount 个字节到指定的存储区

char d[100];ifstream fin("e:\\temp\\myfile.txt");fin.read(d,20);

Page 28: 第十讲  I/O 流

seekg 函数返回下一个将读位置的指针tellg 函数设置下一个将读位置的指针

//// 从流中间隔读入字符从流中间隔读入字符while(!fin.eof()){

pos=fin.tellg();pos++;fin.seekg(pos);fin.get(d[i]);i++;

}

Page 29: 第十讲  I/O 流

串流类ostrstream,istrstream,strstream

串流类允许将 fstream 类定义的文件操作应用于存储区中的字符串。串流类将字符串看作为设备。

串流输入串流输入串流输出串流输出

Page 30: 第十讲  I/O 流

串流输入istrstream( char* pch, int nLength );

char str[10]={"student"};char a[5];istrstream ai(str,sizeof(a)-1);ai>>a;

Page 31: 第十讲  I/O 流

串流输出ostrstream( char* pch,

int nLength,int nMode = ios::out );

pch: 字符串数组nLength: 数组大小 , 当字符个数超过 nLen

gth 时,字符串不再接受输出nMode: 打开方式

Page 32: 第十讲  I/O 流

//// 向字符数组中写入字符串向字符数组中写入字符串char str[10];ostrstream aout(str,sizeof(str));aout<<"a student"<<endl;

Page 33: 第十讲  I/O 流

控制符输出宽度和填充字符输出宽度和填充字符进制进制格式标志值格式标志值精度精度

Page 34: 第十讲  I/O 流

输出宽度和填充字符setw(int wide)

设置域宽为 widesetfill(char ch)

设置填充字符为 ch

Page 35: 第十讲  I/O 流

进制dec: 十进制oct: 八进制hex :十六进制

Page 36: 第十讲  I/O 流

格式标志值使用带参数的 setiosflags 操纵符可以设置格式,它的影响是持久的,直到用 re

setiosflags 恢复缺省值。

Page 37: 第十讲  I/O 流

Ios::skipws 在输入中跳过空白Ios::left 左对齐Ios::right 右对齐Ios::internal 在指定任何引导标记或基之后增加填充字符Ios::dec 以十进制格式化数值Ios::oct 以八进制格式化数值Ios::hex 以十六进制格式化数值Ios::showbase 以 C++编译器能读的格式显示数值常量

Page 38: 第十讲  I/O 流

Ios::showpoint 对浮点数值显示小数点和尾部的 0Ios::uppercase 对十六进制数值显示大写字母 A~ F ,对于科学格式显示大写字母

E 。Ios::showpos 对于正数显示正号Ios::scientifil 以科学格式显示浮点数值Ios::fixed 以定点格式显示浮点数值

Page 39: 第十讲  I/O 流

精度浮点数输出有效位数的缺省值是 6 ,可以用

setprecition改变精度(小数点后位数)。float a=234.5678923;cout<<setiosflags(ios::fixed)<<setw(10)<<setprecision(5)<<a<<resetiosflags(ios::fixed)<<endl;

Page 40: 第十讲  I/O 流

重载插入运算符当向流输出类对象时,需要对插入运算符进行重载。

Page 41: 第十讲  I/O 流

class base{private:

int m;int n;

public:base(int i,int j):m(i),n(j){}virtual void view(ostream& out){

out<<"m="<<m<<endl;out<<"n="<<n<<endl;

}};

Page 42: 第十讲  I/O 流

ostream& operator<<(ostream& out,base& b){

b.view(out);return out;

}main(){

base b(10,20);ofstream fout("e:\\temp\\myfile.txt");fout<<b<<endl;

}

Page 43: 第十讲  I/O 流

如果该类有一个派生类 :class der:public base{public:

der(int i,int j):base(i,j){}void view(ostream& out){

out<<"in der"<<endl;base::view(out);

}};

Page 44: 第十讲  I/O 流

执行:base b1(10,20);der d1(100,200);ofstream fout("e:\\temp\\myfile.txt");fout<<b1<<d1<<endl;会向文件中写入:m=10n=20in derm=100n=200