I/O流的概念及流类库的结构

程序与外界环境的信息交换

当程序与外界环境进行信息交换时,存在着两个对象:程序中的对象,文件对象。

流是一种抽象,负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动;

流对象与文件操作

程序建立一个流对象

指定这个流对象与某个文件对象建立连接

程序操作流对象

流对象通过文件系统对所连接的文件对象产生作用

提取与插入

读操作在流数据抽象中被称为从流中提取;

写操作被称为向流中写入;

最重要的三个输出流:
ostream

ofstream

ostringstream

预先定义的输出流对象

cout标准输出

cerr标准错误输出,没有缓冲,发送给它的内容立即被输出

clog类似cerr,但是有缓冲,缓冲区慢了才输出;

标准输出换向

ofstream fout("b.out");

streambuf *pOld = cout.rdbuf(fout.rdbuf());

//...

cout.rdbuf(pOld);

构造输出流对象

ofstream myFile("filename");

或者

ofstream myFile;

myFile.open("filename");

备注:构造对象时或者用open打开文件时可以指定模式

ofstream myFile("filename",ios_base::out | ios_base::binary);

文件输出流成员函数的三种类型

与操作符等价的成员函数

执行非格式化写操作的成员函数

其他修改流状态且不同于操作符或者插入运算符的成员函数

文件输出流的成员函数

open函数:把流与特定的磁盘文件关联起来,需要指定打开模式;

put函数

把一个字符写到输出流中

write函数:把内存中的一块内容写到一个文件输出流中

seekp和tellp函数:操作文件流的内部指针

close函数:关闭与一个文件输出流关联的磁盘文件

错误处理函数:在写到一个流时进行错误处理

向文本文件输出

使用ofstream构造函数中的模式参量指定二进制输出模式

以通常方式构造一个流,然后使用setmode成员函数,在文件打开后改变模式;

通过二进制文件输出流对象完成输出

向二进制文件输出

#include <fstream>
using namespace std; struct Date {
int mon, day, year;
}; int main()
{
Data dt = { ,,};
ofstream file("data.dat", ios_base::binary);
file.write(reinterpret_cast<char *>(&dt), sizeof(dt));
file.close();
return ;
}

向字符串输出

将字符串作为输出流的目标,可以实现将其他数据类型转换为字符串的功能

字符串输出流(ostringstream)

用于构造字符串

支持ofstream类的除open,close外的所有操作;

str函数可以返回当前已构造的字符串

典型应用:将数值转化为字符串

使用ostringstream将数值转换为字符串

#include <iostream>
#include <sstream>
#include <string>
using namespace std; template <class T> inline string toString(const T &v)
{
ostringstream os;
os << v;
return os.str();
} int main()
{
string str1 = toString();
cout << str1 << endl;
string str2 = toString(20.2);
cout << str2 << endl;
return ;
}

输入流

  • istream类最适合用于顺序文本模式输入。cin是其实例。
  • ifstream类支持磁盘文件输入
  • 提取运算符(>>)对于所有标准C++数据类型都是预先设计好的

输入流相关函数

open把该流与一个特定磁盘文件相关联

get功能与提取运算符很像,主要的不同点是get函数在读入数据时包括空白字符

getline功能是从输入流中读取多个字符,并且允许指定输入终止符,读取完成后,从读取的内容中删除终止符;

read从一个文件读字节到一个指定的内存区域,由长度参数确定要读写的字节数。当遇到文件结束符或者在文本模式文件中遇到文件结束标记符时结束读取;

seekg用于设置文件输入流中读取数据位置的指针

tellg返回当前读指针的位置

close关闭与一个文件输入流关联的磁盘文件

//get函数使用举例
#include <iostream>
using namespace std;
int main()
{
char ch;
while ((ch = cin.get() != EOF))
{
cout.put(ch);
}
return ;
}
//为输入流指定一个终止符
#include <iostream>
#include <string> using namespace std; int main()
{
string line;
cout << "Type a line terminated by 't' " << endl;
getline(cin, line, 't');
cout << line << endl;
return ;
}

例子:若在控制台输入“hello world”,则程序的输出是:(空格为终止符)

#include<iostream>
#include<string>
using namespace std;
int main(){
string line;
getline(cin, line, ' ');
cout << line << endl;
return ;
}

从字符串输入

将字符串作为文本输入流的源,可以将字符串转换为其他类型

字符串输入流(istringstream)

用于从字符串读取数据

在构造函数中设置要读取的字符串

功能:

支持ifstream类的除open,close外的所有的操作;

//用istringstream将字符串转化为数值
template <class T> inline T fromString(const string &str)
{
istringstream is(str);
T v;
is >> v;
return v;
} int main()
{
int v1 = fromString<int>("");
cout << v1 << endl;
double v2 = fromString<double>("1.2");
cout << v2 << endl;
return ;
}

C++学习笔记55:流类库与输入输出的更多相关文章

  1. java 学习笔记之 流、文件的操作

    ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import ...

  2. [原创]java WEB学习笔记55:Struts2学习之路---详解struts2 中 Action,如何访问web 资源,解耦方式(使用 ActionContext,实现 XxxAware 接口),耦合方式(通过ServletActionContext,通过实现 ServletRequestAware, ServletContextAware 等接口的方式)

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. C++:流类库与输入输出

    7.2.1 C++的输入输出流 ios:流基类(抽象类) istream:通用输入流类和其他输入流的基类 ostream:通用输出流类和其他输出类的基类 iostream:通用输入输出流类和其他输入输 ...

  4. java学习笔记--IO流

    第十二章大纲: I/O input/output 输入/输出 一.创建文件,借助File类来实现 file.createNewFile() : 创建文件 file.exists() : 判断文件是否存 ...

  5. 学习笔记 --- 最大流Dinic算法

    为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...

  6. angular2 学习笔记 ( rxjs 流 )

    RxJS 博大精深,看了好几篇文章都没有明白. 范围牵扯到了函数响应式开发去了... 我对函数式一知半解, 响应式更是第一次听到... 唉...不过日子还是得过...混着过先呗 我目前所理解的很浅,  ...

  7. C++学习笔记1(标准的输入输出)

    前言: 个人一直以来比较懒,最近才准备记录一下自己学习C++的学习过程,希望自己能在写博客的时候能够坚持下去,欢迎大家在博客中支出存在的问题,好了不多说了,自己能坚持下去.我准备在我的博客中通过与C语 ...

  8. Java 学习笔记 IO流与File操作

    可能你只想简单的使用,暂时不想了解太多的知识,那么请看这里,了解一下如何读文件,写文件 读文件示例代码 File file = new File("D:\\test\\t.txt" ...

  9. web前端学习笔记-瀑布流的算法分析与代码实现

    瀑布流效果目前应用很广泛,像花瓣,新浪轻博,蘑菇街,美丽说等好多网站都有.也有好多支持该效果的前段框架,今天学习了一下这种效果的实现,不依赖插件,自己动手分析实现过程,为了便于叙述清楚,分析中的一些名 ...

随机推荐

  1. 51 NOd 2006 飞行员配对(匈牙利算法二分匹配)

    题目来源: 网络流24题 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏  关注 第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一 ...

  2. 将txt文本转换为excel格式

    将txt文本转换为excel格式,中间使用的列分割为 tab 键 一.使用xlwt模块 注:Excel 2003 一个工作表行数限制65536,列数限制256 需要模块:xlwt 模块安装:xlwt ...

  3. github.com加速节点

    github.com加速节点 192.30.253.118 github.com192.30.253.119 github.com93.46.8.89 github.com

  4. MyBatis - 1.入门

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyBatis可以使用简单的XML或注解 ...

  5. Caused by: java.net.ConnectException: Connection refused/Caused by: java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    1.使用sqoop技术将mysql的数据导入到Hive出现的错误如下所示: 第一次使用命令如下所示: [hadoop@slaver1 sqoop--cdh5.3.6]$ bin/sqoop impor ...

  6. @transactional注解下失效

    这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性 先来了解一下@Transactio ...

  7. JSP基础知识➣获取参数和过滤器(四)

    JSP表单提交和参数获取 JSP表单提交的两种方式:post和get,通过这两种方式提交的参数到后台,获取参数的值主要由request来处理,获取值的方式有以下几种: getParameter():  ...

  8. MUI组件四:选择器、滚动条、单选框、区域滚动和轮播组件

    目录(?)[+]   1.picker(选择器) mui框架扩展了pipcker组件,可用于弹出选择器,在各平台上都有统一表现.poppicker和dtpicker是对picker的具体实现.*pop ...

  9. 手机端-ajax跨域请求滚屏分页

    近期做了一个关于信息展示的详情页面,将里面能够提升用户体验的小点写出来 1.当页面请求新的数据,或上传数据的时候 放一个loading.gif的过渡,告诉用户 你的操作已经完成,正在加载中 2.当所有 ...

  10. 2018牛客网暑假ACM多校训练赛(第四场)A Ternary String 数论

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-A.html 题目传送门 - https://www.no ...