I/O: std::basic_ios

class temlate std::basic_ios继承自std::ios_base,定义出与字符类型以及其相应之char_traits相依赖的stream class的共同属性,其中包括stream所用的缓冲器.

构造函数:

protected:
basic_ios();

public:
explicit basic_ios( std::basic_streambuf<CharT,Traits>* sb );


public:
basic_ios(const basic_ios& ) = delete;

默认构造函数: 是protected的意味着只有其派生类才能调用.

显式构造函数: 是public explicit的接受一个std::basic_streambuf作为参数.

拷贝构造函数: 为delete的因此是不支持拷贝的.

 

State member functions

bool good() const;
	

返回true表示std::ios::goodbit被设置.

如果该流最近的一次I/O操作成功的完成了,那么返回true,如果该流的states被设置了除std::ios::goodbit以外的其他states那么也会返回false.

 

bool eof() const;

返回true表示std::ios::endbit被设置.

如果流在读取数据的过程中到达了文件的尾部(end of file),那么该流的states就会被设置为std::ios::eof,同时该函数会返回true.

 

bool fail() const;
	

返回true表示std::ios::badbit或者std::ios::failbit被设置.

如果流在读取数据的过程中发生了错误,那么std::ios::badbit或者std::ios::failbit被设置,该函数都会返回true.

 

bool bad() const;
	

返回true,表示std::ios::badbit被设置,发生了毁灭性的错误.

 

std::ios::iostate rdstate() const;

返回当前stream已经设置的所有state.

 

void clear( std::ios_base::iostate s = std::ios_base::goodbit );
	

清除当前stream的已有state,并设置s作为作为当前流的state.

 

void setstate( iostate state );
	

给当前流加设state.

 

Format member functions

basic_ios& copyfmt(const basic_ios& other);
	

拷贝other中除了states和streambuf之外的其他任何flag(s),locale等等...

Demo:

#include <iostream>
#include <iomanip>
#include <fstream>

int main()
{
	std::basic_fstream<char> fstream;
	fstream.copyfmt(std::cout);
	
	fstream<< "shihua";
	
	fstream.clear(std::cout.rdstate());
	
	//注意std::basic_fstream使用的buf为std::basic_filebuf.
	//而std::cout使用的buf为std::basic_streambuf.
	//因此我们必须这么调用才能替换掉fstream的buf. 
	fstream.std::basic_ios<char>::rdbuf(std::cout.rdbuf());
	
	
	fstream << "woaini";
	
	return 0;
}

 

CharT fill() const;

CharT fill( char ch );
	

返回用于填充的字符.

设置新的填充字符,并返回设置前填充的字符.

 

Others:

std::ios_base::iostate exceptions() const;
	
void exceptions( std::ios_base::iostate except );

返回当前流的std::ios_base::iostate;

设置当前流的std::ios_base::iostate;

Demo:

#include <iostream>
#include <fstream>
 
int main() 
{
    int ivalue;
    try {
        std::ifstream in("in.txt");
        in.exceptions(std::ifstream::failbit);
        in >> ivalue;
    } catch (std::ios_base::failure &fail) {
        // handle exception here
    }
}

 

std::basic_ios::tie

std::basic_ostream<CharT,Traits>* tie() const;

std::basic_ostream<CharT,Traits>* tie( std::basic_ostream<CharT,Traits>* str );

1,通过tie()我们可以得到绑定到当前Stream上的一个 std::basic_ostream(输出流),

2,或者给当前Stream绑定一个std::basic_ostream.但是需要注意的是如果当前Stream绑定了一个std::basic_stream,那么每次在调用该Stream的时候都会调用std::basic_ostream的flush()来清空std::basic_ostream的缓冲区.

 

std::basic_ios::rdbuf

std::basic_streambuf<CharT, Traits>* rdbuf() const;
	 	
std::basic_streambuf<CharT, Traits>* rdbuf( std::basic_streambuf<CharT, Traits>* sb );

1,返回一个指针指向当前Stream安装的缓冲区.

2,给当前Stream安装一个新的缓冲区,并返回一个指针指向之前的缓冲区.

Demo:

#include <iostream>
#include <sstream>
 
int main()
{
    std::ostringstream local;
    auto cout_buff = std::cout.rdbuf(); // save pointer to std::cout buffer
 
    std::cout.rdbuf(local.rdbuf()); // substitute internal std::cout buffer with
        // buffer of 'local' object
 
    // now std::cout work with 'local' buffer
    // you don't see this message
    std::cout << "some message";
 
    // go back to old buffer
    std::cout.rdbuf(cout_buff);
 
    // you will see this message
    std::cout << "back to default buffer\n";
 
    // print 'local' content
    std::cout << "local content: " << local.str() << "\n";
}

 

std::basic_ios::narrow

char narrow( char_type c, char dfault ) const;
	

将当前Stream字符集中的字符C,转为char类型(如果没有对应的char字符,则返回dfault).

其实是相当于: std::use_facet< std::ctype<char_type> >(getloc()).narrow(c, dfault);

 

std::basic_ios::widen

char_type widen( char c ) const;
	

把char字符c转换为当前Stream字符集中的字符.

 

std::ios_base::state类型:

std::ios_base::goodbit 一切都好,没有任何其他bit被谁知.

std::ios_base::eofbit 遇到end-of-file

std::ios_base::failbit 错误;某个I/O动作未成功.

std::ios_base::badbit 毁灭性错误,造成不确定状态.

转载于:https://my.oschina.net/SHIHUAMarryMe/blog/745512

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值