初识C++之C++中的IO流

news2024/11/14 15:38:47

目录

一、C语言中的输入与输入

二、流

三、C++中的流

四、C++中的文件IO流

1. 二进制文件

1.1 打开文件

1.2 向文件写入数据

1.3 从文件读取数据

1.4 关闭文件

1.5 综合使用

2. 文本读写


一、C语言中的输入与输入

在C语言中,我们最长使用的输入输出方式就是“scanf()"“printf()”。scanf()从标准输入设备(键盘)读取数据,并将值存放在变量中。printf()则将制定的文字/字符串输出到标准输出设备(屏幕)。在printf()中,可以控制宽度输出和精度输出。

C语言中的输入输出就是借助了缓冲区来实现的。即通过代码将特定的数据写到缓冲区,OS再将缓冲区内的数据刷新到设备中。反之亦然

二、流

在C++中,提出了“流”的概念。“流”可以看成是流动的意思,即物质从一处向另一处流动。是对一种有序连续具有方向性的数据的抽象描述。

C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程就被叫做“流”。

流的特点是“有序连续”“具有方向性”

为了实现流,C++中就定义了I/O标准类库,这些每个类都被称为流/流类。

三、C++中的流

上面就是一张C++中的流的结构图。它是通过继承来实现的。

在以前,大家使用C++中的流时,内置类型可以直接使用。能够直接使用的原因,其实是因为C++库中已经进行了对应的处理。例如istream:

这个类里面包含了大量的接口,其中就有对“>>”的重载:

所以,在平常使用时>>能够对内置类型直接使用的原因,就是C++库中已经对内置类型完成了>>重载。

大家刷题的时候,应该都写过如下代码:

一个while循环里面不断的输入数据。在cin中,是依靠空格来区分字符串的。\n就是换行,将缓冲区内的内容刷新出去。

但是,大家有没有想过,这个循环是如何结束的。实际上,有两种方式结束。

第一种方法就是按下“ctrl c”。这种方法就是向进程发送信号,直接终止进程

第二种方法就是“ctrl z”。这是让cin返回一个false,终止掉这个流

注意,ctrl c是终止进程,所以当按下后,会直接终止进程,无论下面还有什么内容,都不会再继续运行。但是ctrl z是让cin返回false,终止掉这个流。所以如果ctrl z终止的流后面还有while循环,它就会进入继续执行

ctrl c终止:

ctrl z终止:

当然,C++库中的I/O标准库是非常丰富的,这里就不过多介绍,碰到需要的情况下直接去查询即可。

四、C++中的文件IO流

在C++中,根据文件的数据格式分为二进制文件文本文件

1. 二进制文件

1.1 打开文件

为了方便演示,先准备以下的类:

在这里,要将ServerInfo的数据通过ConfigManger类写入到文件中。

在C++中,要写入文件,就可以使用ofstream:

这是一个类,因此,要写入数据,首先就需要构造出一个对象。查看它的构造函数:

我们可以构造出一个空的ofstream对象,然后通过open来打开文件:

也可以在构造函数中就直接打开。

C++中打开文件的方式就和C有所不同,它的关键字如下:

其中,in是只读,out是只写,app是追加,trunc是覆盖写,binary是二进制形式写。

C++中传文件打开方式也和C中传“a”,“r+”之类的字符串不同。因为out和in这些可以被看成是在基类中被定义好的静态变量,所以在使用时要加上它所在的域。一般是“ios_base”。因为ios_base是所以输入输出流的基类。

当然,你也可以直接填它所在的域,例如这里就可以填ofstream:

两种方法都是可行的,在使用时记得包头文件<fstream>

1.2 向文件写入数据

要向文件写入数据,可以使用write函数

write函数可以写入一个字符串。其中s是要写入的字符串n是这个字符串的大小

如果只是想写入一个字符,就可以使用put函数:

总的来讲,使用最多的还是write函数。使用起来也很简单:

1.3 从文件读取数据

要从文件中读取数据,就需要使用ifstream

 它的构造函数和ofstream是非常类似的,都支持无参构造和带参构造:

同样的,无参构造需要使用open函数打开文件;带参构造则是在构造时打开文件。打开方式和ofstream也是一样的:

而ifstream中的读取文件的函数,就是read:

使用起来也很简单:

1.4 关闭文件

在C++,是不用考虑关闭文件的。因为这些流都是用类封装的,一旦出了作用域就会调用析构函数关闭文件,无需用户手动关闭。

1.5 综合使用

有了上面的知识,就可以写出一个简单的读写文件的程序:

运行程序后,可以在目录中找到log.txt文件。打开该文件:

里面是如下内容。出现这些内容的原因是这里是以二进制方式写入的。编译器内部会经过很多处理,例如内存对齐,所导致的。不必过多关注。

总之,要读取的话,是可以读取出正确的数据的:

注意,在这里的程序中,使用的是数组,而不是string。用二进制读写的时候,如果使用string是会出问题的。修改程序:

运行程序:

可以看到,程序此时的返回码为负数。只要这个返回码不为0,就说明程序运行出错了。

这里的原因就是二进制读写。在二进制读写中,因为它要写的是对象中的值。而对象中又使用的是string保存数据,string里面又存在指针,用于指向数据存储的空间。这就导致,二进制读写在写数据时,会将string中的指针写过去,而不是将数据内容写过去

如果是同一个程序读写还好。如果是不同程序读写,原先写进去的指针就已经是野指针了,造成越界访问。总的来讲,无论是否是同一个程序读写,都会造成程序错误。而使用数组,二进制读写就是把数组的内容原模原样的写过去,所以不会出现错误。因此,在未来如果要使用二进制读写,不要使用string,而是使用数组存储数据

2. 文本读写

基于上面二进制读写的缺陷。使用在C++中推荐使用文本读写。使用文本读写,那么无论是数组还是string都可以适用

文本读写的话打开文件的方式和二进制读写是一样的,只是不需要加上ios_base::binary。同时文本读写也可以不传后面打开文件的方式了。因为构造函数中是有缺省参数的。

打开文件也可以直接使用构造函数打开:

文本读写甚至可以不用再使用read和write。因为ifstream中重载了“>>”;ofstream中重载了“<<”。因此,我们甚至可以直接使用这个重载来实现读写文件:

使用起来就和我们以前所使用的标准输入输出流是一样的。

写入如下程序:

 运行程序:

结果没有问题。如果想写入自定义类型,例如一个日期类,就可以使用列表初始化和自己重载>>和<<实现。

提供如下一个日期类和对应的>>和<<重载: 

修改程序如下:

 运行该程序:        

程序依然可以正常运行。

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

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

相关文章

0基础小白简单入门使用emqx的webhook+规则实现Mysql数据持久化

EMQX (opens new window)是一款大规模可弹性伸缩的云原生分布式物联网 MQTT (opens new window)消息服务器。 作为全球最具扩展性的 MQTT 消息服务器&#xff0c;EMQX 提供了高效可靠海量物联网设备连接&#xff0c;能够高性能实时移动与处理消息和事件流数据&#xff0c;帮助…

EndNote X9 参考文献附录列表 格式调整

文章目录 1 参考文献附录列表 格式调整2 EndNote X9 插入参考文献常见问题总结3 EndNote X9 快速上手教程&#xff08;毕业论文参考文献管理器&#xff09; 1 参考文献附录列表 格式调整 注意&#xff1a;这里讲的是对齐格式&#xff0c; 文献规范格式参考EndNote X9 快速上手…

发布会彩排哪些内容?要注意哪些细节?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 相信发布会前小伙伴都会进行彩排&#xff0c;对发布会的细节&#xff0c;流程&#xff0c;各个工种如何配合进行提前的演练&#xff0c;那么发布会彩排哪些内容&#xff0c;要注意哪些细…

数据结构-图的创建与深度优先遍历DFS(邻接矩阵-动态类型)

图的创建&#xff1a; 我们先构建一个无向图&#xff1a;如图所示 根据规定&#xff0c;如果两个顶点相连&#xff0c;则两顶点的边改为1&#xff0c;否则为0&#xff0c;我们用数组指针arcs来指向标记是否有边的数组。 1.先创建结构体&#xff0c;因为都为动态所以我们都先定…

RabbitMQ详解(四):SpringBoot整合MQ

SpringBoot整合MQ 需要创建两个springboot项目&#xff0c;一个springboot_rabbitmq_producer生产者&#xff0c;一个springboot_rabbitmq_consumer消费者 fanout模式&#xff08;配置文件方式&#xff09; 定义生产者 创建生产者工程 springboot_rabbitmq_producer pom.x…

DragonflyDB 安装使用

前言 全世界最快的内存数据库 Dragonfly是一种针对现代应用程序负荷需求而构建的内存数据库&#xff0c;完全兼容Redis和Memcached的 API&#xff0c;迁移时无需修改任何代码。相比于这些传统的内存数据库&#xff0c;Dragonfly提供了其25倍的吞吐量&#xff0c;高缓存命中率和…

演化博弈模型简介

演化博弈模型简介 文章目录 演化博弈模型简介[toc]1 演化博弈思想2 演化博弈关注的问题3 复制动态中的博弈 1 演化博弈思想 传统博弈苛刻假设&#xff1a; 完全理性完全信息 演化博弈论&#xff1a;演化博弈论(Evolutionary Game Theory)把博弈理论分析和动态演化过程分析结…

【python】Pandas库用法详解!

pandas 是基于NumPy 的一种工具&#xff0c;该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型&#xff0c;提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现&#xff0c;它是使Py…

Android系统启动流程(三)——属性服务

1 属性服务 属性服务的启动在init进程中&#xff0c;init进程初始化的第二阶段初始化中启动了属性服务。 system/core/init/init.cpp int SecondStageMain(int argc, char** argv) {...PropertyInit();...StartPropertyService(&property_fd);...2 启动属性服务 system/…

Win系统软件闪屏/Edge闪屏/Office闪屏 - 解决方案

Win系统软件闪屏/Edge闪屏/Office闪屏 - 解决方案 前言原因解决方案方案1&#xff08;推荐&#xff09;&#xff1a;重新安装核显驱动方案2&#xff1a;软件使用独显方案3&#xff1a;软件关闭硬件加速 前言 使用Win10及以上系统时&#xff0c;可能会出现频繁闪现黑屏的状态&a…

【jupyter】mac os系统下的jupyter的实用技巧

Jupyter notebook是一个开源的web应用&#xff0c;可以让你创建和分享包含代码、公式、可视化和叙述文本的文档。它可以用于数据清洗和转换、数值模拟、统计建模、数据可视化、机器学习等多种用途。 在mac os系统下&#xff0c;有多种方法可以安装jupyter notebook&#xff0c…

十大生产力神器,包括5大jupyter插件和五个提升python研发生产力的神器

JupyterLab&#xff1a;一款下一代的笔记本界面&#xff0c;支持多种编程语言&#xff0c;包括python。它具有灵活的界面&#xff0c;可以配置和安排数据科学、科学计算、计算新闻和机器学习等领域的工作流程。 Voil&#xff1a;一款可以将笔记本转换为安全、独立的web应用程序…

将字符串数组转换为字符串类型

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 当你在Java编程中需要将一个字符数组转换为字符串类型时&#xff0c;你可以使用Java内置的String类提供的方法。在本文中&#xff0c;笔者将介绍两种将字符数组转换为…

RabbitMQ详解(二):消息模式 Simple(简单)模式

消息模式 Simple(简单)模式 前提&#xff0c;开放5672:RabbitMQ的通讯端口&#xff0c;及查看创建用户的权限 构建maven工程 导入依赖 依赖下载地址: https://mvnrepository.com/artifact/com.rabbitmq/amqp-client <dependency><groupId>com.rabbitmq</group…

协议:HTTP基础内容掌握

一、简单理解 HTTP HTTP 协议一般指 HTTP&#xff08;超文本传输协议 Hyper Text Transfer Protocol&#xff09;。 HTTP是一个简单的请求/响应协议&#xff0c;它运行在TCP之上。 HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件, 图片文件, 查询结果等&#x…

活动预告 Flutter 之夜 | Flutter Night Beijing

Flutter 是一个开源、可移植的 UI 框架&#xff0c;它为开发人员提供了超能力&#xff0c;可以从单个代码库为任何平台构建美观、高质量的应用程序。它将统一代码库和快速迭代开发的生产力与本机编译和硬件加速渲染的性能和功能相结合。Flutter 今天支持的平台包括安卓&#xf…

简单随机微分方程数值解

1.随机微分方程求解&#xff1a;dX(t) − αXtdt σdWt 法一&#xff1a;Euler-Maruyama %% %O-U过程 %dX(t)-alpha*Xt*dtsigma*dWt,X|t0X0 %alpha2,sigma1,X01 % 设置初始参数 T 1; % 时间区间长度 N 1000; % 离散化的时间步数 dt T/N; …

[医学分割比赛] ISBI2023 APIS多模态医学分割比赛总结 + top3解决方案

ISBI2023 APIS多模态医学分割比赛总结 top3解决方案 0.比赛背景1.比赛任务及结果2.第三名方案 - 龙盈智达&#xff08;北京&#xff09;科技有限公司(0) Data Preprocessing(1) Data Augmentation(2) Approach&#xff08;Model&#xff09;(3) Approach(Data Sampling)(4) Ap…

【QT】学习课-pushButton的使用(1)!

Qt 是一个1991年由Qt Company开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序&#xff0c;也可用于开发非GUI程序&#xff0c;比如控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代码生成扩展&#xff08;称为元对象编译器(Meta Object Compi…

《WebGIS快速开发教程》写好啦

告诉大家一个好消息&#xff0c;经过我没日没夜&#xff0c;呕心沥血的创作&#xff0c;这本叫做《WebGIS快速开发教程》的书籍终于写好了。这本书适用于还未毕业的学生、以及正在从事传统前后端开发但是想转到WebGIS开发的人。 这本书的特点突出一个“快”和“轻”&#xff0c…