c++11标准模板库(STL) - 输入输出

2018-07-09 18:23:48

下面要介绍的 c++ 的流相关的库类似于c语言中的 stdio 库,目的是为了缓冲用户要输入输出的数据,在满足特定条件后一次性处理,减轻平凡的io而导致性能问题。

iostream  //输入输出流类
istream   //输入流类
ostream   //输出流类
ifstream  //输入文件流类
ofstream  //输出文件流类
fstream   //输入输出文件流类
filebuf   //文件流缓冲类
istringstream  //输入字符串流类
ostringstream  //输出字符串流类
stringstream   //输入输出字符串流类

stringbuf      //字符串缓冲类

//输入输出重定向
ofstream fout;
fout.open("out.txt");

ifstream fin;
fin.open("in.txt")

//获取文件输出缓冲区
auto *out_buf = fout.rdbuf();

//获取文件输入缓冲区
auto *in_buf = fin.rdbuf();

//全部重定向
cout.rdbuf(out_buf);        //设置输出buf
cerr.rdbuf(out_buf);        //设置错误buf
cin.rdbuf(in_buf);          //设置输入buf





[fstream]-----------------------------------------------------------------------------
#include <fstream>


ios::app          以追加的方式打开文件
ios::ate          文件打开后定位到文件尾,
ios:app             就包含有此属性
ios::binary        以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
ios::in           文件以输入方式打开(文件数据输入到内存)
ios::out         文件以输出方式打开(内存数据输出到文件)
ios::nocreate       不建立文件,所以文件不存在时打开失败
ios::noreplace      不覆盖文件,所以打开文件时如果文件存在失败
ios::trunc         如果文件存在,把文件长度设为0

ios::beg
ios::cur
ios::end
    


fstream file;
file.open("tmp.txt")        //默认为读写file.open("tmp.txt",ios::in|ios::out, 0)

file.read(char *, 10)
file.write(char *, 10)
file.getline(char *, 256)

file << "haha"              //写入缓冲区
file >> i                   //读取一行

file.eof()
file.good()
file.fail()
file.bad()
file.clear()                //设置goodbit

file.tellp()                //获取当前文件偏移量
file.seekp(10, ios::cur)    //从当前移动10个字符

file.close()

//fstream的子类-内存到文件
[ofstream]

ofstream file;
file.open("tmp.txt")        //默认为写打开




//fstream的子类-文件到内存
[ifstream]

ifstream file;
file.open("tmp.txt")        //默认为读打开






[[sstream]]----------------------------------------
#include <sstream>
[stringstream]

stringstream ss;
ss << "age: " << 22;
ss.str()                //返回string对象
ss.str(string &s)       //赋值到s
ss.str("")              //清空


例子-streambuf

#include <iostream>
#include <fstream>

int main () {
  char* contents;
  std::ifstream istr ("tmp.txt");

  if (istr) {
    //指针指向缓冲区
    std::streambuf * pbuf = istr.rdbuf();
    
    //移动到末尾并返回文件大小
    std::streamsize size = pbuf->pubseekoff(0,istr.end);
    pbuf->pubseekoff(0,istr.beg);       //移动到开头
    contents = new char [size];
    pbuf->sgetn (contents,size);
    istr.close();
    std::cout.write (contents,size);
    
    std::cout << size << std::endl;
    
    delete [] contents;
  }
  return 0;
}


详细用法请参照 http://www.cplusplus.com/reference/


 备注

1.编译器版本gcc4.8.5,运行环境centos7 64位
2.本文只做简单记录用,详细用法读者可以参考文中给出的链接
3..原文地址http://www.freecls.com/a/2712/98

  

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。