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. Update openssh7.9 on centos6

    一.制作RPM安装包1)依赖安装yum install rpm-build gcc make wget openssl-devel krb5-devel pam-devel libX11-devel ...

  2. 修改Elasticsearch的settings

    解决:Limit of total fields [1000] in index [nginx-access-log] has been exceeded" 的问题 PUT http://1 ...

  3. [转] react-router4 + webpack Code Splitting

    项目升级为react-router4后,就尝试着根据官方文档进行代码分割.https://reacttraining.com/react-router/web/guides/code-splittin ...

  4. combination sum(I, II, III, IV)

    II 简单dfs vector<vector<int>> combinationSum2(vector<int>& candidates, int targ ...

  5. Centos7编译安装GCC7.2

    通常编译的时候可能需要新版本的gcc,本文就说明下基于低版本的gcc升级为gcc7.2 wget 'http://mirrors-usa.go-parts.com/gcc/releases/gcc-7 ...

  6. 选择结构switch

    1.选择结构switch switch 条件语句也是一种很常用的选择语句,它和if条件语句不同,它只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码.例如,在程序中使用数字1~7来表示星期一到 ...

  7. bzoj4520【CQOI2016】K远点对

    题解: kd-tree裸题 对每个点维护最近的k个开个堆维护一下

  8. python基础——字符串、编码、格式化

    1.三种编码:ascii Unicode utf8 2.字符串和编码数字的两个函数:ord(字符转数字ord(‘A’)=65)和 chr(数字转字符chr(65)=A) 3.bytes存储编码,记住两 ...

  9. Python_序列化和反序列化模块

    序列化:将对象转换为可通过网络传输或可存储到本地磁盘的数据格式的转换过程,称为序列化,反之,称为反序列化 json: 用来实现不同语言,不同程序直接的信息交互,json支持所有高级语言之间的序列化交互 ...

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

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