【C++】C++中的流
目录结构:
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++中的流的更多相关文章
- [Node.js] Node.js中的流
原文地址:http://www.moye.me/2015/03/29/streaming_in_node/ 什么是流? 说到流,就涉及到一个*nix的概念:管道——在*nix中,流在Shell中被实现 ...
- 理解Java中字符流与字节流的区别
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常)
.NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常) 前段时间项目使用一次性读去SQL Server中保存的电子文件的文件流然后返回给客户端保存下载电子文件, ...
- 谈一谈Java8的函数式编程(二) --Java8中的流
流与集合 众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...
- Java中IO流的总结
有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...
- java中有关流操作的类和接口
一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...
- ASP.NET Core SignalR中的流式传输
什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时 ...
- node.js中stream流中可读流和可写流的使用
node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...
- Java中IO流中的装饰设计模式(BufferReader的原理)
本文粗略的介绍下JavaIO的整体框架,重在解释BufferReader/BufferWriter的演变过程和原理(对应的设计模式) 一.JavaIO的简介 流按操作数据分为两种:字节流与字符流. 流 ...
- mongoose中的流查询stream query
mongoose中的流查询stream query,功能类似于php中的mysql_fetch_array,每次从集合中获取一条记录(文档) var cursor = Person.find({ oc ...
随机推荐
- Ef 自动迁移,日志
Ef 迁移 在vs打开程序控制台 2,选择程序集 ,如果是初次,输入 Enable-Migrations,启动迁徙 3 添加迁移,完成修改 4,之后会自动生成迁移配置文件. 然后再上下文类中加入 两 ...
- Spring Boot 项目实战(四)集成 Redis
一.前言 上篇介绍了接口文档工具 Swagger 及项目监控工具 JavaMelody 的集成过程,使项目更加健壮.在 JAVA Web 项目某些场景中,我们需要用缓存解决如热点数据访问的性能问题,业 ...
- 依赖配置中心实现注有@ConfigurationProperties的bean相关属性刷新
配置中心是什么 配置中心,通过key=value的形式存储环境变量.配置中心的属性做了修改,项目中可以通过配置中心的依赖(sdk)立即感知到.需要做的就是如何在属性发生变化时,改变带有@Configu ...
- Java内存管理-你真的理解Java中的数据类型吗(十)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 作为Java程序员,Java 的数据类型这个是一定要知道的! 但是不管是那种数据类型最 ...
- Linux安装Elasticsearch
本文介绍Linux环境如何安装Elasticsearch. 本文环境是在腾讯云服务器CentOS7.2搭建的,JDK1.8,elasticsearch-5.4.2. 1 安装JDK 网上教程很多,也可 ...
- angular笔记_1
第一个angular文件<script src="http://cdn.static.runoob.com/libs/angular.js/1.4.6/angular.min.js&q ...
- 【DWM1000】 code 解密10 一 TAG 发送最后一个消息
更上面ANCHOR发送信息时的RTLS_DEMO_MSG_ANCH_RESP, 我们很快就可以找到如下代码 case RTLS_DEMO_MSG_ANCH_RESP: { 这里面一部分是设置重要变量, ...
- STM32——C语言课堂原代码
指针 /* ============================================================================ Name : Hello.c Au ...
- mac中安装 RabbitMQ
1.brew install rabbitmq 2.安装后,进入/usr/local/Cellar/rabbitmq/3.7.7 ,输入:sbin/rabbitmq-server 出现下面日志,说明启 ...
- React性能优化记录(不定期更新)
React性能优化记录(不定期更新) 1. 使用PureComponent代替Component 在新建组件的时候需要继承Component会用到以下代码 import React,{Componen ...