C++学习笔记55:流类库与输入输出
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:流类库与输入输出的更多相关文章
- java 学习笔记之 流、文件的操作
ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import ...
- [原创]java WEB学习笔记55:Struts2学习之路---详解struts2 中 Action,如何访问web 资源,解耦方式(使用 ActionContext,实现 XxxAware 接口),耦合方式(通过ServletActionContext,通过实现 ServletRequestAware, ServletContextAware 等接口的方式)
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- C++:流类库与输入输出
7.2.1 C++的输入输出流 ios:流基类(抽象类) istream:通用输入流类和其他输入流的基类 ostream:通用输出流类和其他输出类的基类 iostream:通用输入输出流类和其他输入输 ...
- java学习笔记--IO流
第十二章大纲: I/O input/output 输入/输出 一.创建文件,借助File类来实现 file.createNewFile() : 创建文件 file.exists() : 判断文件是否存 ...
- 学习笔记 --- 最大流Dinic算法
为与机房各位神犇同步,学习下网络流,百度一下发现竟然那么多做法,最后在两种算法中抉择,分别是Dinic和ISAP算法,问过 CA爷后得知其实效率上无异,所以决定跟随Charge的步伐学习Dinic,所 ...
- angular2 学习笔记 ( rxjs 流 )
RxJS 博大精深,看了好几篇文章都没有明白. 范围牵扯到了函数响应式开发去了... 我对函数式一知半解, 响应式更是第一次听到... 唉...不过日子还是得过...混着过先呗 我目前所理解的很浅, ...
- C++学习笔记1(标准的输入输出)
前言: 个人一直以来比较懒,最近才准备记录一下自己学习C++的学习过程,希望自己能在写博客的时候能够坚持下去,欢迎大家在博客中支出存在的问题,好了不多说了,自己能坚持下去.我准备在我的博客中通过与C语 ...
- Java 学习笔记 IO流与File操作
可能你只想简单的使用,暂时不想了解太多的知识,那么请看这里,了解一下如何读文件,写文件 读文件示例代码 File file = new File("D:\\test\\t.txt" ...
- web前端学习笔记-瀑布流的算法分析与代码实现
瀑布流效果目前应用很广泛,像花瓣,新浪轻博,蘑菇街,美丽说等好多网站都有.也有好多支持该效果的前段框架,今天学习了一下这种效果的实现,不依赖插件,自己动手分析实现过程,为了便于叙述清楚,分析中的一些名 ...
随机推荐
- python练习册0006
第 0006 题:你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都是英文,请统计出你认为每篇日记最重要的词. import re import os def get_li ...
- 个人笔记本安装多个jdk(jdk1.7,jdk1.8,jdk1.9,jdk10.0)出现的问题
1.个人笔记本已经安装jdk1.7,jdk1.8,(之前没有在意这个问题).最近想学习jdk10.0,安装以后,环境变量变成了jdk10.0,就是cmd输入命令java -version,显示版本是j ...
- SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问
SpringBoot学习(3)-SpringBoot添加支持CORS跨域访问 https://blog.csdn.net/yft_android/article/details/80307672
- Git Flow,Git团队协作最佳实践
规范的Git使用 Git是一个很好的版本管理工具,不过相比于传统的版本管理工具,学习成本比较高, 实际开发中,如果团队成员比较多,开发迭代频繁,对Git的应用比较混乱,会产生很多不必要的冲突或者代码丢 ...
- 解决win7 安装完jdk7后,再安装jdk8出现的问题 has value '1.8', but '1.7' is required.
http://blog.csdn.net/qiyueqinglian/article/details/46605759 电脑装了jdk8,JAVA_HOME也是设置的8. 不删除8变回7. 改了JAV ...
- IOS内存约定-【ios】
IOS中内存采用引用计数的方式,在释放内存编程时采用约定的方式,在这里不长篇大论具体内存的原理,只从实用角度出发记录下如何根据这些约定来释放内存. 具体约定为: 当你使用new.alloc.copy ...
- 【Android】Android WebView 网页输入框获取焦点
webView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEv ...
- Codeforces 1144G Two Merged Sequences dp
Two Merged Sequences 感觉是个垃圾题啊, 为什么过的人这么少.. dp[ i ][ 0 ]表示处理完前 i 个, 第 i 个是递增序列序列里的元素,递减序列的最大值. dp[ i ...
- Linux LVM动态扩容
引用自: https://blog.csdn.net/u012439646/article/details/73380197 xfs_growfs /dev/centos/root 一.首先安 ...
- POJ1469 COURSES 二分图匹配 匈牙利算法
原文链接http://www.cnblogs.com/zhouzhendong/p/8232649.html 题目传送门 - POJ1469 题意概括 在一个大矩阵中,有一些障碍点. 现在让你用1*2 ...