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. IDEA的字体设置

    最后点击ok

  2. 牛客寒假算法基础集训营4 I题 Applese 的回文串

    链接:https://ac.nowcoder.com/acm/contest/330/I 来源:牛客网 自从 Applese 学会了字符串之后,精通各种字符串算法,比如--判断一个字符串是不是回文串. ...

  3. k3 Bos开发百问百答

              K/3 BOS开发百问百答   (版本:V1.1)           K3产品市场部       目录 一.基础资料篇__ 1 [摘要]bos基础资料的显示问题_ 1 [摘要]单 ...

  4. ES优化总结

    ES优化总结(特别是在bulk大量数据到ES的时候) https://blog.csdn.net/chenxun_2010/article/details/78602795 将 ELASTICSEAR ...

  5. WCF 非http寄宿IIS

    摘要 从IIS 7 开始, IIS增加了对非HTTP协议的支持. 因此, 自IIS 7之后, 可以将NetTcpBinding等非HTTP协议的Bindings直接寄宿在IIS上面. 本文将介绍如何在 ...

  6. 源码编译安装net-snmp

    https://blog.csdn.net/u013992330/article/details/79712405 https://wenku.baidu.com/view/24368a2257125 ...

  7. 从oracle到mysql

    过去四年一直是使用oracle,现在要开始使用mysql了,对于使用中发现的不同之处,我在此记录 mysql在linux下表名区分大小写,windows下表名不区分大小写 mysql没有number类 ...

  8. Jmeter入门(压力测试)

    Jmeter介绍 Jmeter是一款使用Java开发的,开源免费的,测试工具, 主要用来做功能测试和性能测试(压力测试/负载测试). 而且用Jmeter 来测试 Restful API, 非常好用. ...

  9. [转] 用webpack的CommonsChunkPlugin提取公共代码的3种方式

    方式一,传入字符串参数 new webpack.optimize.CommonsChunkPlugin(‘common.js’), // 默认会把所有入口节点的公共代码提取出来,生成一个common. ...

  10. Python_shutil模块

    import shutil 高级的文件,文件夹,压缩包的处理模块,也主要用于文件的拷贝 shutil.copyfileobj(fsrc,fdst[,length]): 将文件的内容拷贝到另一个文件(可 ...