标准C++中所有的I/O操作都是以I/O Stream(“输入输出流”)为基础的,在流的实现上,采取了缓冲区I/O的方式,每个stream对象中都有一个streambuf,对于流的操作缺省状态下是对于缓冲区的操作。
在对流的操作中有两个重要的运算符:
1. << , 输入运算符,即向流输出数据
2. >> , 输出运算符,即从流中取出数据
如上图,在C++中,对文件的操作你需要包含<fstream>头文件
在I/O流结构中,ios作为基类,包含如下两个派生类:
istream类,主要供处理数据输入之用,可以处理格式化或非格式化的输入动作,例如get(), read()及">>"等。
ostream类,主要供处理数据输出之用,可以处理格式化或非格式化的输出动作,例如put(),write()及"<<"等。
iostream类派生于istream和ostream类,因此,它将继承istream和ostream类的特性
ifstream和ofstream这两个类则分别派生于istream和ostream类,因此他们也将分别继承其基类的特性
下面来看下输入/输出所涉及到的方法:
1. 打开文件
void open(const char *_Filename, ios_base::open_mode _Mode)
void open(const char *_Filename,
ios_base::openmode _Mode = ios_base::in | ios_base::out,
int _Prot = (int)ios_base::_Openprot)
参数:
_Mode,文件打开模式
可选值有:
_Prot, 文件保护掩码,默认0666
2. 关闭文件
void close()
3. 读写文件
读写文件存在两种方式:以文本方式或二进制方式对文件的存取。如果简单地以文本方式存取文件,那么使用 << 和 >> 操作符实现就可以了;如果想以二进制方式对文件进行存取,就要借助其它的成员函数来实现了。
ostream& put ( char c );
int get();
从流中读取一个字符,并转换为int返回,如果到达文件尾,返回EOF。
istream& get ( char& c );
从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。
istream& get ( char* s, streamsize n );
把字符读入由 s指向的C数组,直到读入了 n-1 个字符或遇到了换行符'/n',再或者遇到文件结束。
istream& get ( char* s, streamsize n, char delim );
把字符读入由 s指向的C数组,直到读入了 n-1 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符'/n'。如果delim被发现delim本身并不被返回。
istream& get ( streambuf& sb );
把字符读入sb流缓存对象中,直到遇到了换行符'/n'或者遇到文件结束。
istream& get ( streambuf& sb, char delim );
把字符读入sb流缓存对象中,直到遇到了delim指定的字符或者遇到文件结束。
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );
把字符读入由 s指向的C数组,直到读入了 n-1 个字符或遇到了'/n'(如果没有指定delim)或者由 delim 指定的字符。
ostream& write ( const char* s , streamsize n );
istream& read ( char* s, streamsize n );
读取n个字符得数据块到s指向的C数组,但是不包含’/0’结束字符。如果在读到n个字符之前遇到了文件结束,failbit 或 eofbit 将设置,可以使用iso::fail 和iso::eof成员方法来检测。另外需要注意的是,在调用该方法之后需要调用istream::gcount 方法以获得剩余可读字符数
streamsize readsome ( char* s, streamsize n );
类似于read方法,但是最大的区别在于,当它遇到与当前流关联缓冲区结尾时返回,即使尚未到达文件结尾, 而read在这个时候会同步更新该缓冲区,即从文件中加载数据到缓冲区。该方法多用于处理异步源数据,以等待缓冲区数据的更新。由于该函数在读到关联缓冲区末尾,也就是缓冲区被耗尽时返回,所以应避免潜在的延迟问题。
istream& ignore ( streamsize n = 1, int delim = EOF );
忽略n个字符,直到读入了 n-1 个字符或遇到delim或文件结束
int peek ( );
返回下一个字符的值,但该字符并未从流中真正读取,即下次调用get方法可以得到这个字符。
istream& putback ( char c );
将get pointer回移一个字符,并使c字符成为下一个被读取得字符。
istream& unget ( );
将get pointer回移一个字符
streampos tellg ( );
获得get pointer当前绝对位置。
streampos tellp ( );
获得put pointer当前绝对位置。
istream& seekg ( streampos pos );
istream& seekg ( streamoff off, ios_base::seekdir dir );
设置get pointer位置
value | offset is relative to... |
ios_base::beg | beginning of the stream buffer |
ios_base::cur | current position in the stream buffer |
ios_base::end | end of the stream buffer |
ostream& seekp ( streampos pos );
ostream& seekp ( streamoff off, ios_base::seekdir dir );
设置put pointer位置
int sync ( );
同步关联源数据(如,文件中数据等)到输入缓冲区buffer中。
ostream& flush ( );
同步缓冲区buffer数据到关联数据源(如文件)
filebuf* rdbuf ( ) const;
获得与当前流所关联的缓冲区 filebuf 地址。
4. I/O 操作后的状态检测:
bool bad ( ) const;
检测badbit(致使的I/O错误)是否被设置
bool eof ( ) const;
检测eofbit是否被设置
bool fail ( ) const;
检测failbit(非致命的I/O错误)或者 badbit(致使的I/O错误)是否被设置
bool good ( ) const;
检测当前I/O操作是否正常, 如果error状态位没有被设置,则返回true
iostate rdstate ( ) const;
得到error状态flags
void setstate ( iostate state );
void clear ( iostate state = goodbit );
设置error状态flags