1.C++语言并未定义任何输入输出语句,取而代之,包含了一个全面的标准库来提供IO机制。

由上图能够知道,I/O操作的基类是ios_base,各个类的用途例如以下:

  • <iostream>
  • istream    从流中读取数据
  • ostream   向流中写数据
  • iostream  对流进行读写操作。派生于istream和ostream
  • <fstream>
  • ifstream    从文件里读取数据。派生于istream
  • ofstream   向文件里写数据,派生于ostream
  • fstream     读写文件, 派生于iostream
  • <sstream>
  • istringstream    读取string对象。派生于istream
  • ostringstream   写string对象。派生于ostream
  • stringstream     读写string对象,派生于iostream

2.C与C++处理输入输出的方式不同,我们从C语言的输入输出可以很明显看出是函数调用方式,而C++的则是对象模式,iostream类是派生于ostream类和istream类,而cout和cin是ostream类和istream类的对象。

3. std::endl 实质上是一个函数,它做了两件事情:输出一个 '\n' 并刷新缓冲区。

// VS2015编译器上的定义
// MANIPULATORS
template<class _Elem,class _Traits> inlinebasic_ostream<_Elem, _Traits>&__CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr){    // insert newline and flush stream_Ostr.put(_Ostr.widen('\n'));_Ostr.flush();return (_Ostr);}

    // 以下三个语句是等价的std::cout << std::endl;std::cout << &std::endl;std::cout << '\n' << std::flush;

4.因为系统在空闲的时候会不停的检查缓冲区,如果发现新内容,将刷新缓冲区,这也是为什么我们不用std::endl或std::flush时也可以正常输出的原因。

5.当从键盘向程序输入数据时,对于如何指出文件结束,不同操作系统有不同的约定。在Windows系统中,输入文件结束符的方法是Ctrl + Z,然后按Enter或Return键。在UNIX系统中,包括Mac OS X系统中,文件结束符输入是用Ctrl+D。

6.由IO对象不能拷贝,所以不能将形参或返回类型设置为流类型,通常以引用的方式传递和返回流,而且不能是const类型。

7.IO类定义的一些函数和标志,可以帮助我们访问和操纵流的条件状态。

8.一个流一旦发生错误,其上后续的IO操作都会失败,只有当一个流处于无错状态时,我们才可以从它读取或写入数据。

9.每个流都管理一个缓冲区,用来保存程序读写的数据,导致缓冲刷新的原因有很多:

  • 程序正常结束
  • 缓冲区满
  • 调用endl或flush或ends(ends向缓冲区插入一个空字符,然后刷新缓冲区。)
  • 每个输出操作之后,我们可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的。
  • 一个输出流可能被关联到另一个流,当读写被关联的流时,关联到的流的缓冲区会被刷新。例如默认情况下,cin和cerr都关联到cout,因此读cin或写cerr都会导致cout的缓冲区刷新。
std::cout << std::unitbuf;        // 所有输出操作后都会立即刷新缓冲区
std::cout << std::nounitbuf;    // 回到正常的缓冲方式

int i;
std::cin >> i;    // 会导致cout的缓冲区被刷新

10.如果程序异常中止,输出缓冲区是不会被刷新的。当一个程序崩溃后,它所输出的数据很可能停留在输出缓冲区中等待打印。

11.我们既可以将一个istream对象关联到另一个ostream,也可以将一个ostream关联到另一个ostream,每个流同时最多关联到一个流,但是多个流可以同时关联到一个ostream。

std::cin.tie(&std::cout);        //标准库将cin和cout关联在一起
std::ostream *old_tie = std::cin.tie(nullptr);    // old_tie指向当前关联到cin的流(如果没有则是空),cin不再与其他流关联
std::cin.tie(&std::cerr);    // 读取cin会刷新cerr而不是cout

文件输入输出

1.除了继承自iostream类型的行为之外,fstream中定义的类型还增加了一些新的成员来管理与流关联的文件。

2.创建文件流对象时,如果提供文件名,则open会被自动调用。

3.一旦一个文件流已经打开,它就保持与对应文件的关联。对于一个已经打开文件流调用open会失败。当一个fstream对象被销毁时,close会被自动调用。

4.每个流都有一个关联的文件模式,用来指出如何使用文件。

默认情况下当我们打开一个ofstream时,文件的内容会被丢失。可以指定app模式避免。而且只要trunc没有被设定,就可以设定app模式。

string类

1.sstream中增加了一些成员来管理与流相关的操作。

转载于:https://www.cnblogs.com/zoneofmine/p/7221711.html

C++ Primer 笔记——IO类相关推荐

  1. C++primer第八章 IO库 8.1 IO类

    IO库设施 istream  (输入流)类型,提供输入操作. ostream (输出流)类型,提供输出操作. cin,-个 istream对象,从标准输入读取数据. cout, 一个ostream对象 ...

  2. c++进阶---IO类的详细介绍(一)

    IO类 c++为了更好的处理不同的种类的IO的操作,IO库中定义了庞大的类库来处理不同种类的IO操作,该类库组成如下图所示: 首先,我们先了解一下这个庞大的IO库各个类之间的关系. ios是最基本的父 ...

  3. C++Primer笔记——拷贝控制

    CHAPTER13-拷贝控制(C++ Primer笔记) 13.1 拷贝.赋值与销毁 13.1.1 拷贝构造函数 13.1.2 拷贝赋值运算符 13.1.3 析构函数 13.1.4 三/五法则 13. ...

  4. ASM学习笔记2 - 类的创建和修改 —— ClassWriter的综合应用

    ASM学习笔记2 - 类的创建和修改 -- ClassWriter的综合应用 上回我们说到,通过使用ClassVisitor和ClassReader,我们能够分析已经存在的类.这一节中,我们将使用Cl ...

  5. c++语言文件流,C++ IO类、文件输入输出、string流详细讲解

    新的C++标准中有三分之二的内容都是描述标准库.接下来重点学习其中几种核心库设施,这些是应该熟练掌握的. 标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围 ...

  6. [C++]C++中的IO类

    C++中的IO类 C++语言不直接处理输入输出,而是通过一组定义在标准库中的类型来处理IO.这些类型支持从设备读取数据,向设备写入数据的IO操作,设备可以是文件,控制台窗口等.还有一些类型允许内存IO ...

  7. C++ 流的操作 | 初识IO类、文件流、string流的使用

    文章目录 前言 IO头文件 iostream fstream sstream 流的使用 不能拷贝或对 IO对象 赋值 条件状态与 iostate 类型 输出缓冲区 文件流 fstream类型 文件模式 ...

  8. Xamarin开发笔记—设备类amp;第三方弹窗的使用和注意事项

    一.设备类是Xamarin重要开发组成部分,下面介绍一下设备类的主要用法: //唤醒打电话 Device.OpenUri(new Uri("tel:180xxxxxxxx")); ...

  9. Xamarin开发笔记—设备类第三方弹窗的使用和注意事项

    一.设备类是Xamarin重要开发组成部分,下面介绍一下设备类的主要用法: //唤醒打电话 Device.OpenUri(new Uri("tel:180xxxxxxxx"));/ ...

最新文章

  1. thinkphp5.1嵌套关联预载入的写法
  2. 【Android 安装包优化】WebP 图片格式性能测试 ( 测试 WebP 图片解码速度 | 测试 WebP 图片编码速度 )
  3. ERP系统开发平台 (C#语言,支持多数据库)
  4. 最长回文子串Python解法
  5. 2021年Z世代“潮力量”洞察报告
  6. ctfshow-萌新-web5( 利用位运算符控制SQL获取网站敏感信息)
  7. Windows多线程应用程序的编译和链接
  8. Spring Cloud学习系列第三篇【服务容错保护】
  9. Python安装包下载、环境配置与工具包安装教程(详细版)
  10. html5 文本框只能输入正整数,控制input文本框只能输入正整数
  11. html怎么缩进字符间距,css字符间距(css文字间距怎么设置)
  12. 计算机视觉论文-2021-11-03
  13. Python指纹识别
  14. idea中maven打包报错:Compilation failure: Compilation failure
  15. 一键部署k8s集群(三节点)
  16. 什么是 SRE?一文详解 SRE 运维体系
  17. 【2019蓝桥杯国赛B组】排列数
  18. java 图形界面
  19. 用于私网的IP地址段
  20. Apple新发布的APFS文件系统对用户意味着什么

热门文章

  1. 荒野行动pc版服务器无响应,荒野行动PC版闪退怎么办 电脑版闪退解决方法
  2. eNSP路由器接口地址通过DHCP分配
  3. [转载]如何用JDO开发数据库应用(3)
  4. 已知某分页系统,主存容量为 64K 字节,页面大小为 1K,对一个 4 页大的作 业,其 0、1、2、3 页分别被分配到主存的 2、4、6、7 块中,试:将十进制的逻 辑地址 1023、2500、35
  5. css-富文本编辑显示
  6. 关于示波器探头的输入容抗问题解决
  7. 7-2 寻找大富翁 (34 分)
  8. crosstab交叉表_数据透视之交叉表 crosstab()
  9. Android Studio获取数字签名(SHA1)
  10. dva的用法_dva基本用法