STL的流处理类学习

来源:互联网 发布:ubuntu装hadoop 编辑:程序博客网 时间:2024/06/05 10:56

概述

之前一直用STL提供的流处理类写一些代码,但也没有认真总结过,对于很多东西还是不理解,这两天看了一下做一些总结,总体的类图关系如下:


下面是借鉴网上的一张图,哪些类包含在哪里也写清楚了


这些流处理类大致可以分为三类:

1. iostream,主要是处理终端的输入输出,分为istream 和 ostream,是我们用的最多的,cin、cout、cerr都是内部定义的对象。

2. fstream,主要负责文件的读写操作,包括 ifstream、ofstream 和 fstream,但需要注意fstream是继承自iosstream的。

3. sstream, 主要负责字符串转换,可以替换scanf和printf,包括 stringstream、istringstream 和 ostringstream,注意stringstream也是继承自iostream的。 


iostream

这个比较熟悉,先不累赘了。


fstream

文件流主要是读写文件,ifstream用来读文件,ofstream用来写文件,fstream可以读写。
我们可以在构造函数里面关联文件,也可以定义对象之后调用open打开,处理完成之后调用close关闭。
open或者使用带参数的构造函数的时候
ofstream oftest;
oftest.open("test",ios::binary);//对于ofstream如果第二个参数不传默认是ios::out,并且是text方式打开

打开文件的方式在iOS类(所以流式I/O的基类)中定义,有如下几种方式:

ios::in为输入(读)而打开文件ios::out为输出(写)而打开文件ios::ate初始位置:文件尾ios::app所有输出附加在文件末尾ios::trunc如果文件已存在则先删除该文件ios::binary二进制方式
text方式和binary方式打开文件都是以一个字节为单位读取和写入的,但还是有区别的,主要区别是对于特殊字符的处理
1.text方式写入文件会将换行(/n)扩展成/r/n, 读文件时则自动转换回来
2.binary方式则不会作任何扩展,与读写内容一致
3.默认为text方式

两个简单的例子
#include <iostream>     // std::cout#include <fstream>      // std::ifstreamint main () {    std::ifstream iftest;  iftest.open ("test.txt", std::ifstream::in);  char c = iftest.get();  while (iftest.good()) {    std::cout << c;    c = iftest.get();  }  iftest.close();  return 0;}

#include <fstream>      // std::ofstreamint main () {  std::ofstream ofs;  ofs.open ("test.txt", std::ofstream::out | std::ofstream::app);  ofs << " more lorem ipsum";  ofs.close();  return 0;}
关于文件流可以参考 C++文件读写详解(ofstream,ifstream,fstream) 

sstream

关于sstream可以参考 【STL】ostringstream, istringstream, stringstream
strigstream, istringstream, ostringstream 可以在构造的时候传入string对象引用,也可以在定义之后调用str(string&)来绑定string。对于str()函数有三种用法:1)str()返回一个string内容的拷贝;2)str(string&)设置string内容,之前的内容会被丢弃;3)str("")清空内容

istringstream的默认分割符是空格,可以结构化一串以空格分开的数据,一个简单的例子
#include<iostream>#include<sstream>int main(){  istringstream istest;  istest.str("aa bb 55");  string strtmp;  while(istest >> strtmp)  {    cout << strtmp << endl;  }  return 0;}

ostringstream是用来格式化输出
#include<iostream>#include<sstream>int main(){  ostringstream ostest;  ostest << 12.5 << "," << "abc" <<endl;  cout << ostest.str();  return 0;}



0 0