当前位置: 首页 > news >正文

【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]

在这里插入图片描述

阅读导航

  • 引言
  • 一、C语言的输入与输出
  • 二、流是什么
  • 三、C++IO流
    • 1. C++标准IO流
      • (1)istream
      • (2)ostream
      • (3)iostream
      • (4)cin 和 cout
    • 2. C++文件IO流
      • (1)ifstream
      • (2)ofstream
      • (3)fstream
  • 四、stringstream的简单介绍
  • 温馨提示

引言

C++中的IO流(输入输出流)是程序与外部环境之间进行数据交互的重要手段。通过IO流,程序可以从外部读取数据或将数据输出到外部,实现了程序与用户、其他程序和设备之间的数据传输。C++标准库提供了丰富的IO流类和函数,通过这些类和函数,开发者能够方便地实现各种类型的IO操作。本文将介绍IO流的基本概念和相关类,讲解如何在C++程序中使用IO流实现输入输出操作,并给出相应的示例代码以说明其用法。同时,还将介绍一些常见的IO流操作技巧和使用注意事项,帮助读者更好地掌握和应用C++中的IO流机制。通过学习本文,读者将能够深入理解C++中的IO流,掌握IO流的使用方法,提高程序的输入输出效率和稳定性。

一、C语言的输入与输出

C语言中我们用到的最频繁的输入输出方式就是scanf ()printf()

  • scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中
  • printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)

🚨🚨注意宽度输出和精度输出控制

C语言借助了相应的缓冲区来进行输入与输出。如下图所示:
在这里插入图片描述
⭕对输入输出缓冲区的理解:

  1. 可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序
  2. 可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”

二、流是什么

“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据( 其单位可以是bitbytepacket )的抽象描述。

C++中的流是一种抽象描述,用于表示数据从一个地方(输入设备)流向另一个地方(输出设备)的过程。它描述了数据以有序连续和具有方向性的方式流动的特性。在C++中,流被比喻为信息从外部输入设备(如键盘)向计算机内部(如内存)输入,或者从内存向外部输出设备(如显示器)输出的过程。为了实现这种流动,C++提供了I/O标准类库,其中的每个类都被称为流或流类,用于完成不同方面的输入输出功能。通过使用这些流类,我们可以实现数据的输入和输出操作,实现与外部环境的交互。

🔴C++提供的I/O标准类库

在这里插入图片描述

三、C++IO流

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类
在这里插入图片描述

1. C++标准IO流

C++标准库提供了4个全局流对象cincoutcerrclog使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,coutcerrclogostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。

在这里插入图片描述

(1)istream

istream 是输入流的基类,它提供了从外部读取数据的功能。常用的 istream 类有 istream, ifstream(从文件读取)和 istringstream(从字符串读取)。

⭕常用的 istream 函数包括:

  • get():从流中获取下一个字符并返回其 ASCII 值。
  • getline():从流中读取一行文本,并将其存储在指定的字符串变量中。
  • operator>>:从流中读取数据并将其存储在指定的变量中。

例如:

int num;
std::cin >> num; // 从标准输入设备读取一个整数

(2)ostream

ostream 是输出流的基类,它提供了向外部写入数据的功能。常用的 ostream 类有 ostream, ofstream写入到文件)和 ostringstream写入到字符串)。

⭕常用的 ostream 函数包括:

  • put():向流中写入一个字符。
  • write():向流中写入指定长度的数据。
  • operator<<:向流中写入数据。

例如:

int num = 42;
std::cout << "The answer is: " << num << std::endl; // 输出 "The answer is: 42"

(3)iostream

iostream 是同时具有输入和输出功能的流类,继承自 istreamostream。常用的 iostream 类有 iostreamfstream(用于文件输入输出)和 stringstream(用于字符串输入输出)。

例如:

int num;
std::cin >> num; // 从标准输入设备读取一个整数
std::cout << "You entered: " << num << std::endl; // 输出 "You entered: 42"

(4)cin 和 cout

cincout 是预定义的 istreamostream 对象,它们分别用于从标准输入设备(通常是键盘)读取数据和向标准输出设备(通常是屏幕)写入数据。

例如:

int num;
std::cout << "Enter a number: ";
std::cin >> num; // 从标准输入设备读取一个整数
std::cout << "You entered: " << num << std::endl; // 输出 "You entered: 42"

除此之外,C++标准IO流还提供了一些其他重要的类和函数,如格式化输入输出、流状态检查和文件输入输出等。你可以通过查阅相关文档或教程深入了解更多关于C++标准IO流的知识。

2. C++文件IO流

C++文件IO流是C++标准库提供的用于文件输入和输出的一组类和函数。它们可以用于读取和写入文件中的数据。

⭕C++文件IO流主要涉及以下几个类:

(1)ifstream

ifstream:用于从文件中读取数据的输入流类。通过创建 ifstream 对象,可以打开一个文件并从中读取数据。

⭕常用的 ifstream 成员函数有:

  • open():打开指定的文件。
  • close():关闭当前打开的文件。
  • is_open():检查文件是否成功打开。
  • operator>>:从文件中读取数据。

示例代码:

#include <fstream>
#include <iostream>int main() {std::ifstream file("example.txt");if (file.is_open()) {int num;while (file >> num) {std::cout << num << std::endl; // 输出文件中的整数}file.close();} else {std::cerr << "Failed to open file." << std::endl;}return 0;
}

(2)ofstream

ofstream:用于向文件中写入数据的输出流类。通过创建 ofstream 对象,可以打开一个文件并向其中写入数据。

⭕常用的 ofstream 成员函数有:

  • open():打开指定的文件。
  • close():关闭当前打开的文件。
  • is_open():检查文件是否成功打开。
  • operator<<:将数据写入文件。

示例代码:

#include <fstream>int main() {std::ofstream file("example.txt");if (file.is_open()) {file << "Hello, World!" << std::endl; // 向文件中写入字符串file.close();} else {std::cerr << "Failed to open file." << std::endl;}return 0;
}

(3)fstream

fstream:同时具有读取和写入功能的文件流类。通过创建 fstream 对象,可以打开一个文件并在其中进行读写操作。

⭕常用的 fstream 成员函数除了可以使用 ifstreamofstream 的成员函数外,还包括:

  • seekg():设置输入位置指针(用于读取)。
  • seekp():设置输出位置指针(用于写入)。

示例代码:

#include <fstream>
#include <iostream>int main() {std::fstream file("example.txt", std::ios::in | std::ios::out);if (file.is_open()) {int num;while (file >> num) {std::cout << num << std::endl; // 从文件中读取整数并输出}file.seekp(0, std::ios::end); // 将输出位置指针移动到文件末尾file << "New data" << std::endl; // 向文件中写入新数据file.close();} else {std::cerr << "Failed to open file." << std::endl;}return 0;
}

在使用文件IO流时,需要包含头文件 <fstream>,并根据需要选择适当的流对象(ifstreamofstreamfstream)。

四、stringstream的简单介绍

stringstream 是 C++ 标准库中的一个流类,它可以像 coutcin 一样进行输入输出操作。不同之处在于 stringstream 不是对控制台进行输入输出,而是对字符串进行输入输出。

stringstream 继承自 istreamostream,因此它既可以进行输入操作,也可以进行输出操作。stringstream 的主要作用是将数据转换为字符串或从字符串中读取数据。使用 stringstream 可以方便地进行格式化输出和解析字符串。

stringstream 的头文件是 <sstream>,它定义了以下三个类:

  • std::istringstream:从字符串中读取数据的输入流。
  • std::ostringstream:将数据输出到字符串的输出流。
  • std::stringstream:既可以输入数据,也可以输出数据的流。

使用 stringstream 进行输入输出操作的一般流程如下:

  1. 创建 stringstream 对象

可以使用默认构造函数创建一个空的 stringstream 对象,例如:

std::stringstream ss;
  1. 输入数据

可以使用运算符 << 将数据写入 stringstream 中,例如:

int num = 123;
std::string str = "hello";
ss << "The number is: " << num << ", the string is: " << str;
  1. 输出数据

可以使用成员函数 str()str(std::string&) 获取 stringstream 所包含的字符串,例如:

std::string output = ss.str();
std::cout << output << std::endl; // 输出:The number is: 123, the string is: hello
  1. 解析字符串

可以使用运算符 >>stringstream 中读取数据,例如:

std::string input = "123 4.56 hello";
int num;
double d;
std::string str;
ss.clear(); // 清空 stringstream 对象
ss.str(input);
ss >> num >> d >> str;
std::cout << num << " " << d << " " << str << std::endl; // 输出:123 4.56 hello

🚨🚨注意:在读取数据之前应该先清空 stringstream 对象,并使用成员函数 str(std::string&) 将要解析的字符串写入 stringstream

温馨提示

感谢您对博主文章的关注与支持!另外,我计划在未来的更新中持续探讨与本文相关的内容,会为您带来更多关于C++以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。期待与您建立更紧密的互动,共同探索C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

相关文章:

【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]

阅读导航 引言一、C语言的输入与输出二、流是什么三、CIO流1. C标准IO流&#xff08;1&#xff09;istream&#xff08;2&#xff09;ostream&#xff08;3&#xff09;iostream&#xff08;4&#xff09;cin 和 cout 2. C文件IO流&#xff08;1&#xff09;ifstream&#xff0…...

【Spark系列5】Dataframe下常用算子API

Apache Spark DataFrame API 提供了丰富的方法来处理分布式数据集。以下是一些常见的 DataFrame API 类别和方法&#xff0c;但这不是一个完整的列表&#xff0c;因为 API 非常广泛。这些方法可以分为几个主要类别&#xff1a; 转换操作&#xff08;Transformations&#xff0…...

【大数据】Flink SQL 语法篇(二):WITH、SELECT WHERE、SELECT DISTINCT

Flink SQL 语法篇&#xff08;二&#xff09; 1.WITH 子句2.SELECT & WHERE 子句3.SELECT DISTINCT 子句 1.WITH 子句 应用场景&#xff08;支持 Batch / Streaming&#xff09;&#xff1a;With 语句和离线 Hive SQL With 语句一样的&#xff0c;语法糖 1&#xff0c;使用…...

leetcode-链表专题

25.K个一组翻转链表 题目链接 25. K 个一组翻转链表 - 力扣&#xff08;LeetCode&#xff09; 解题思路 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class So…...

Vue打包Webpack源码及物理路径泄漏问题解决

修复前&#xff1a; 找到vue.config.js文件&#xff0c;在其中增加配置 module.exports {productionSourceMap: false,// webpack 配置configureWebpack: {devtool: false,}}其中打包的物理路径泄露我这边试了好多次&#xff0c;发现只有打包的时候NODE_ENVproduction 才能保…...

MySQL学习记录——일 MySQL 安装、配置

文章目录 1、卸载内置环境2、安装MySQL3、启动4、登录5、配置my.cnf 当前环境是1核2G云服务器&#xff0c;CentOS7.6。要在root用户下进行操作 1、卸载内置环境 云服务器中有可能会自带mysql还有mariadb这样的数据库服务&#xff0c;在安装我们mysql前&#xff0c;得先查找一下…...

获取真实 IP 地址(二):绕过 CDN(附链接)

一、DNS历史解析记录 DNS 历史解析记录指的是一个域名在过去的某个时间点上的DNS解析信息记录。这些记录包含了该域名过去使用的IP地址、MX记录&#xff08;邮件服务器&#xff09;、CNAME记录&#xff08;别名记录&#xff09;等 DNS 信息。DNS 历史记录对于网络管理员、安全研…...

正则表达式补充以及sed

正则表达式&#xff1a; 下划线算 在单词里面 解释一下过程&#xff1a; 在第二行hello world当中&#xff0c;hello中的h 与后面第一个h相匹配&#xff0c;所以hello中的ello可以和abcde匹配 在world中&#xff0c;w先匹配h匹配不上&#xff0c;则在看0&#xff0c;r&#…...

LLM智能体开发指南

除非你一直生活在岩石下&#xff0c;否则你一定听说过像 Auto-GPT 和 MetaGPT 这样的项目。 这些是社区为使 GPT-4 完全自治而做出的尝试。在其最原始的形式中&#xff0c;代理基本上是文本到任务。你输入一个任务描述&#xff0c;比如“给我做一个贪吃蛇游戏”&#xff0c;并使…...

基于springboot校园二手书交易管理系统源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括乐校园二手书交易管理系统的网络应用&#xff0c;在外国二手书交易管理系统已经是很普遍的方式&#xff0c;不过国内的管理系统可能还处于起步阶段。乐校园二手书交易管理系统…...

Oracle和Mysql数据库

数据库 Oracle 体系结构与基本概念体系结构基本概念表空间(users)和数据文件段、区、块Oracle数据库的基本元素 Oracle数据库启动和关闭Oracle数据库启动Oracle数据库关闭 Sqlplussqlplus 登录数据库管理系统使用sqlplus登录Oracle数据库远程登录解锁用户修改用户密码查看当前语…...

java学习笔记:java常见注解语句汇总、解析及应用

文章目录 一、什么是注解二、注解有什么作用三、常见的Java注解及其功能介绍和示例OverrideDeprecatedSuppressWarningsFunctionalInterfaceSafeVarargsSuppressWarnings 一、什么是注解 Java中所有以开头的语句被称为注解&#xff08;Annotation&#xff09;。 注解是一种元数…...

k8s Sidecar filebeat 收集容器中的trace日志和app日志

目录 一、背景 二、设计 三、具体实现 Filebeat配置 K8S SideCar yaml Logstash配置 一、背景 将容器中服务的trace日志和应用日志收集到KAFKA&#xff0c;需要注意的是 trace 日志和app 日志需要存放在同一个KAFKA两个不同的topic中。分别为APP_TOPIC和TRACE_TOPIC 二、…...

三维模型设计新纪元:3D开发工具HOOPS在机械加工行业的应用与优势

在当今快速发展的科技时代&#xff0c;机械加工行业正经历着巨大的变革&#xff0c;而HOOPS技术正是其中一项重要的创新。HOOPS技术不仅仅是一种用于处理和可视化计算机辅助设计&#xff08;CAD&#xff09;数据的工具&#xff0c;更是机械加工领域中提升效率、优化设计的利器。…...

Python爬虫子页面并写入text代码

这是工具类 class UrlManager():"""url管理器"""def __init__(self):self.new_urls set()self.old_urls set()def add_new_url(self,url):if url is None or len(url) 0:returnif url in self.new_urls or url in self.old_urls:returnself.…...

《PyTorch基础教程》01 搭建环境 基于Docker搭建ubuntu22+Python3.10+Pytorch2+cuda11+jupyter的开发环境

01 环境搭建 《PyTorch基础教程》01 搭建环境 基于Docker搭建ubuntu22+Python3.10+Pytorch2+cuda11+jupyter的开发环境 Docker部署PyTorch 拉取cnstark/pytorch镜像 拉取镜像: docker pull cnstark/pytorch:2.0.1-py3.10.11-cuda11.8.0-ubuntu22.04导出镜像: docker sa…...

MySQL进阶之触发器

触发器 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前(BEFORE)或之后(AFTER)&#xff0c;触 发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性 , 日志记录 , 数据校验等操作 。 使用别名OLD和NEW来引用…...

循环神经网络RNN专题(01/6)

一、说明 RNN用于处理序列数据。在传统的神经网络模型中&#xff0c;是从输入层到隐含层再到输出层&#xff0c;层与层之间是全连接的&#xff0c;每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如&#xff0c;你要预测句子的下一个单词是什么&a…...

C# 怎么判断屏幕是第几屏幕?屏幕是垂直还是水平?屏幕的分辨率?

一、怎么判断屏幕是第几屏幕&#xff1f; 可以使用System.Windows.Forms.Screen.AllScreens属性来获取所有已连接的屏幕&#xff0c;并根据鼠标位置或窗口的位置来判断它所在的屏幕索引。 using System; using System.Windows.Forms;// 获取鼠标当前位置所在的屏幕 Point cur…...

在 SQL Server 中使用 SQL 语句查询不同时间范围的数据

在 SQL Server 中&#xff0c;我们经常需要从数据库中检索特定时间范围内的数据。通过合理运用 SQL 语句&#xff0c;我们可以轻松地查询今天、昨天、近7天、近30天、一个月内、上一月、本年和去年的数据。下面是一些示例 SQL 查询&#xff0c;让我们逐一了解。 查询今天的数据…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...