【C++】C++中的I/O类总结——上篇

news2024/11/24 16:32:04

title: 【C++】C-中的I/O类总结
tags: C++
description: ’ ’
categories:

  • C++
    date: 2023-06-05 00:36:59

引入

#include <iostream>

int main(){

    std::cout<<"Hello World!"<<std::endl;

}

  • 我们在学习C++时,往往都是从上面这段程序开始的
    也就是在控制台窗口上打印Hello World

  • 但是现在回过头去看这段简单的程序
    你有没有思考过
    cout代表什么?
    iostream代表什么?
    endl又代表了什么?
    <<运算符的作用是什么?
    为什么这样的操作就可以在屏幕上打印"Hello World"?
    等等问题

  • 看似简单的代码,背后却蕴含着庞大的知识体系

  • 之前一直对这些问题不太清晰
    现在重新回过头来总结一下

概念

C++的标准库中有专门用来进行IO操作的一种类,叫IO类,也叫输入输出流
通过这些IO类可以实现控制台IO,文件IO,内存IO
也就是向控制台/文件/内存写入数据,
以及从控制台/文件/内存读取数据,

分类

  • IO一共有9中

  • 在iostream.hpp中定义了ostream istream iostream这三个类

      (1)istream是用于从控制台读取内容的流类,cin就是该类的对象
      
      (2)ostream是用于把内容输出到控制台的流类,cout就是该类的对象.
      
      (3)iostream是既能用于从控制台读取,又能把内容输出到控制台的类。
    
  • 在fstream.hpp中定义了ofstream ifstream fstream这三个类

      (1)ifstream是用于从文件读取数据的类.
      
      (2)ofstream是用于向文件写人数据的类.
      
      (3)fstream是既能从文件读取数据,又能向文件写人数据的类,
    
  • 在sstream.hpp这个头文件中 定义了stringstream类 ostringstream 类 istringstream类

      (1)istringstream是用于从内存读取数据的类.
      
      (2)ostringstream是用于向内存写人数据的类.
      
      (3)stringstream是既能从内存读取数据,又能向内存写入数据的类,
    

下面两张图展示了不同的IO类之间的继承关系

在这里插入图片描述

在这里插入图片描述

特性

    1. 不能对IO对象赋值或者拷贝。
ofstream out1,out2;
out1 = out2; //错误:不能对流对象赋值
ofstream print (ofstream); 错误:不能初始化ofstream参数
out2 =  print (out2);  错误:不能拷贝流对象

  • 2.函数参数和返回值

      由1得知 ,当函数的参数或者返回值使用了IO对象类型,不能采用值传递,
      不能采用const 引用方式传递 , 
      只能采用非const 引用方式传递
    
    1. 错误处理

    在通过IO类进行读取的时候 不可避免会出现一些错误,比如文件格式错误 ,输入了错误的格式等等,
    C++中定义了一种叫 strm::iostate的bitset来表示对IO类读取操作时的不同状态 包含以下四种状态:

        1.strm::goodbit:流处于有效状态。该位为 0 表示流没有出现任何错误。
        2.strm::failbit:由于格式或类型错误,读写操作失败。
                                  例如,从流中读取的值无法转换为有效的目标类型。该位为 1 表示发生了此类错误。
        3.strm::eofbit:已经读到流的末尾,即无法继续读取数据。
                        该位为 1 表示读取操作已到达流的末尾。
        7.strm::badbit:流发生严重的错误,无法恢复。例如,数据无法从磁盘读取或写入磁盘,
                                 或者与底层设备的通信失败。该位为 1 表示发生了此类错误。
        ```
        以上四种条件状态可以按位组合使用,例如 s.fail() | s.eof() 表示流可能发生了读取失败或到达末尾的情况。
    

    同时C++的IO类提供了下面这些接口进行状态判定和状态清除

    		    1.s.eof():判断输入流 s 是否读到文件末尾,即文件读取是否结束。如果已经到达文件结尾,就返回 true,否则返回 false。
    		    2.s.fail():判断是否在读取或写入流的过程中出现了错误,例如读取了无效的数据类型。如果流发生了 failbit 或 badbit 错误,则返回 true,否则返回 false。
    		    3.s.bad():判断流是否发生了不可恢复的错误,例如在程序运行时无法打开文件或者无法从流中读取数据。如果流发生了 badbit 错误,则返回 true,否则返回 false。
    		    4.s.good():判断流是否处于有效状态,即没有发生任何错误。如果流处于有效状态,则返回 true,否则返回 false。
    		    5.s.clear():将流 s 的所有条件状态位都复位,将流的状态设置为有效。该函数没有参数,返回值为 void。
    		    6.s.clear(flags):根据给定的 flags 标志位,将流 s 中对应条件状态位复位。flags 的类型为 strm::iostate,可以使用 | 运算符同时设置多个标志位。该函数没有返回值。
    		    7.s.setstate(flags):根据给定的 flags 标志位,将流 s 中对应条件状态位置位。flags 的类型为 strm::iostate,可以使用 | 运算符同时设置多个标志位。该函数没有返回值。
    		    8.s.rdstate():返回流 s 的当前条件状态,
    
    

下面是使用实例
在这里插入图片描述

在这里插入图片描述

  • 4.缓冲区机制

    什么是缓冲区机制?

      当我们在用std::cout的时候
      如果这样写的话std::cout<<"Hello World";
      那么当程序执行完这句时 屏幕上可能不会打印Hello world 也可能会打印
      这是因为每个输出流都管理一个缓冲区,用来保存程序读写的数据。
      当你执行上面的cout时,
      内容有可能被操作系统保存在缓冲区中,随后再打印。
      也有可能刚好缓冲区满了然后立刻打印
    

    为什么要有缓冲区机制?

      有了缓冲机制,
      操作系统就可以将程序的多个输出操作组合成单一的系统级写操作。
      由于操作系统级的写操作可能很耗时,
      允许操作系统将多个输出操作组合
     为单一的设备写操作可以带来很大的性能提升。
    

    缓冲区什么时候会刷新?

    1.程序正常结束
    程序异常结束,输出缓冲区不会被刷新
    在这里插入图片描述

    2.缓冲区满时
    3. 使用endl/flush/ends来强制刷新
    在这里插入图片描述

    4.进行unitbuf设置

    注意 默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的。
    在这里插入图片描述

    ·5.一个输出流可能被关联到另一个流。
    在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。
    例如,默认情况下,cin和cerr都关联到cout。因此,读cin或写cerr都会导致cout的缓冲区被刷新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/613729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React - Mobx

Mobx 简介 mobx是一个可以和React良好配合的集中状态管理工具&#xff0c;和Redux解决的问题相似&#xff0c;都可以独立组件进行集中状态管理 优势 简单 编写无模板的极简代码精准描述你的意图 轻松实现最优渲染 依赖自动追踪&#xff0c;实现最小渲染优化 架构自由 可…

Flutter - 一行命令解决多个pubspec.yaml文件的依赖项问题

文章目录 前言开发环境Flutter内置命令一行命令实现1. 命令使用2. 命令解释3. 命令扩展 最后 前言 项目为了模块化&#xff0c;创建了一堆Package和Plugin&#xff0c;这么做没什么问题&#xff0c;但是遇到Flutter SDK目录路径变化或者其他一些情况导致需要重新获取依赖项时就…

50+常用的广告联盟术语 (常用缩写)

广告联盟术语是指与广告联盟业务有关的行话和缩写。这些术语通常用于描述商业模型、营销策略、流量源、收益模型等方面的概念。了解广告联盟术语对于广告主、联盟会员、广告服务提供商等参与者都非常重要&#xff0c;因为它们可以帮助他们更好地理解广告联盟业务&#xff0c;提…

IDEA 2022.3.3 创建SpringBoot项目

目录 步骤01&#xff1a;快速创建项目 步骤02&#xff1a;选择依赖 步骤03&#xff1a;pom文件中版本问题 ​步骤04&#xff1a;启动测试 4.1、认识引导类 4.2、创建Controller类进行测试 可能遇到的问题及解决方案 附件1&#xff1a;pom文件源码 附件2&#xff1a;项…

华为OD机试题【食堂供餐】【2023 B卷 100分】

文章目录 &#x1f3af; 前言&#x1f3af; 题目描述&#x1f3af; 解题思路&#x1f4d9; Python代码实现&#x1f4d7; Java代码实现&#x1f4d8; C语言代码实现 &#x1f3af; 前言 &#x1f3c6; 《华为机试真题》专栏含2023年牛客网面经、华为面经试题、华为OD机试真题最…

Python使用正则表达式识别代码中的中文、英文和数字实例演示

Python 正则表达式识别代码中的中文、英文和数字 识别中文识别英文识别数字拓展 在文本处理和数据分析中&#xff0c;有时候需要从代码中提取出其中包含的中文、英文和数字信息。正则表达式是一种强大的工具&#xff0c;可以帮助我们实现这一目标。本文将分三个部分详细介绍如何…

chatgpt赋能python:Python如何倒序输出一组数

Python如何倒序输出一组数 Python是一种广泛使用的高级编程语言&#xff0c;由于其易读性和简洁性&#xff0c;Python已成为Web开发、数据分析以及人工智能等方向的首选语言。而在程序编写过程中&#xff0c;倒序输出一组数也是一个经常用到的操作。在本文中&#xff0c;我们将…

ActiveReportsJS 4.0.2 Crack ActiveReportsJS New

ActiveReportsJS - 高级 JavaScript 报告解决方案 ActiveReportsJS 是一个强大的 Web 应用程序报告工具&#xff0c;它允许开发人员和报告作者轻松地在他们的应用程序中设计和显示报告。凭借广泛的功能&#xff0c;例如向下钻取、运行时数据过滤和参数驱动的报告&#xff0c;以…

基于时间的访问控制列表(ACL)配置实验

基于时间的访问控制列表&#xff08;ACL&#xff09;配置实验 【实验目的】 掌握基于时间的ACL配置。认识给予时间的ACL的作用。验证配置。 【实验拓扑】 实验拓扑如下图所示。 设备参数如下表所示。 设备 接口 IP地址 子网掩码 默认网关 R1 S0/3/0 192.168.1.1 255…

24万字智慧城市时空信息云平台 大数据一体化 解决方案word

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除篇幅有限&#xff0c;无法完全展示&#xff0c;喜欢资料可转发评论&#xff0c;私信了解更多信息。 第二章 XX新型智慧城市总体设计 2.1 新型智慧城市核心技术 2.2 新型智慧城…

chatgpt赋能python:Python如何倒着循环:一步步教你倒序遍历序列

Python如何倒着循环&#xff1a;一步步教你倒序遍历序列 Python是一种高级编程语言&#xff0c;因其语法简单易学&#xff0c;常被用于数据分析、机器学习、自然语言处理等领域。在实际开发中&#xff0c;我们经常需要遍历序列。有时需要倒着循环序列&#xff0c;本文将详细介…

Roop:Colab脚本使用方法!

​AI领域人才辈出&#xff0c;突然就跳出一个大佬“s0md3v”&#xff0c;开源了一个单图就可以进行视频换脸的项目。 项目主页给了一张换脸动图非常有说服力&#xff0c;真是一图胜万言。 快速在本地配置一个环境&#xff0c;验证了一下&#xff0c;确实还不错。主要是&#xf…

使用ChatGPT生成思维导图(附永久免费镜像网址)

前言 思维导图&#xff08;The Mind Map&#xff09;&#xff0c;是表达发散性思维的有效图形思维工具。思维导图运用图文并重的技巧&#xff0c;把各级主题的关系用相互隶属与相关的层级图表现出来&#xff0c;把主题关键词与图像、颜色等建立记忆链接 &#xff0c;可以应用于…

Python-web开发学习笔记(3):CSS基础

&#x1f680; Python-web开发学习笔记系列往期文章&#xff1a; &#x1f343; Python-web开发学习笔记&#xff08;1&#xff09;--- HTML基础 &#x1f343; Python-web开发学习笔记&#xff08;2&#xff09;--- HTML基础 &#x1f343; Python-web开发学习笔记&#xff08…

网络层概述及提供的两种服务

1.网络层概述及提供的两种服务 笔记来源&#xff1a; 湖科大教书匠&#xff1a;网络层概述 湖科大教书匠&#xff1a;网络层提供的两种服务 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 1.1 网络层概述 网络层的主要任务是实现网络互连&#xf…

Linux 高级篇-日志管理

Linux 高级篇-日志管理 基本介绍 日志文件是重要的系统信息文件&#xff0c;其中记录了许多重要的系统事件&#xff0c;包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。日志对于安全来说也很重要&#xff0c;它记录了系统每天发生的…

Python读写EXCEL文件常用方法

python读写excel的方式有很多&#xff0c;不同的模块在读写的讲法上稍有区别&#xff0c;这里我主要介绍几个常用的方式。 用xlrd和xlwt进行excel读写&#xff1b;用openpyxl进行excel读写&#xff1b;用pandas进行excel读写&#xff1b; 一、数据准备 为了方便演示&#xf…

在滴滴和字节干了4年测试开发,简直不要太真实…

先简单交代一下&#xff0c;某不知名211的本硕&#xff0c;18年毕业加入滴滴&#xff0c;之后跳槽到了头条&#xff0c;一直从事测试开发相关的工作。之前没有实习经历&#xff0c;算是四年的工作经验吧。 这四年之间完成了一次晋升&#xff0c;换了一家公司&#xff0c;有过开…

Linux环境下Mysql8的下载、安装、主从模式搭建

主库部署 下载 下载地址:MySQL :: Download MySQL Community Server (Archived Versions) 文件名称:mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz 解压 先解压xz xz -d mysql-8.0.17-linux-glibc2.12-x86_64.tar.xz 再解压tar tar -xvf mysql-8.0.17-linux-glibc2.12-…

QT 5.14 和 VS2017脱机离线安装记录

QT 5.14是最后的离线安装版本&#xff0c;都推荐这个。看了下&#xff0c;官方建议搭配 VS2017/VS2015 VS版本对于QT&#xff0c;我一直偏好社区版&#xff0c;只要编译器就够了&#xff0c;自己加上SDK目录。因为大部分工作都是在QT内完成。VS2017的离线安装比较复杂&#xff…