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库

IO库

IO类

IO库类型和头文件

头文件类型
iostreamistream, wistream 从流读取数据; ostream, wostream向流写入数据;iostream,wiostream读写流
fstreamifstream, wifstream从头文件读取数据; ofstream, wofstream向文件写入数据; fstream, wfstream读写文件
sstreamistringstream, wistringstream从string读取数据; ostringstream, wostringstream向string写入数据; stringstream, wstringstream读写string

为了支持使用宽字符语言,标准库定义了一组类型和对象来操作wchar_t类型的数据。宽字符版本的类型和函数的名字以一个w开始。

IO类型之间的关系

标准库使我们忽略这些不同类型的流之间的差异,这是通过**继承机制(inheritance)**实现的。

继承机制使我们声明一个特定的类继承自另一个类。我们通常可以将一个派生类(继承类)对象当作其基类(所继承的类)对象来使用。

IO对象无拷贝或赋值

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

条件状态

IO库条件状态

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

一旦一个流发生错误,其上后续的IO操作都会失效。

通常情况下,一旦badbit被置位,流就无法被使用了。在发生可恢复错误后,failbit被置位。如果达到文件结束位置,eofbit和failbit都会被置位。goodbit的值为0,表示流未发生错误。如果badbit、failbit和eofbit任一个被置位,则检测状态的条件会失败。

刷新输出缓冲区

IO库有两个类似的操纵符:flush和end。flush刷新缓冲区,但不输出任何额外的字符;ends向缓冲区插入一个空字符,然后刷新缓冲区。


    std::cout << "hi!" << std::endl; //输出hi和一个换行,然后刷新缓冲区
    std::cout << "hi!" << std::flush; //输出hi,然后刷新缓冲区
    std::cout << "hi!" << std::ends; //输出hi和一个空字符,然后刷新缓冲区

unitbuf操纵符

如果想在每次输出操作后都刷新缓冲区,我们可以使用unitbuf操纵符。它告诉流在接下来的每次写操作之后都进行一次flush操作。而nounitbuf操纵符则重置流,使其恢复使用正常的系统管理的缓冲区刷新机制:


    std::cout << std::unitbuf; //所有输出操作后都会立即刷新缓冲区
    //任何输出都立即刷新,无缓冲
    std::cout << std::nounitbuf; //回到正常的缓冲方式

如果程序崩溃,输出缓冲区不会被刷新。

关联输入和输出流

当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流。

tie函数有两个版本:

  1. 不带参数的版本,返回指向输出流的指针。如果本对象当前关联到一个输出流,则返回的就是指向这个流的指针,如果对象未关联到流,则返回空指针。
  2. 第二个版本接受一个指向ostream的指针,将自己关联到ostream。

我们既可以将istream对象关联到一个ostream,也可以将ostream对象关联到一个ostream对象。


    std::cin.tie(&std::cout); //标准库将cin和cout关联在一起
    
    std::ostream *old_tie = std::cin.tie(nullptr); //cin不再与其他流关联
    
    std::cin.tie(&std::cerr); //cin与cerr关联
    std::cin.tie(old_tie); //cin与cout关联

文件输入输出

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

fstream特有的操作

fstream fstrm;创建一个未绑定的文件流。fstream是头文件fstream中定义的一个类型
fstream fstrm(s);创建一个fstream,并打开名为s的文件。s是一个string类型,或者是一个指向C风格字符串的指针。这些构造函数都是explicit的。默认的文件模式mode依赖于fstream的类型。
fstream fstrm(s, mode);与前一个构造函数类似,按指定mode打开文件。
fstrm.open(s);打开名为s的文件,并将文件与fstrm绑定。s是一个string或一个指向C风格字符串的指针。默认的文件mode依赖于fstream的类型,返回void。
fstrm.close(s);关闭与fstrm绑定的文件。返回void
fstrm.is_open();返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭。

在C++新标准中,文件名既可以是库类型string对象,也可以是C风格字符数组。

可以用fstream代替iostream&。

open和close

对一个已经打开的文件流调用open会失败,并会导致failbit被置位。随后的试图使用文件流的操作都会失败,为了将文件流关联到另外一个文件,必须首先关闭已经关联的文件。一旦文件成功关闭,我们可以打开新的文件。

如果open成功,则open会设置流的状态,是的good()为true。

当一个fstream对象被销毁时,close会自动被调用。

文件模式

每个流都有一个关联的文件模式(file mode),用来指出如何使用文件。

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

指定文件模式的限制:

  • 只可以对ofstream或fstream对象设定out模式。
  • 只可以对 ifstream 或 fstream对象设定in模式。
  • 只有当out 也被设定时才可以设定trunc模式。
  • 只要trunc没被设定,就可以设定app模式。在app模式下,即使没有显示指定out模式,文件也总以输出方式被打开。
  • 默认情况下,即使我们没有指定trunc,以out模式打开的文件也会被截断。为了保留以out模式打开的文件的内容,我们必须同时指定app模式,这样只会将数据追加写到文件末尾;或者同时指定in模式,即打开文件同时进行读写操作。
  • ate和binary模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用。

与istream关联的文件默认以in模式打开;与ostream关联的文件默认以out模式打开;与fstream关联的文件默认以in和out模式打开。

以out模式打开文件会丢弃已有数据

阻止一个ostream清空给定文件内容的方法是同时指定app模式。

通常情况下,out模式意味着同时使用trunc模式。

string流

istringstream从string读取数据,ostringstream向string写入数据,而头文件stringstream既可以从string读取数据也可向string写入数据。

stringstream 特有的操作

sstream strm;strm是一个未绑定的stringstream对象。sstream是头文件sstream中定义的一个类型。
sstream strm(s);strm是一个sstream对象,保存string s的一个拷贝。此构造函数时explicit的。
strm.str()返回strm所保存的string的拷贝
strm.str(s)将string s拷贝到strm中。返回void。
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-07 13:40:26  更:2021-10-07 13:41:50 
 
开发: 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/20 5:04:46-

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