前面已经在用的IO库设施

  • istream:输入流类型,提供输入操作。
  • ostream:输出流类型,提供输出操作
  • cin:一个istream对象,从标准输入读取数据。
  • cout:一个ostream对象,向标准输出写入数据。
  • cerr:一个ostream对象,向标准错误写入消息。
  • >>运算符:用来从一个istream对象中读取输入数据。
  • <<运算符:用来向一个ostream对象中写入输出数据。
  • getline函数:从一个给定的istream对象中读取一行数据,存入到一个给定的string对象中。

IO类

  • iostream头文件:从标准流中读写数据,istream,ostream
  • fstream头文件:从文件中读写数据,ifstream,ofstream
  • sstream头文件:从字符串中读写数据,istringstream,ostringstream

IO对象不能拷贝赋值

由于不能拷贝IO对象,因此不能将 形参 或 返回类型 设置为 流类型。进行 IO 操作的函数通常以 引用方式 传递和 返回流。读写一个IO对象会改变其状态,因此 传递和返回的引用不能用const

  • 1.IO对象不能存在容器里.
  • 2.形参和返回类型也不能是流类型。
  • 3.形参和返回类型一般是流的引用
  • 4.读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的。

条件状态

状态 解释
strm:iostate 是一种机器无关的类型,提供了表达条件状态的完整功能
strm:badbit 用来指出流已经崩溃
strm:failbit 用来指出一个IO操作失败了
strm:eofbit 用来指出流到达了文件结束
strm:goodbit 用来指出流未处于错误状态,此值保证为零
s.eof() 若流seofbit置位,则返回true
s.fail() 若流sfailbit置位,则返回true
s.bad() 若流sbadbit置位,则返回true
s.good() 若流s处于有效状态,则返回true
s.clear() 将流s中所有条件状态位复位,将流的状态设置成有效,返回void
s.clear(flags) 将流s中指定的条件状态位复位,返回void
s.setstate(flags) 根据给定的标志位,将流s中对应的条件状态位置位,返回void
s.rdstate() 返回流s的当前条件状态,返回值类型为strm::iostate

上表中,strm是一种IO类型,(如istream), s是一个流对象。

管理输出缓冲

  • 每个输出流都管理一个缓冲区,用来保存程序读写的数据。文本串可能立即打印出来,也可能被操作系统保存在缓冲区内,随后再打印。

  • 刷新(即,数据真正写到输出设备或文件)缓冲区的IO操纵符

    • endl:输出一个换行符并刷新缓冲区
    • flush:刷新流,但不添加任何字符
    • ends:在缓冲区插入空字符null,然后刷新
    • unitbuf:告诉流接下来每次操作之后都要进行一次flush操作。
    • nounitbuf:回到正常的缓冲方式

文件输入输出

  • 头文件fstream定义了三个类型来支持文件IO:

    • ifstream从一个给定文件读取数据。
    • ofstream向一个给定文件写入数据。
    • fstream可以读写给定文件。

fstream特有的操作

操作 解释
fstream fstrm; 创建一个未绑定的文件流。
fstream fstrm(s); 创建一个文件流,并打开名为s的文件,s可以是string也可以是char指针
fstream fstrm(s, mode); 与前一个构造函数类似,但按指定mode打开文件
fstrm.open(s) 打开名为s的文件,并和fstrm绑定
fstrm.close() 关闭和fstrm绑定的文件
fstrm.is_open() 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭

上表中,fstream是头文件fstream中定义的一个类型,fstrm是一个文件流对象。

文件模式

文件模式 解释
in 以读的方式打开
out 以写的方式打开
app 每次写操作前均定位到文件末尾
ate 打开文件后立即定位到文件末尾
trunc 截断文件
binary 以二进制方式进行IO操作。

string流

  • 头文件sstream定义了三个类型来支持内存IO:

    • istringstreamstring读取数据。
    • ostringstreamstring写入数据。
    • stringstream可以读写给定string

stringstream特有的操作

操作 解释
sstream strm 定义一个未绑定的stringstream对象
sstream strm(s) s初始化对象
strm.str() 返回strm所保存的string的拷贝
strm.str(s) s拷贝到strm中,返回void

上表中sstream是头文件sstream中任意一个类型。s是一个string

书中演示demo使用

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;typedef struct PersonInfo
{string name;vector<string> phones;
}p;int main() {string line, word;vector<p> people;while (getline(cin, line)){p info;istringstream record(line);record >> info.name;while (record >> word)info.phones.push_back(word);people.push_back(info);}for (auto i : people){cout << i.name << endl;for (auto j : i.phones)cout << j << "   ";cout << endl;}return 0;
}

练习

练习8.1

编写函数,接受一个istream&参数,返回值类型也是istream&。此函数须从给定流中读取数据,直至遇到文件结束标识时停止。它将读取的数据打印在标准输出上。完成这些操作后,在返回流之前,对流进行复位,使其处于有效状态。

解:

std::istream& func(std::istream &is)
{std::string buf;while (is >> buf)std::cout << buf << std::endl;is.clear();return is;
}

练习8.2

测试函数,调用参数为cin

解:

#include <iostream>
using std::istream;istream& func(istream &is)
{std::string buf;while (is >> buf)std::cout << buf << std::endl;is.clear();return is;
}int main()
{istream& is = func(std::cin);std::cout << is.rdstate() << std::endl;return 0;
}

测试

#include <iostream>
#include <string>
using namespace std;istream& f1(istream& is)
{int s;while (is >> s){cout << s << endl;}return is;
}istream& f2(istream& is)
{int s;while (is >> s){cout << s << endl;}is.clear();return is;
}int main()
{istream& is = f1(cin);cout << is.rdstate() << endl;istream& is2 = f2(cin);cout << is2.rdstate() << endl;return 0;
}

练习8.3

什么情况下,下面的while循环会终止?

while (cin >> i) /*  ...    */

badbitfailbiteofbit 的任一个被置位,那么检测流状态的条件会失败。

练习8.4

编写函数,以读模式打开一个文件,将其内容读入到一个stringvector中,将每一行作为一个独立的元素存于vector中。

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;void ReadFileToVec(const string& filename, vector<string>& vec)
{ifstream ifs(filename);if (ifs){string buf;while (getline(ifs, buf))vec.push_back(buf);}
}

练习8.5

重写上面的程序,将每个单词作为一个独立的元素进行存储。

void ReadFileToVec(const string& fileName, vector<string>& vec)
{ifstream ifs(fileName);if (ifs){string buf;while (ifs >> buf)vec.push_back(buf);}
}

练习8.10

编写程序,将来自一个文件中的行保存在一个vector中。然后使用一个istringstreamvector读取数据元素,每次读取一个单词。

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
using namespace std;int main()
{//将来自一个文件的行保存到vector中ifstream ifs("hello.txt");if (!ifs){cerr << "no data ?" << endl;return -1;}vector<string> vecline;string line;while(getline(ifs, line))vecline.push_back(line);ifs.close();//从vector读取元素,每次只读一个单词for (auto &s : vecline){istringstream iss(s);string word;while (iss >> word)cout << word << endl;}return 0;
}

练习8.11

本节的程序在外层while循环中定义了istringstream对象。如果record对象定义在循环之外,你需要对程序进行怎样的修改?重写程序,将record的定义移到while循环之外,验证你设想的修改方法是否正确。

解:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using std::vector; using std::string; using std::cin; using std::istringstream;struct PersonInfo {string name;vector<string> phones;
};int main()
{string line, word;vector<PersonInfo> people;istringstream record;while (getline(cin, line)){PersonInfo info;record.clear();record.str(line);record >> info.name;while (record >> word)info.phones.push_back(word);people.push_back(info);}for (auto &p : people){std::cout << p.name << " ";for (auto &s : p.phones)std::cout << s << " ";std::cout << std::endl;}return 0;
}

练习8.12

我们为什么没有在PersonInfo中使用类内初始化?

解:

因为这里只需要聚合类就够了,所以没有必要在PersionInfo中使用类内初始化。

练习8.13

电话号码程序

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
using namespace std;struct PersonInfo {string name;vector<string> phones;
};bool valid(const string& str)
{return isdigit(str[0]);
}string format(const string& str)
{return str.substr(0, 3) + "-" + str.substr(3, 3) + "-" + str.substr(6);
}int main()
{//从文件中读取信息存入vector容器ifstream ifs("phone.txt");if (!ifs){cerr << "no phone numbers ? " << endl;return -1;}vector<PersonInfo> people;string line, word;istringstream record;while (getline(ifs, line)){PersonInfo info;record.clear();record.str(line);record >> info.name;while (record >> word){info.phones.push_back(word);}people.push_back(info);}//逐个验证电话号码 并 改变其格式for (const auto& entry : people)   //对people中的每一项{//每个循环创建的对象ostringstream formatted, badnums;//对每个数for (const auto& nums : entry.phones){if (!valid(nums)){badnums << " " << nums;//将数的字符串形式存入badnums}else{//将格式化的字符串写入formattedformatted << " " << format(nums);}}//没有错误的数if (badnums.str().empty()){cout << entry.name << " "<< formatted.str() << endl;}else{//打印名字和错误的数cerr << "input error: " << entry.name<< " invalid number(s)" << badnums.str() << endl;}}return 0;
}

【C++】IO库 : IO类,文件输入输出,string流相关推荐

  1. C++primer第八章 IO库 8.2 文件输入输出

    8.2文件输入输出 头文件fstream定义了三个类型来支持文件IO:ifstream从一个给定文件读取数据,ofstream向一个给定文件写入数据,以及fstream可以读写给定文件.在17.5.3 ...

  2. -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流...

    File类 •文件和目录路径名的抽象表示形式 构造方法 •public File(String pathname) •public File(String parent,Stringchild) •p ...

  3. C++ 流的操作 | 初识IO类、文件流、string流的使用

    文章目录 前言 IO头文件 iostream fstream sstream 流的使用 不能拷贝或对 IO对象 赋值 条件状态与 iostate 类型 输出缓冲区 文件流 fstream类型 文件模式 ...

  4. 《C++ Primer 5th》笔记(8 / 19):IO库

    文章目录 IO类 IO类型间的关系 IO对象无拷贝或赋值 条件状态 查询流的状态 管理条件状态 管理输出缓冲 刷新输出缓冲区 unitbuf操纵符号 警告:如果程序崩溃,输出缓冲区不会被刷新 关联输入 ...

  5. C++Primer学习笔记:第8章 IO库

    C++语言不直接处理输入输出,而是通过一族定义在标准库中的类型来处理IO iostream定义了用于读写流的基本类型 fstream定义了读写命名文件的类型 sstream定义了读写内存string对 ...

  6. Go语言的IO库那么多,我该怎么选?

    在计算机和信息技术领域里I/O这个术语表示输入 / 输出 ( 英语:Input / Output ) ,通常指数据在存储器(内部和外部)或其他周边设备之间的输入和输出,是信息处理系统与外部之间的通信. ...

  7. c++Primer5,总览与IO库和泛型算法

    先前曾看过c++primer第四版,大致看的,工作需要,也用了这么久,但是总感觉没什么长进,后来又陆续要是用c++11,于是现在看看c++Primer第五版. 先看目录,第一章还是开始,第一部分为c+ ...

  8. 标准IO库--unix环境高级编程读书笔记

    标准IO库是C语言提供的一个库,不光存在于linux中,在windows中也是有的.标准IO库和文件IO的不同是,标准IO库是对文件IO(即系统调用)的封装,并且在用户层添加了一些缓冲区. 文件IO的 ...

  9. c++语言文件流,C++ IO类、文件输入输出、string流详细讲解

    新的C++标准中有三分之二的内容都是描述标准库.接下来重点学习其中几种核心库设施,这些是应该熟练掌握的. 标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围 ...

最新文章

  1. JVM 发生内存溢出的 8 种原因、及解决办法
  2. SP 短信开发-基础知识篇
  3. java实现责任链模式_我的Java设计模式-责任链模式
  4. hadoop免密钥配置
  5. python zip()函数的理解与应用
  6. python 查看数据结构类型_python 数据结构类型总结(示例代码)
  7. 61. Event altKey 事件属性
  8. vue项目实现文字转换成语音播放功能
  9. 抑郁症,恐惧,压力和肠道微生物群脱不开的关系
  10. 【路径规划】基于matlab人工势场法机器人避障路径规划【含Matlab源码 620期】
  11. pythonnumpy矩阵详解_基于Python Numpy的数组array和矩阵matrix详解_python
  12. jQuery 案例-图片抽奖
  13. 程序员的12条经营分享
  14. qq音乐会员联合会员都有哪些
  15. matlab 绘制高斯(Gaussan)函数图像
  16. 阅读报告Implementing arbitrary coined two-dimensional quantum walks via bulk optical interferometry
  17. 华为HiLink认证,什么是华为HiLink认证?华为HiLink认证费用,华为HiLink认证周期,华为HiLink认证测试内容
  18. 关于char的双引号与单引号的正确用法(摘)
  19. python人脸识别opencv_Python基于Opencv来快速实现人脸识别过程详解(完整版)
  20. 三星c9pro语言,三星C9Pro评测 为什么被认为专门为中国用户量身打造的一款产品...

热门文章

  1. Qt打开图片,维持原宽高比,适应窗口
  2. 走进C++程序世界-----指针(动态申请空间和释放空间)
  3. 国外名校在线学位申请
  4. Word控件Spire.Doc更新至最新版v10.7,增强产品稳定性,修复老版本漏洞
  5. HTML5标签+基础特性
  6. BULK INSERT如何将大量数据高效地导入SQL Server(转)
  7. netty基础教程-3、helloworld(cs模式)
  8. 如何删除WORD空白页
  9. Java基础-基础知识汇总
  10. arduino二位数码管_用arduino和2个74HC595级联控制8位数码管显示