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库的更多相关文章

  1. 学习 primer 第8章 IO库 小结

    iostream处理控制台IO fstream处理命名文件IO stringstream完成内存string的IO 非常重要!!!!!!!!!!  ========================== ...

  2. 第 8 章 IO库

    第 8 章 IO库 标签: C++Primer 学习记录 IO库 第 8 章 IO库 8.1 IO类 8.2 文件输入输出 8.1 string流 8.1 IO类 IO对象无拷贝或赋值,因此不能将形参 ...

  3. 《C++ Primer》笔记 第8章 IO库

    iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型. 标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制 ...

  4. 【c++ Prime 学习笔记】第8章 IO库

    C++语言不直接处理输入输出,而是通过标准库中的一组类来处理IO 1.2节介绍的IO库: istream(输入流)类型,提供输入 ostream(输出流)类型,提供输出 cin,是istream对象, ...

  5. 《C++primer》v5 第8章 IO库 读书笔记 习题答案

    8.1.8.2 这一章不咋会啊.. istream &read(istream &is) { int a; auto old_state=is.rdstate(); is.clear( ...

  6. C++ Primer 5th 第8章 IO库

    IO类对象不允许进行拷贝操作. IO类中定义后一些函数和标志,可以用于访问和操作流的状态. 一旦流发生错误,后续IO操作都是失败的. 读写IO对象会改变IO对象的状态. 每个输出流都管理一个缓冲区. ...

  7. C++primer第三章标准库类型

    除第二章介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类型标准库. 本章将介绍标准库中的 vector.string 和 bitset 类型. string 类型支持长度可变的字符串 v ...

  8. C++Primer,C++标准IO库阅读心得

    IO 标准库类型和头文件 iostream istream 从流中读取 ostream 写到流中去 iostream 对流进行读写:从 istream 和 ostream 派生而来fstream if ...

  9. C++ Primer 第三章 标准库类型vector+迭代器iterator 运算

    1.vector: 标准库类型vector表示对象的集合,其中所有对象的类型都相同,集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它也常被称作容器( ...

随机推荐

  1. Android 开机Process xxx (pid xxxx) has died问题分析

    系统中有一个监听BOOT_COMPLETED广播的自启应用,概率性出现启动后被kill掉的现象.Log如下: - :: I ActivityManager: Process com.test.xxx ...

  2. openwrt编译系统制作ubi镜像时会使用系统自带的ubinize还是openwrt编译系统中编译的ubinize

    答:使用openwrt编译系统中编译的ubinize,那么这个工具在哪个目录下?在staging_dir/host/bin目录下

  3. pip安装tensorflow-gpu好慢怎么办

    答:为pip换源,如换成清华源 cat ~/.pip/pip.conf(没有此文件,自行创建即可,然后加入以下内容) [global]index-url = https://pypi.tuna.tsi ...

  4. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  5. 【max_result_window大小】 Result window is too large的问题

    方法一: 如果需要搜索分页,可以通过from size组合来进行.from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10, 如果搜索size大于10000,需要设置 ...

  6. TimerPickerDialog 中 onTimeSet 执行两次的问题

    开发android小闹钟的程序时,在添加闹钟时闹钟列表中总是出现两个相同的闹钟. btnAddAlarm.setOnClickListener(new View.OnClickListener() { ...

  7. 【测试设计】性能测试工具选择:wrk?jmeter?locust?还是LR?

    原文链接:http://www.51testing.com/html/49/n-3721249.html 前言 当你想做性能测试的时候,你会选择什么样的测试工具呢?是会选择wrk?jmeter?loc ...

  8. Oracle数据库空值操作

    空值操作: null表示空的意思. 一.情况: 1:表中的任何字段默认情况下都可以为null值. 2:not null表示非空,是一种约束 设置为非空约束的字段,必须有有效值,不能为空. 3:插入数据 ...

  9. 在EORow或者VORow中对数据进行重复性校验

    需求:在设置付款条件时不允许账期+付款方式重复. 由于本次需求仅需要对VO缓存中的数据进行重复性校验,所以仅需进行缓存遍历即可,不需要校验数据库. 方式1,在EORow的进行数据校验. public ...

  10. hdu3031

    题解: 左偏树模板题目 每一次合并,删除最大,修改最大 都是基本操作 代码: #include<cstdio> #include<cmath> #include<algo ...