【C++】《C++ Primer 》第八章
第八章 IO库
一、IO类
1. 标准库定义的IO类型
| 头文件 | 作用 | 类型 |
|---|---|---|
| iostream | 从标准流中读写数据 | istream, wistream 从流读取数据 ostream, wostream 向流写入数据 iostream, wiostream 读写流 |
| fstream | 从文件中读写数据 | iftream, wiftream 从文件读取数据 oftream, woftream 向文件写入数据 fstream, wifstream 读写文件 |
| sstream | 从字符串中读写数据 | istringstream, wistringstream 从string读取数据 ostringstream, wostringstream 向string写入数据 stringstream, wstringstream 读写string |
2. IO对象无拷贝或赋值
- IO对象不能存在容器里.
- 形参和返回类型也不能是流类型。
- 形参和返回类型一般是流的引用。
- 读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的。
3. 条件状态
strm是一种IO类型(如istream), s是一个流对象。
| 状态 | 解释 |
|---|---|
| strm:iostate | 是一种机器无关的类型,提供了表达条件状态的完整功能 |
| strm:badbit | 用来指出流已经崩溃 |
| strm:failbit | 用来指出一个IO操作失败了 |
| strm:eofbit | 用来指出流到达了文件结束 |
| strm:goodbit | 用来指出流未处于错误状态,此值保证为零 |
| s.eof() | 若流s的eofbit置位,则返回true |
| s.fail() | 若流s的failbit置位,则返回true |
| s.bad() | 若流s的badbit置位,则返回true |
| s.good() | 若流s处于有效状态,则返回true |
| s.clear() | 将流s中所有条件状态位复位,将流的状态设置成有效,返回void |
| s.clear(flags) | 将流s中指定的条件状态位复位,返回void |
| s.setstate(flags) | 根据给定的标志位,将流s中对应的条件状态位置位,返回void |
| s.rdstate() | 返回流s的当前条件状态,返回值类型为strm::iostate |
4. 管理输出缓冲
- 每个输出流都管理一个缓冲区,执行输出的代码,文本串可能立即打印出来,也可能被操作系统保存在缓冲区内,随后再打印。
- 导致缓冲刷新(即数据真正写到输出设备或文件)的原因:
- 程序正常结束,作为main函数的return操作的一部分,缓存刷新被执行。
- 缓冲区满时,需要刷新缓冲,而后的数据才能继续写入缓冲区。
- 使用操纵符 endl, 来显式刷新缓冲区。
- 在每个输出操作之后,可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的。
- 一个输出流可能被关联到另一个流。
- 刷新缓冲区,可以使用如下IO操纵符:
- endl:输出一个换行符并刷新缓冲区。
- flush:刷新流,单不添加任何字符。
- ends:在缓冲区插入空字符null,然后刷新。
- unitbuf:告诉流接下来每次操作之后都要进行一次flush操作。
- nounitbuf:回到正常的缓冲方式。
二、文件输入输出
1. 文件输入输出
- 文件流:需要读写文件时,必须定义自己的文件流对象,并绑定在需要的文件上。
- 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关联的文件是否成功打开且尚未关闭 |
本节练习
8.4 编写函数,以读模式打开一个文件,将其内容读入到一个string的vector中,将每一行作为一个独立的元素存入vector中。code
2. 文件模式
| 文件模式 | 解释 |
|---|---|
| in | 以读方式打开 |
| out | 以写方式打开 |
| app | 每次写操作前均定位到文件末尾 |
| ate | 打开文件后立即定位到文件末尾 |
| trunc | 截断文件 |
| binary | 以二进制方式进行IO操作 |
三、string流
- 头文件sstream定义了三个类型来支持内存IO:
- istringstream从string读取数据。
- ostringstream向string写入数据。
- stringstream可以读写给定string。
| 操作 | 解释 |
|---|---|
| sstream strm | 定义一个未绑定的stringstream对象 |
| sstream strm(s) | 用s初始化对象 |
| strm.str() | 返回strm所保存的string的拷贝 |
| strm.str(s) | 将s拷贝到strm中,返回void |
【C++】《C++ Primer 》第八章的更多相关文章
- 【C++】《C++ Primer 》第十八章
第十八章 用于大型程序的工具 大规模应用程序的特殊要求包括: 在独立开发的子系统之间协同处理错误的能力. 使用各种库进行协同开发的能力. 对比较复杂的应用概念建模的能力. 一.异常处理 异常处理(ex ...
- c++ primer plus(文章6版本)中国版 编程练习答案第八章
编程练习答案第八章 8.1写输出字符串的函数,存在默认参数表示输出频率,莫感觉1.(原标题太扯了,的问题的细微变化的基础上,含义) //8.1编写一个输出字符串的函数.有一个默认參数表示输出次数,默觉 ...
- C++ Primer Plus学习:第八章
C++入门第八章:函数探幽 本章将介绍C++语言区别于C语言的新特性.包括内联函数.按引用传递变量.默认的参数值.函数重载以及函数模板. 1 C++内联函数 内联函数是C++为提高程序运行速度所做的一 ...
- C++Primer 第十八章
//1.异常:待研究 //2.命名空间: // A:多个库将名字放置在全局命名空间中将引发命名空间污染. // B:命名空间为防止名字冲突提供了更加可控的机制.命名空间分割了全局命名空间,其中每个命名 ...
- C++ Primer:第八章:IO库(续)
二:文件输入输出. (1) 使用文件流对象: 头文件fstream定义了三个类型来支持文件IO:ifstream从一个给定的文件中读取数据,ofstream向一个给定的文件中写入数据,以及fstrea ...
- C primer plus 读书笔记第八章
本章的标题是字符输入/输出和输入确认.主要内容是讨论用于I/O的标准函数. 1.getchar()和putchar() 这两个函数之前用过,我们通过这两个函数来讨论下缓冲区. #include &qu ...
- C++ primer 中文第三版 阅读笔记 第八章
一.寄存器对象: 函数中频繁被使用的变量可以加上register就可声明为寄存器对象.对于寄存器对象,假如能够放到寄存器中就会放到寄存器中,放不到的话就放到内存中.比如 register int a ...
- C++ Primer的课后规划问题的第八章
1.写通常需要一个参数(字符串的地址).字符串和打印功能. 只要.假设提供了第二个参数(int种类),而这个参数不0,的次数的函数打印串数量为该功能将被称为(意,字符串的打印次数不等于第二个參数的值. ...
- c primer plus(五版)编程练习-第八章编程练习
1.设计一个程序,统计从输入到文件结尾为止的字符数. #include<stdio.h> int main(void){ int ch; int i; i=; while((ch = ge ...
随机推荐
- 【题单】最近遇见的 SHIT DP题 三连
Hint: 本题单适合用于自虐和消磨时间. CF-Gym101620E https://codeforces.com/gym/101620 ARC109F https://atcoder.jp/con ...
- 本地安装yum源脚本
rpm -qa|grep yum //检查是否安装了yum. 如果没有安装就执行下面的文件 创建一个以xxx.sh结尾的文件 #!/bin/bash #创建两个文件用于挂载文件 mkdir /mn ...
- js上 十九、综合案例
十九.综合案例 题目一: 封装一个函数equal(a1,a2),传入两个一维数组,判断两个数组是否包含相同的元素,如果相等,函数的返回值为true, 不相等,函数的返回值为false 1)例:arr1 ...
- JavaScript之作用域-作用域链
作用域 ==> 作用域链 作用域:变量可以其作用的区域(声明定义好一个变量,变量可以在哪些范围内使用) 分类:全局作用域和局部作用域(函数作用域):在js中,目前全局有作用域以及函数可以形成 ...
- 爱普生 L4160 Serveies 网络打印机配置(问题解决)
一.爱普生网络打印机固定IP地址 用网络打印机过程中,偶尔会出现打印机脱机的状况,大多数原因是打印机的IP地址在路由器重启过后重新分配了IP地址导致的.此时,为了减少不必要的麻烦就需要固定打印机的IP ...
- 图灵学院java架构师vip课程第二期 完整版课程下载 无加密
部分目录2020年新图灵学院Java二期架构师教程下载[课程目录]├──一.VIP课程:互联网工程专题├──二.VIP课程:源码框架专题├──三.VIP课程:并发编程专题├──四.VIP课程:性能调优 ...
- Linux(Centos7)安装、使用 Docker
一.Linux(CentOS7) 上安装 docker 1.docker 是什么? docker 是一种 虚拟化容器技术,一个开源的应用容器引擎. 基于镜像,可以秒级启动各种容器(运行一次镜像就生成一 ...
- 【electron+vue3+ts实战便笺exe】二、electron+vue3开发内容
不要让自己的上限成为你的底线 本来以为有万字的..没想到才堪堪近6000字.为了水文的嫌疑,只挑了重点的地方讲,比如component内的组件就挑了右键弹窗去说明,建议在看本文的时候边查看项目,有不懂 ...
- VMware Workstation 16 启动虚拟机失败(vmmon 版本问题)
问题简述 在 Manjora Linux 下,之前更新过系统,这次启动虚拟机居然就是失败了. 报错信息如下: Version mismatch with vmmon module: expecting ...
- AndroidSDK安装选项说明
前言:本文的目的在于了解AndroidSDK相关安装选项,正确根据自身需要选择性安装,避免安装过多无用的东西导致硬盘爆满. 1. AndroidSDK安装选项说明,如上图. 2. 实际游戏打包使用到A ...