[C++ Primer] 第8章: IO库
IO类
| iostream定义了读写流的基本类型 | |
|---|---|
| istream, wistream | 从流读取数据 |
| ostream, wostream | 向流写入数据 |
| iostream, wiostream | 读写流 |
| fstream定义了读写命名文件的类型 | |
| ifstream, wifstream | 从文件读取数据 |
| ofstream, wofstream | 向文件写入数据 |
| fstream, wfstream | 读写文件 |
| sstream定义了读写内存string对象的类型 | |
| istringstream, wistringstream | 从string读取数据 |
| ostringstream, wostringstream | 向string写入数据 |
| stringstream, wstringstream | 读写string |
fstream和sstream继承自iostream, 这意味着接受一个iostream类型引用(或指针)参数的函数, 可以用一个对应的fstream或sstream类型来调用.
IO对象无拷贝或赋值. 进行IO操作的函数通常以引用方式传递和返回流. 读写一个IO对象会改变其状态, 因此传递和返回的引用不能是const的.
刷新输出缓冲区: endl, flush, ends.
- endl: 输出缓冲区和一个换行, 然后刷新缓冲区.
- flush: 输出缓冲区,然后刷新缓冲区.
- ends: 输出缓冲区和一个空字符, 然后刷新缓冲区.
如果程序异常终止, 输出缓冲区是不会被刷新的.
文件输入输出
| fstream特有的操作: | |
|---|---|
| fstream fstrm; | 创建一个未绑定的文件流. |
| fstream fstrm(s); | 创建一个fstream, 并打开名为s的文件. s可以是string类型, 或者是一个指向C风格字符串的指针. 这些构造函数是explicit的. |
| fstream fstrm(s, mode); | 以指定的方式打开. |
| fstrm.open(s); | 打开名为s的文件. |
| fstrm.close(); | 关闭与fstrm绑定的流. |
| fstrm.is_open() | 返回一个bool值指出与fstrm绑定的流是否成功打开且尚未关闭. |
| mode模式有: | |
| in | 以读方式打开 |
| out | 以写方式打开, 会丢弃已有数据 |
| app | 向文件末尾添加 |
| ate | 打开文件后立即定位到末尾 |
| trunc | 截断文件 |
| binary | 以二进制方式打开 |
// 拷贝文本文件infile.txt内容到outfile.txt
int main()
{
ifstream input("infile.txt"); // 构造一个ifstream并打开给定的文件
ofstream output; // 输出文件流未关联到任何文件
output.open("outfile.txt"); // 打开指定的文件, 文件名可以值C-style字符串, 也可以是string对象(C++11标准)
string line;
while(getline(input, line))
{
output << line << endl;
}
input.close(); // 当一个fstream对象被销毁时, close会自动调用, 也可以手动关闭
output.close();
return 0;
}
已out模式打开文件会丢失已有数据
保留被ofstream打开的文件中已有数据的唯一方法是显示指定app或者in模式
// file1内容会丢失
ofstream out1("file1"); // 隐含out并trunc模式(截断文件)
ofstream out2("file1", ofstream::out); // 隐含trunc
ofstream out3("file1", ofstream::out | ofstream::trunc);
// file2内容不会丢失
ofstream out4("file2", ofstream::app); // 隐含out模式
ofstream out5("file2", ofstream::out | ofstream::app);
与ifstream关联的文件默认已in模式打开, 与ofstream关联的文件默认以out模式打开, 与fstream关联的文件默认已in和out模式打开.
string流
| stringstream 特有操作 | |
|---|---|
| sstream strm | 创建一个未绑定的sstream对象 |
| sstream strm(s) | strm是一个stream对象, 保存string s的一个拷贝. 此构造函数是explicit的. |
| strm.str() | 返回strm所保存的string的拷贝 |
| strm.str(s) | 将string s拷贝到strm中. |
处理行内单词的个数时, 通常可以使用istringstream.
int main()
{
string in_str("Hello World!"), str;
vector<string> svec;
istringstream iss; // 未绑定的对象
iss.str(in_str);
// istringstream iss(in_str); // 与上面两行等价
while(iss >> str)
svec.push_back(str); // 将每个单词存放到svec中
return 0;
}
当我们想逐步构造, 希望最后一起打印时, ostringstream是很有用的.
int main()
{
ostringstream oss;
// ... 省略若干行
oss << "aaa ";
// ... 省略若干行
oss << "bbbb ";
cout << oss.str() << endl;
return 0;
}
[C++ Primer] 第8章: IO库的更多相关文章
- 学习 primer 第8章 IO库 小结
iostream处理控制台IO fstream处理命名文件IO stringstream完成内存string的IO 非常重要!!!!!!!!!! ========================== ...
- 第 8 章 IO库
第 8 章 IO库 标签: C++Primer 学习记录 IO库 第 8 章 IO库 8.1 IO类 8.2 文件输入输出 8.1 string流 8.1 IO类 IO对象无拷贝或赋值,因此不能将形参 ...
- 《C++ Primer》笔记 第8章 IO库
iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型. 标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制 ...
- 【c++ Prime 学习笔记】第8章 IO库
C++语言不直接处理输入输出,而是通过标准库中的一组类来处理IO 1.2节介绍的IO库: istream(输入流)类型,提供输入 ostream(输出流)类型,提供输出 cin,是istream对象, ...
- 《C++primer》v5 第8章 IO库 读书笔记 习题答案
8.1.8.2 这一章不咋会啊.. istream &read(istream &is) { int a; auto old_state=is.rdstate(); is.clear( ...
- C++ Primer 5th 第8章 IO库
IO类对象不允许进行拷贝操作. IO类中定义后一些函数和标志,可以用于访问和操作流的状态. 一旦流发生错误,后续IO操作都是失败的. 读写IO对象会改变IO对象的状态. 每个输出流都管理一个缓冲区. ...
- C++primer第三章标准库类型
除第二章介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类型标准库. 本章将介绍标准库中的 vector.string 和 bitset 类型. string 类型支持长度可变的字符串 v ...
- C++Primer,C++标准IO库阅读心得
IO 标准库类型和头文件 iostream istream 从流中读取 ostream 写到流中去 iostream 对流进行读写:从 istream 和 ostream 派生而来fstream if ...
- C++ Primer 第三章 标准库类型vector+迭代器iterator 运算
1.vector: 标准库类型vector表示对象的集合,其中所有对象的类型都相同,集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它也常被称作容器( ...
随机推荐
- Android 开机Process xxx (pid xxxx) has died问题分析
系统中有一个监听BOOT_COMPLETED广播的自启应用,概率性出现启动后被kill掉的现象.Log如下: - :: I ActivityManager: Process com.test.xxx ...
- openwrt编译系统制作ubi镜像时会使用系统自带的ubinize还是openwrt编译系统中编译的ubinize
答:使用openwrt编译系统中编译的ubinize,那么这个工具在哪个目录下?在staging_dir/host/bin目录下
- pip安装tensorflow-gpu好慢怎么办
答:为pip换源,如换成清华源 cat ~/.pip/pip.conf(没有此文件,自行创建即可,然后加入以下内容) [global]index-url = https://pypi.tuna.tsi ...
- HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...
- 【max_result_window大小】 Result window is too large的问题
方法一: 如果需要搜索分页,可以通过from size组合来进行.from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10, 如果搜索size大于10000,需要设置 ...
- TimerPickerDialog 中 onTimeSet 执行两次的问题
开发android小闹钟的程序时,在添加闹钟时闹钟列表中总是出现两个相同的闹钟. btnAddAlarm.setOnClickListener(new View.OnClickListener() { ...
- 【测试设计】性能测试工具选择:wrk?jmeter?locust?还是LR?
原文链接:http://www.51testing.com/html/49/n-3721249.html 前言 当你想做性能测试的时候,你会选择什么样的测试工具呢?是会选择wrk?jmeter?loc ...
- Oracle数据库空值操作
空值操作: null表示空的意思. 一.情况: 1:表中的任何字段默认情况下都可以为null值. 2:not null表示非空,是一种约束 设置为非空约束的字段,必须有有效值,不能为空. 3:插入数据 ...
- 在EORow或者VORow中对数据进行重复性校验
需求:在设置付款条件时不允许账期+付款方式重复. 由于本次需求仅需要对VO缓存中的数据进行重复性校验,所以仅需进行缓存遍历即可,不需要校验数据库. 方式1,在EORow的进行数据校验. public ...
- hdu3031
题解: 左偏树模板题目 每一次合并,删除最大,修改最大 都是基本操作 代码: #include<cstdio> #include<cmath> #include<algo ...