C++Primer 5th Chap8 The IO Library
IO类:
头文件 | 类型 |
iostream | istream,从流读取数据 |
ostream,向流写入数据 | |
iostream,读写流 | |
fstream | ifstream,从文件读取数据,默认in模式打开 |
ofstream,向文件写入数据,默认out模式打开 | |
fstream,读写文件,默认in和out模式打开 | |
sstream |
istringstream,从string读取数据 |
ostringstream,向string写入数据 | |
stringstream,读写string |
宽字符(wchar_t)版本的类型和函数在名称开头多一个w
普通流、文件流、string流和宽字符流版本的使用方法一致
IO对象无拷贝和赋值,进行IO操作的函数通常以引用方式传递和返回流,而且引用不能是const的
IO库条件状态表
strm::iostate | strm是一种IO类型(见上表),iostate是反映条件状态完整功能的一种类型(包含下面4个constexpr值) |
strm::badbit | 流已崩溃 |
strm::failbit | IO操作失败 |
strm::eofbit | 流到达文件结束 |
strm::goodbit | 流未处于错误状态,值为0 |
s.eof() | 流s的eofbit置位,返回true |
s.fail() | 流s的failbit或badbit置位,返回true |
s.bad() | 流s的badbit置位,返回true |
s.good() | 流s处于有效状态,返回true |
s.clear() | 流s中的所有条件状态位复位,设置流的状态为有效,返回void |
s.clear(flags) | flags类型为strm::iostate,根据flags标志位将流s的对应条件状态位复位 |
s.setstate(flags) | flags类型为strm::iostate,根据flags标志位将流s的对应条件状态位复位 |
s.rdstate() | 返回流s的当前条件状态,返回类型strm::iostate |
确定一个流对象的状态的最简单方法是将它作为一个条件使用:
while(cin>>word){/*.....*/}
管理条件状态:
一旦badbit被置位,流就无法再使用;
如果failbit被置位,说明流发生了可恢复的错误;
到达文件结尾,failbit和eofbit都被置位;
if( cin >> s )等价于if ( ! s.fail ( ) )
使用方法如下:
#include<iostream>
#include<cstring>
using namespace std;
int main(){
string str;
auto old_state=cin.rdstate();//获取原有状态
cin.clear();//cin有效化
getline(cin,str);
cin.setstate(old_state);//置cin为原有状态
cin.clear(cin.rdstate()&~cin.failbit&~cin.badbit);//在保持其他位不变时,复位failbit和badbit
}
刷新输出缓冲区:
#include<iostream>
using namespace std;
int main(){
cout<<"Sieg"<<endl;//输出换行,然后刷新缓冲区
cout<<"Heil"<<flush;//刷新缓冲区并且不附加任何字符
cout<<"!"<<ends;//输出空字符,然后刷新缓冲区
cout<<unitbuf;//其后所有输出操作后都刷新缓冲区
cout<<nounitbuf;// 其后所有输出操作后都进行正常缓冲模式(用于终止unitbuf)
}
关联输入和输出流:
#include<iostream>
using namespace std;
int main(){
//x.tie(&os);关联x到输出流os
cin.tie(&cout);//关联流cin到输出流cout
ostream *old_tie=cin.tie(nullptr);//cin不与其他流关联
cin.tie(&cerr);//关联流cin到输出流cerr(仅作为例子,不建议这样做)
cin.tie(old_tie);//cin不与其他流关联(正常情况下的cin与cout的关系)
}
每个流只能关联到一个流,而多个流可以关联到同一输出流
文件输入输出:
fstream fstrm; | 建立一个未绑定的文件流,名为fstrm, |
fstream fstrm(s); | 建立一个绑定文件(名为s,s是string或者c风格字符指针)文件流,默认文件模式 |
fstream fstrm(s,mode); | 建立一个绑定文件的文件流,文件模式指定为mode |
fstrm.open(s); | 打开文件s,并使文件与流fstrm绑定,返回void |
fstrm.close(); | 关闭与流绑定的文件,返回void |
fstrm.is_open(); | 指出与流关联的文件是否成功打开且未关闭,返回bool |
具体使用:
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
int main(int argc,char *argv[]){
string ifile="iofile.txt";
ifstream in(ifile);//ifstream打开指定文件
ofstream out;//输出文件流不关联任何文件
out.open(ifile+".copy");//打开指定文件
if(out){//检查打开成功与否
cout<<ifile;
in.close();//关闭文件
in.open(ifile+""); //打开另一文件
}
}
文件模式:
in | 以读方式打开,仅限fstream对象和ifstream对象 |
out | 以写方式打开,仅限fstream对象和ofstream对象,自动截断文件(即使没设定trunc)(为防止截断文件,需要同时设定为in或app) |
app | 每次写操作前都定位到文件末尾,自带out模式,仅限未设定trunc时才能使用 |
ate | 打开文件后立即定位到文件末尾 |
trunc | 截断文件,仅限out也被设定时才能使用 |
binary | 以二进制方式进行IO |
//指定模式打开文件
ofstream out1("File1");//
ofstream out2("File2",ofstream::out);
ofstream out3("File3",ofstream::out|ofstream::app);
string流:
sstream strm; | strm是一个未绑定的stringstream对象 |
sstream strm(s); | strm保存string s 的一个拷贝(构造函数explicit) |
strm.str(); | 返回strm保存的拷贝 |
strm.str(s); | 将string s 拷贝到strm,返回void |
#include<iostream>
#include<sstream>
#include<vector>
#include<string>
using namespace std;
struct PersonInfo{
string name;
vector<string> phones;
};
int main(int argc,char*argv[]){
string line,word;
vector<PersonInfo> people;
while(getline(cin,line)){
PersonInfo info;
istringstream record(line);
record>>info.name;
while(record>>word){
info.phones.push_back(word);
}
people.push_back(info);
}
for(const auto &entry:people){
ostringstream formatted,badNums;
for(const auto &nums:entry.phones){
if(!valid(nums)){
badNums<<" "<<nums;
}
else{
formatted<<" "<<format(nums);
}
}
if(badNums.str().empty()){
cout<<entry.name<<" "
<<formatted.str()<<endl;
}
else{
cerr<<"Input error: "<<entry.name
<<" invalid number(s) "<<badNums.str()<<endl;
}
}
}
上述代码为sstream完整的实现流程
C++Primer 5th Chap8 The IO Library的更多相关文章
- C++Primer 5th 练习 12.19
这阵子真是太忙了, 连续做了四个课设. 当然这并不能作为好久没写博客的借口, 没写博客的主要原因只有一个: 懒. 最近又开始回顾C++的语法与特性(据说C++就是一门需要反复回顾的语言),以及学习C+ ...
- 【读书笔记】C++ primer 5th 从入门到自闭(一)
这几天看了C++ primer 5th的一二章,有很多收获,但是有的地方因为翻译的问题也搞得理解起来颇为难受啊啊啊啊.尤其是const限定符,在C语言并没有这么多复杂的语法,在C++里面语法细节就多的 ...
- C++ Primer 5th 第8章 IO库
IO类对象不允许进行拷贝操作. IO类中定义后一些函数和标志,可以用于访问和操作流的状态. 一旦流发生错误,后续IO操作都是失败的. 读写IO对象会改变IO对象的状态. 每个输出流都管理一个缓冲区. ...
- C++ Primer 5th 第1章 开始
*****代码在Ubuntu g++ 5.31 / clang++ 3.8(C++11)下编写调试***** 每个C++程序必须有一个main( )函数,main( )函数的返回值也必须是int类型, ...
- C++ Primer 5th Edition自学笔记(1)
好吧,第一次写东西...如何下手呢...(请无视) -------------------------------------------------------------- Chapter 1. ...
- 学习 primer 第8章 IO库 小结
iostream处理控制台IO fstream处理命名文件IO stringstream完成内存string的IO 非常重要!!!!!!!!!! ========================== ...
- C++ Primer 5th Chap1.Getting Started
在CommandPrompt上:(即cmd) 假定文件名为prog1.cc: 编译:$Compiler'sName prog1.cc 打开(prog1.exe):$prog1 打开(在当前目录):$. ...
- C++Primer,C++标准IO库阅读心得
IO 标准库类型和头文件 iostream istream 从流中读取 ostream 写到流中去 iostream 对流进行读写:从 istream 和 ostream 派生而来fstream if ...
- [C++ Primer] 第8章: IO库
IO类 iostream定义了读写流的基本类型 istream, wistream 从流读取数据 ostream, wostream 向流写入数据 iostream, wiostream 读写流 fs ...
随机推荐
- hdu6468(记忆化搜索)
zyb的面试 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- Spring和Quartz整合实现定时任务调度
在Spring中可以很方便的使用Quartz来实现定时任务等功能,Quartz主要就是Schedule(任务调度器),Job(作业任务)和Trigger(触发器)三者的关系. 实现方式有多种,在此就介 ...
- php手记之02-tp5请求参数读取三种方式
01-[推荐方式] 当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息.在Thinkphp5.1中,获取请求对象数据,是由think\Request类负责,在很多场合下并不需 ...
- matlab中x.^2与x^2有什么区别?
.^2是矩阵中的每个元素都求平方,^2是求矩阵的平方或两个相同的矩阵相乘,因此要求矩阵为方阵,且看下面的例子x=1:4x = 1 2 3 4 x.^2 ans = 1 4 9 16 x^2 Error ...
- Ionic4.x 中的 UI 组件(UI Components)表单相关组件
1.ion-input 单行文本框 2.ion-toggle 开关 3.ion-radio-group.ion-radio 单选按钮组 4.ion-checkbox 多选按钮组 5.ion-selec ...
- java类什么时候加载?,加载类的原理机制是怎么样的?
java类什么时候加载?,加载原理机制是怎么样的? 答: 很多人都不是很清楚java的class类什么时候加载在运行内存中,其实类加载的时间是发生在一下几种情况: 1.实例化对象时,就像sprin ...
- Centos7安装php5.6并配置php-fpm协同工作
yum install epel-release rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm yum in ...
- 【c# 学习笔记】数值类型
c# 中的数值类型分为:整型.浮点型.十进制.如下图. 1.整型数值的取值范围和内存大小 类型 说明 取值范围 byte 无符号的8位整数 0到255(即2的8次方-1) sbyte 有符号的8位 ...
- IPVS支持的调度算法
对于后端的RS集群,LB是如何决策应该把消息调度到哪个RS节点呢?这是由负载均衡调度算法决定的.IPVS常用的调度算法有: 轮询(Round Robin) LB认为集群内每台RS都是相同的,会轮流进行 ...
- 35个高级Python知识点总结
原文地址:https://blog.51cto.com/xvjunjie/2156525 No.1 一切皆对象 众所周知,Java中强调“一切皆对象”,但是Python中的面向对象比Java更加彻底, ...