C++ IO库


前言

  C++语言不直接处理输入输出,而是通过标准库中的类型处理IO。这些类型支持从设备读取数据、向设备写入数据的IO操作,设备可以是文件、控制台窗口等。还有一些类允许内存IO,即,从string读取数据,向string写入数据。


IO类

iostreamistream, ostream
fstreamifstream, ofstream
sstreamistringstream, ostringstream

IO对象无拷贝或赋值

流的条件

strm::iostateiostate是一种机器相关的类型
strm::badbit指出流已崩溃
strm::failbit指出一个IO操作失败了
strm::eofbit流达到了文件结束
strm::goodbit流未处于错误状态
s.eof()若流s的eofbit置位,则返回true
s.fail() 用它若流s的failbit或badbit置位,则返回true
s.bad()若流s的badbit置位,则返回true
s.good() 用它若流s处于有效位,则返回true
s.clear()将流复位返回void
s.clear(flags)根据flags复位
s.setstate(flags)
s.rdstate()返回流当前状态
auto old_state = cin.rdstate(); // 记住cin的当前状态
cin.clear();					// 使cin有效
process_input(cin);				// 使用cin
cin.setstate(old_state);		// 将cin置为原有状态

缓冲区操作

endlflushendsunitbufnounitbuf

文件输入输出

fstream特有操作
fstream fstrm;
fstream fstrm(s);
fstream fstrm(s, mod)
fstrm.open(s)
fstream.close()
fstream.is_pen()
fstream 具有和 iostream类一样的特性,即,可以把fsteam当iostream用
std::ifstream in(filename); // 创建一个ifstream对象,并自动调用.open打开filename
std::ofstream out;          // 创建一个ofstream对象
out.open(filename);
if (out){
    //如果out成功打开,则做一些事情
}
in.close();               // 此时if (in)条件位false

当fstream对象离开其作用域时,与之关联的对象会自动关闭
保险起见,养成 .close() 的习惯?

文件模式

// 同Python open
std::ofstream out;
out.open(file, std::ofstream::app); //追加模式

string流

sstream strm;
sstream strm(s);
strm.str()
strm.str(s)
struct PersonInfo{
    string name;
    vector<string> phone;
};
"istringstream在while内部:"
int main(){ 
    string line, word;
    vector<PersonInfo> peos;
    while (getline(cin, line)){
        std::istringstream isstrm(line);
        PersonInfo men;
        isstrm >> men.name;
        while (isstrm >> word){
            men.phone.push_back(word);
        }
        peos.push_back(men);
    }
    cout << "Input ended, Nowing output:\n";
    for (auto person: peos){
        cout << " print:" << endl;
        cout << person.name << endl;
    } 
return 0;}

"istringstream在while外部:"
std::istringstream isstrm;
string line, word;
vector<PersonInfo> peos;
while (getline(cin, line)){
    PersonInfo men;
    isstrm.clear();                   // 必须复位isstrm流,使其处于有效的状态
    isstrm.str(line);
    isstrm >> men.name;
    while (isstrm >> word){          // 检查流是否有效
        men.phone.push_back(word);
    }
    // 流处于无效的状态
    cout << "push_back" << endl;
    peos.push_back(men);
}

小结

  • iostream处理控制台IO
  • fstream处理文件IO
  • sstream完成内存string的IO

  fstream和sstream都继承自类iostream。

  当流的状态为有效时才能够进行正常的IO操作。

输入与输出都是站在内存的角度来看待的

ifstream打开文件后将其数据输入到内存,所以是读文件操作
ofstream打开文件后,将内存中的数据输出到文件,所以是写文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值