C++方式的文件操作

来源:互联网 发布:win7rar解压软件 编辑:程序博客网 时间:2024/05/16 15:21

标准C++中所有的I/O操作都是以I/O Stream(“输入输出流”)为基础的,在流的实现上,采取了缓冲区I/O的方式,每个stream对象中都有一个streambuf,对于流的操作缺省状态下是对于缓冲区的操作。

在对流的操作中有两个重要的运算符:

1.         << 输入运算符,即向流输出数据

2.         >> 输出运算符,即从流中取出数据

 C++ I/O 结构

如上图,在C++中,对文件的操作你需要包含<fstream>头文件

 

I/O结构中,ios作为基类,包含如下两个派生类:

    istream类,主要供处理数据输入之用,可以处理格式化或非格式化的输入动作,例如get(), read()">>"等。

    ostream类,主要供处理数据输出之用,可以处理格式化或非格式化的输出动作,例如put(),write()"<<"等。

 

iostream类派生于istreamostream类,因此,它将继承istreamostream类的特性

ifstreamofstream这两个类则分别派生于istreamostream类,因此他们也将分别继承其基类的特性

 

下面来看下输入/输出所涉及到的方法:

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