IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【c ++ primer 笔记】第8章 IO库 -> 正文阅读

[C++知识库]【c ++ primer 笔记】第8章 IO库

在这里插入图片描述

🎉作者简介:👓 博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢 c + + , g o , p y t h o n , 目前熟悉 c + + , g o 语言,数据库,网络编程,了解分布式等相关内容 \textcolor{orange}{博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++,go语言,数据库,网络编程,了解分布式等相关内容} 博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++go语言,数据库,网络编程,了解分布式等相关内容
📃 个人主页: \textcolor{gray}{个人主页:} 个人主页: 小呆鸟_coding
🔎 支持 : \textcolor{gray}{支持:} 支持: 如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦 \textcolor{green}{如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦} 如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦👍 就是给予我最大的支持! \textcolor{green}{就是给予我最大的支持!} 就是给予我最大的支持!🎁
💛本文摘要💛

本专栏主要是对c++ primer这本圣经的总结,以及每章的相关笔记。目前正在复习这本书。同时希望能够帮助大家一起,学完这本书。 本文主要讲解第8章 IO类

  • 本章主要介绍函数传参及函数返回结果、函数重载、重载函数应该选择哪个进行调用。

💕8.1 IO类

??8.1.0前面章节使用的IO库

  • istream:输入流类型,提供输入操作。
  • ostream:输出流类型,提供输出操作
  • cin:一个istream对象,从标准输入读取数据。
  • cout:一个ostream对象,向标准输出写入数据。
  • cerr:一个ostream对象,向标准错误写入消息。
  • >>运算符:用来从一个istream对象中读取输入数据。
  • <<运算符:用来向一个ostream对象中写入输出数据。
  • getline函数:从一个给定的istream对象中读取一行数据,存入到一个给定的string对象中。
IO库类型和头文件
头文件类型
istream, wistream(从流中读取)
iostreamostream,wostream(写到流中去)
iostream,wiostream(对流进行读写)
ifstream,wifstream(从文件中读取)
fstreamofstream,wofstream(写到文件中去)
fstream,wfstream(读写文件)
istringstream, wistringstream(从string对象中读取)
sstreamostringstream, wostringstream(写到string对象中去)
stringstream, wstringstream(对string对象进行读写)
  • 其中带 w 前缀的类型用来操作宽字符语言(wchar_t)。宽字符版本的类型和函数前都有一个 w,如 wcin, wcout, wcerr。
  • fstream sstream 中的类型都继承自 iostream 中的类型。
  • 可以将一个派生类对象当成基类对象来使用。
  • 所有这些输入输出流对象的 >> 操作都是读取一个单词

理解:

  • 输入流输出流都是流对象,输入流就是要用 >> 把流对象中的内容保存到变量中,输出流就是要用<<把变量保存到流对象中。一个流是和控制台窗口或一个文件或字符串等相关联的,如 cin、cout 都和控制台窗口相关联。

??8.1.1 IO对象无拷贝或赋值

  • IO对象不能存在容器里.
  • 不能拷贝或对 IO 对象赋值
  • 形参或返回类型不能设置成流类型。
  • 进行 IO 操作的函数通常以引用形式传递和返回流。(形参和返回类型一般是流的引用。)
  • 读写 IO 对象会改变其状态,因此引用不能是 const 的。

在这里插入图片描述

??8.1.2 条件状态

  • IO操作可能会发生不可预知的错误,一些错误是课恢复的,一些操作是不可恢复的,我们在使用一个流之前,应该检查它是否处于良好状态。
  • 条件状态用来查看流状态

IO 库的状态

状态解释
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

在这里插入图片描述

检查流的状态

while(cin >> word); // >> 表达式返回流的状态
while(cin.good());  // 意义同上
while(!cin.fail()); // 意义同上。

管理条件状态

cin.rdstate();      //返回一个 iostate 值表示当前状态。
cin.setstate(state);//接受一个 iostate 类型的参数,将给定条件位置位。
cin.clear();        //清除(复位)所有错误标志位,cin.clear() 后,cin.good() 会返回 true
cin.clear(state);   //接受一个 iostate 类型的参数,设为流的新状态。

设置某个标志位的方式

cin.clear(cin.rdstate() & ~cin.failbit);//将 failbit 复位

在这里插入图片描述

??8.1.3 管理输出缓冲区

  • 每个输出流都管理一个缓冲区,执行输出的代码,文本串可能立即打印出来,也可能被操作系统保存在缓冲区内,随后再打印。

缓冲刷新(即数据真正写到设备或文件)的原因:

  • 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行。
  • 缓冲区满
  • 使用操纵符如 endl, flush, ends 来显示刷新缓冲区
  • 一个输出流可能关联到另一个流。当读写被关联的流时,关联到的流的缓冲区就会被刷新如读 cin 或写 cerr 都会刷新 cout 的缓冲区
  • 使用操纵符unitbuf设置流的内部状态来清空缓冲区。

操纵符 endl, flush, ends
unitbuf:告诉流接下来每次写操作之后都进行一次 flush 操作
nounitbuf:重置流,恢复正常的刷新机制
在这里插入图片描述

注意:如果程序异常终止,将不会刷新缓冲区,即此时相应的输出操作已执行但没有打印。

关联输入和输出流

  • 当一个输入流关联到一个输出流,每次从该输入流读取数据前都会先刷新关联的输出流。
  • 标准库将 cin 和 cout 关联在一起
cout << "我是小呆鸟";
cin >> ival;
// cin 和 cout 关联在一起,导致cout的缓冲区被刷新(也就是我是小呆鸟这句话先输出,然后再输入ival值。如果不同步的话(不关联)那么光标会一直闪烁)

输入流的成员函数 tie 可以用来查看关联的输出流或关联到输出流:

cin.tie();//返回指向关联到 cin 的输出流的指针,如果没有关联的输出流,返回空指针。
cin.tie(&cerr);//接受一个指向输出流 cerr 的指针作为参数,将 cin 与 cerr 关联在一起
cin.tie(NULL);//cin 不再与其他流关联

每个流最多关联到一个输出流,但一个输出流可以被多个流关联。

💕8.2 文件输入输出

  • 头文件fstream

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

    • ifstream从一个给定文件读取数据。
    • ofstream向一个给定文件写入数据。
    • fstream可以读写给定文件。
  • 文件流:需要读写文件时,必须定义自己的文件流对象,并绑定在需要的文件上。

  • fstream继承了iostream类型外,还有自己特有操作

操作解释
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是一个文件流对象。

??8.2.1 使用文件流对象

  • 当想要读写一个文件时,可以定义一个文件流对象,并将对象与文件关联起来

fstream 定义和初始化

fstream fs;                    // 创建一个未绑定的文件流 fs
fstream fs('data.txt');        // 创建一个绑定到文件 data.txt 的文件流 fs,并打开文件 data.txt
fstream fs('data.txt', mode);  // 与上一个构造函数类似,但是按指定模式 mode 打开文件

fstream 特有操作

getline(ifs, s);         // 从一个输入流 ifs 读取一行字符串存入 s 中
fs.open('data.ext');     // 将 fs 与文件 data.txt 绑定并打开该文件。如果已打开会发生错误。
fs.close();              // 关闭 fs 绑定的文件。
fs.is_open();            // 返回一个 bool 值,指出关联文件是否成功打开。

在这里插入图片描述

  • 当定义了一个空的文件流对象,使用 open 函数将其与文件关联并打开文件。
  • 如果 open 失败,failebit 会被置位,建议每次 open 后检测 open 是否成功
  • 不能对已打开的文件流调用 open。
  • 当文件关闭后,可以将文件流关联到另一个文件
  • 当一个 fstream 对象被销毁时,close 函数会自动被调用。

用 fstream 代替 iostream

  • 使用 iostream 类型的引用作为函数参数的地方,都可以使用 fstream 来代替。(在使用基类型对象的地方,也可以用继承类型的对象文件)

在这里插入图片描述
可以与p229页程序做对比

自动构造和析构

在这里插入图片描述

??8.2.2 文件模式

  • 每次打开文件都以某种模式打开,如未指定即以该文件流类型的默认模式打开。
  • 每个流都有一个关联的文件模式,用来指出如何使用文件
文件模式解释
in以读的方式打开
out以写的方式打开
app每次写操作前均定位到文件末尾
ate打开文件后立即定位到文件末尾
trunc截断文件
binary以二进制方式进行IO操作。

文件模式的使用

  • 每个流对象都有默认的文件模式,ifstream 默认 in 模式打开文件,ofstream 默认 out,fstream 默认 in 和 out。
  • 对 ifstream 对象不能设置 out 模式,对 ofstream 对象不能设置 in 模式
  • 只有设置了 out 才能设置 trunc 模式,只设置 out 模式会默认也设置 trunc 模式
  • 设置了 trunc 就不能再设置 app 模式
  • 默认情况下以 out 模式打开文件会使文件内容被清空,如果要保留文件内容需要同时指定 app 模式或 in 模式。
  • app 模式下,会将写入的数据追加写到文件末尾

在这里插入图片描述

💕8.3 string流

  • 从string读写数据,就像string是一个IO流一样

  • stringstream继承了iostream但是自己也有一些独特的操作

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

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

string的一些操作

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

在这里插入图片描述

  • istringstream作为数据源,将line的内容拷贝到istringstream流里面去,绑定刚读入的行。
  • 此时张三和电话就保存到了流中,在通过流把张三和电话存起来。

??8.3.2 使用ostringstream

可以想象成cincout,只不过cincout的操作对象是控制台.

  • istringstream 是输入流,即读操作,要将流中的内容输入到字符串中,因此定义和使用 istringstream 时流内必须有内容,所以在使用前要提前在流内保存一个字符串
  • ostringstream 是输出流,即写操作,将流中的内容输出到字符串中,ostringstream 可以在定义时即在流中保存一个字符串,也可以通过 << 操作符获得字符串

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:34:21  更:2022-07-20 18:34:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 11:00:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码