目录结构:

contents structure [-]

1.IO类

除了istream和ostream之外,标准库还定义了其它的一些类型。如下表:

头文件 类型
iostream

istream,wistream 从流读取数据

ostream,wostream 向流写入数据

iostream,wiostream 读写流

fstream

ifstream,wifstream 从文件读取数据

ofstream,wofstream 向文件写入数据

fstream,wfstream 读写文件

sstream

istringstream,wistringstream 从string读取数据

ostringstream,wostringstream 向string写入数据

stringstream,wstringstream 读写string

为了支持宽字符的语言,标准库还定义了一组类型和对象来操作wchar_t类型的数据。宽字符版本和函数的名字以一个w开始。例如,wcin,wcout和cerr,分别对应cin,cout,cerr的宽字符版本。

下面这种图片更详细的列举了,c++中流的基本体系:

1.1 IO对象无拷贝状态

不能拷贝和对IO对象赋值:

fstream out1,out2;
out1 = out2; //错误,不能对流对象赋值
ofstream print(ofstream); //错误,不能初始化ofstream参数
out2 = print(out2); //错误,不能拷贝流对象

由于不能拷贝IO对象,因此我们也不能将形参或返回类型设置为流类型。进行IO操作的函数通常以引用的方式传递和返回流。

1.2 条件状态

C++类提供了一些列的函数和标志,可以帮助我们访问和操纵流的条件状态,下表列举了一些函数和标志:

strm::iostate strm流的iostate类静态成员,提供了表达式状态的完整功能
strm::badbit strm流的badbit类静态成员,指出流已经崩溃
strm::failbit strm流的failbit类静态成员,指出流操作失败了
strm::eofbit strm流的eofbit类静态成员,指出流达到了文件末尾
strm::goodbit strm流的goodbit类静态成员,指出流处于正常状态,未发生任何错误
s.eof() 若流s的eofbit置位,则返回true
s.fail() 若流s的failbit或badbit置位,则返回true
s.bad() 若流s的badbit置位,则返回true
s.good() 若流s处于有效状态,则返回true
s.clear() 将流s中的所有条件状态位复位,将流的状态设置为有效。
s.clear(flags) 根据给定的flags标志位,将流s中对应的条件状态位复位。flags的类型是strm::flags
s.setstate(flags) 根据给定的flags标志位,将流s中的对应条件状态位置位。flags的类型是strm::flags
s.rdstate() 返回流s的当前条件状态,返回值类型为strm::iostate。

我们可以使用如下的代码判断流的状态:

std::ifstream strm;
if(strm.good()){
//继续操作
}

由于流重载了布尔运算符,

explicit operator bool() const;

如果failbit和badbit被置位,则返回false。否则返回true。

有了布尔运算符,我们就可以轻松的判断流的状态。

  std::ifstream is;
is.open ("test.txt");
if (is) { //编译器会编译为if(is.good())
// 操作文件
}
else {
std::cerr << "Error opening 'test.txt'\n";
}

2.文件流

头文件fstream定义了三个类型来支持文件IO,ifstream从一个给定的文件读取数据,ofstream从一个向一个给定的文件写入数据,以及fstream可以读写文件。

读写文件的步骤:
1.创建文件流对象
2.打开文件
3.读写数据
4.关闭文件

例如:

#include <fstream>      // std::fstream

int main () {
std::fstream fs;//创建对象
fs.open ("test.txt");//打开文件
fs << " more lorem ipsum";//写入数据
fs.close();//关闭文件
return ;
}

2.1 文件模式

每个流都有一个关联的模式,用来指出如何使用文件。例如:

in 以读的方式打开
out 以写的方式打开
app 每次写操作前均定位到文件末尾
ate 打开文件立即定位到文件末尾
trunc 截断文件
binary 以二进制方式进行

当打开一个文件的时候,可以指定一个文件模式,指定模式有如下限制:
1.只可以对ofstream或fstream对象设定out模式
2.只可以对ifstream或fstream对象设定in模式
3.只有当out模式被设定时才可以设定trunc模式
4.只要trunc没有被设定,就可以设定app模式。在app模式下,即使没有显式指定out模式,文件也总是以输出方式打开。
5.默认情况下,即使我们没有指定trunc模式,以out模式打开的文件也会被截断。为了保留以out模式打开的文件的内容,我们必须同时指定app模式,这样只会将数据追加到文件末尾;或者同时指定in模式,即打开文件同时进行读写操作
6.ate和binary模式可以用于任何类型的文件流对象,且可以与其他任何文件模式组合使用。

每个文件流都有一个默认的文件模式,ifstream关联的文件默认以in模式打开,ofstream关联的文件默认以out模式打开,fstream关联的文件默认以in和out模式打开。

例如:

ofstream out; // 未指定文件打开模式
out.open("test.txt"); // 模式隐含设置为输出和截断
out.close(); // 关闭out
out.open("test2.txt",ofstream::app); //模式为输出和追加
out.close(); //关闭out

3.string流

sstring头文件定义了三个类型来支持内存IO操作,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样。

istringstream从string读取数据,ostringstream向string写入数据,stringstream既可以向string写入数据也可以向string读取数据。

下面是关于stringstream的常规操作:

sstream strm 是一个未绑定的stringstream对象
sstream strm(s) strm是一个stringstream对象,保存了string s的拷贝。
strm.str() 返回strm所保存的string的拷贝
strm.str(s) 将string s拷贝到stream中

例如:

#include <string>       // std::string
#include <iostream> // std::cout
#include <sstream> // std::stringstream, std::stringbuf int main () {
std::stringstream ss; //创建stringstream对象 ss.str ("Example string"); //将字符串拷贝到stringstream中 std::string s = ss.str(); //获得stringstream中保存的字符串
std::cout << s << '\n'; //输出 std::string word;
while(ss >> word)//从stringstream中读取每一个单词
std::cout << word << '\n'; std::cout << std::endl;
return ;
}

【C++】C++中的流的更多相关文章

  1. [Node.js] Node.js中的流

    原文地址:http://www.moye.me/2015/03/29/streaming_in_node/ 什么是流? 说到流,就涉及到一个*nix的概念:管道——在*nix中,流在Shell中被实现 ...

  2. 理解Java中字符流与字节流的区别

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  3. .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常)

    .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常) 前段时间项目使用一次性读去SQL Server中保存的电子文件的文件流然后返回给客户端保存下载电子文件, ...

  4. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  5. Java中IO流的总结

    有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...

  6. java中有关流操作的类和接口

    一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...

  7. ASP.NET Core SignalR中的流式传输

    什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时 ...

  8. node.js中stream流中可读流和可写流的使用

    node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...

  9. Java中IO流中的装饰设计模式(BufferReader的原理)

    本文粗略的介绍下JavaIO的整体框架,重在解释BufferReader/BufferWriter的演变过程和原理(对应的设计模式) 一.JavaIO的简介 流按操作数据分为两种:字节流与字符流. 流 ...

  10. mongoose中的流查询stream query

    mongoose中的流查询stream query,功能类似于php中的mysql_fetch_array,每次从集合中获取一条记录(文档) var cursor = Person.find({ oc ...

随机推荐

  1. ZOJ 1610 Count the Colors 【线段树】

    <题目链接> 题目大意: 在[0,8000]这个区间内,不断进行一些操作,将其中的一些区间染成特定颜色,如果区间重复的话,后面染的色块会覆盖前面染的色块,问最终[0,8000]这个区间内每 ...

  2. CVE-2011-0762环境搭建与EXP利用

    CVE-2011-0762 vsftpd拒绝服务漏洞 危害:通过发送特殊构造的数据包.利用漏洞使应用程序崩溃 条件:连接上vsftpd才能发包 发现时间:2011-03-01 需求:找到EXP运行发送 ...

  3. [译]the cost of javascript in 2018(1)

    前言 为了构建交互性网站,我们需要发送js给我们的用户,但很多情况下,我们使用了太多js. 在移动端,经常看到只加载了个点击链接或者滚动不了的情况. 实话说,js仍然是移动端最昂贵的资源,因为其在很大 ...

  4. linux学习笔记 ftp命令

    ftp server with sites et up for downloaing files sometimes provides an anonymous ftp account 数据传输 ft ...

  5. Word技巧【转载】

    Word谁都会用,高手和菜鸟最明显的区别就是效率,有人可以轻车熟路一小时做完好几份Word,有人加班到深夜手酸脖子疼还没做好一份,不管用什么办公软件,效率都是第一追求.先看第一点:   ❶如何快速选中 ...

  6. 835.Hamming距离

    描述 两个整数的Hamming距离是对应比特位不同的个数. 给定两个整数x和y,计算两者的Hamming距离. 0 ≤ x, y < 2^31. 您在真实的面试中是否遇到过这个题? 样例 输入: ...

  7. c++ STL 数据结构底层结构

    + STL 的实现: 1.vector 底层数据结构为数组 ,支持快速随机访问 2.list 底层数据结构为双向链表,支持快速增删 3.deque 底层数据结构为一个中央控制器和多个缓冲区,详细见ST ...

  8. 给有C或C++基础的Python入门 :Python Crash Course 1 - 3

    暑假ACM集训结束,预习下个学期要学习的Python. 前几章比较基础,玩玩学学很快学完了,这里随意写点收获. 第一章 搭建编译环境   用的是最新的Python3.编译器用的是推荐的Geany..具 ...

  9. js 函数与类的区别

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. react-native-background-job——让你的react-native项目实现后台运行

    安排在您的应用处于后台时运行JavaScript的后台任务. 即使应用程序已关闭,任务也会运行,默认情况下,也会在重新启动后继续存在. 这个库依赖于React Native的HeadlessJS ,目 ...