C++ I/O 流通俗指南

1. std::ostream 是什么?

  • 定义std::ostream 是 C++ 标准库中的输出流类,负责将数据输出到各种目标(如屏幕、文件、网络等)。
  • 你可以把 std::ostream 想象成一根“数据水管”
    • 数据从 C++ 代码流进 std::ostream(比如 std::cout)。
    • std::ostream 负责把数据送到 终端、文件或者其他地方
  • “o” 表示 “output”(输出)
  • 特点
    • 不能单独使用,必须依赖一个流缓冲区std::streambuf)。
    • 常见的实例:std::cout(输出到控制台)。

比喻std::ostream 就像一根“数据水管”,数据从程序流进去,最终送到屏幕或文件。

示例

std::cout << "Hello, World!" << std::endl;  // 输出到屏幕

2. 为什么不能直接创建 std::ostream

std::ostream os;  // ❌ 错误!没有默认构造函数
  • 原因std::ostream 需要一个 std::streambuf 来管理数据缓冲,但它本身不提供默认缓冲区。
  • 解决办法:用现有的流(如 std::cout)或手动关联缓冲区。

正确用法

std::filebuf buff;
buff.open("a.txt", std::ios::out);
std::ostream os(&buff);  // 关联文件缓冲区
os << "Hello, File!" << std::endl;

3. C++ 中的“流”是什么?

  • 流(Stream):数据的抽象化处理方式,像水流一样从一端流向另一端。
    • 输入流std::istream):外部(如键盘、文件) → 程序。
    • 输出流std::ostream):程序 → 外部(如屏幕、文件)。

4. I/O 流家族一览

C++ 的 I/O 流类分布在几个头文件中:

头文件作用继承关系
<iostream>std::istream输入流(如 std::cin继承 std::ios
std::ostream输出流(如 std::cout继承 std::ios
std::iostream输入+输出流继承 std::istreamstd::ostream
<fstream>std::ifstream文件输入继承 std::istream
std::ofstream文件输出继承 std::ostream
std::fstream文件输入+输出继承 std::iostream
<sstream>std::istringstream从字符串解析数据继承 std::istream
std::ostringstream将数据写入字符串继承 std::ostream
std::stringstream字符串读+写继承 std::iostream

5. 常见用法与代码示例

5.1 标准输入输出(<iostream>

  • std::cout 输出
std::cout << "Hello, World!" << std::endl;  // 输出到屏幕
  • std::cin 输入
int x;
std::cout << "请输入一个数字: ";
std::cin >> x;
std::cout << "你输入的是: " << x << std::endl;
  • 读取整行
std::string name;
std::cout << "请输入全名: ";
std::getline(std::cin, name);  // 支持空格
std::cout << "你好, " << name << "!" << std::endl;
  • 错误和日志
std::cerr << "错误: 文件未找到!" << std::endl;  // 无缓冲,立即输出
std::clog << "日志: 程序启动..." << std::endl;  // 有缓冲

代码示例:

#include <iostream>
#include <fstream>int main() {std::filebuf buff;buff.open("a.txt", std::ios::out);std::ostream os(&buff);os << "aaa" << std::endl;os << "aaa" << std::endl;// 这里不需要显式关闭文件,析构时会自动关闭。// 但如果你希望在某个时刻显式关闭,可以调用 buff.close() 或 os.close()return 0;
}#include <iostream>
#include <fstream>
int main()
{{std::filebuf buff;buff.open("a.txt", std::ios::in);std::iostream os(&buff);std::string line;std::getline(os, line);std::cout << line << std::endl;}{   std::filebuf buff;buff.open("b.txt", std::ios::out);std::iostream is(&buff);is << "xxx" << 1.2 << std::endl;}return 0;
}
  • 无需显式关闭std::ostreamstd::filebuf 会在对象析构时自动处理文件关闭。
  • 显式关闭:如果你想要在某个特定时刻手动关闭文件,可以调用 buff.close()os.close()

不过,在多数情况下,依赖于析构时自动关闭文件是一个更简单且推荐的做法。

5.2 文件输入输出(<fstream>

  • 写入文件
std::ofstream file("test.txt");
if (file.is_open()) {file << "Hello, 文件!" << std::endl;file.close();  // 可选,析构时自动关闭
}
  • 读取文件
std::ifstream file("test.txt");
if (file.is_open()) {std::string line;while (std::getline(file, line)) {std::cout << line << std::endl;}file.close();
}
  • 读写结合
std::filebuf buff;
buff.open("a.txt", std::ios::out);
std::ostream os(&buff);
os << "Hello" << std::endl;

5.3 字符串流(<sstream>

  • 字符串转数值
std::string str = "42";
int num;
std::istringstream iss(str);
iss >> num;  // 解析为 42
std::cout << num << std::endl;
  • 数值转字符串
int num = 100;
std::ostringstream oss;
oss << "数值: " << num;
std::cout << oss.str() << std::endl;  // "数值: 100"
  • 读写混合
std::stringstream ss;
ss << "Hello " << 42;
std::string word;
while (ss >> word) {std::cout << word << std::endl;  // 输出 "Hello" 和 "42"
}

5.4 格式化输出(<iomanip>

double num = 1234.56789;
std::cout << std::fixed << std::setprecision(2) << num << std::endl;  // 1234.57
std::cout << std::setw(10) << std::setfill('*') << 42 << std::endl;   // *******42

6. 关键点总结

  • std::ostream:输出流的核心,用于将数据送到外部,依赖 std::streambuf
  • 流类型
    • <iostream>:标准输入输出(cincoutcerr)。
    • <fstream>:文件操作(ifstreamofstreamfstream)。
    • <sstream>:字符串处理(istringstreamostringstreamstringstream)。
  • 格式化:用 <iomanip> 控制输出样式。
  • 自动管理:流对象析构时会自动关闭文件,无需手动清理(但可以显式关闭)。

💡 C++ 的 I/O 流就像“水管系统”,统一了各种数据处理方式,既灵活又强大!

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

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

相关文章

Systemd 使用教程(二):Unit 的概念

目录 【二】 Systemd 单元&#xff08;Unit&#xff09;的概念 本教程将由浅入深的介绍 linux 中 Systemd 的知识和相关使用&#xff08;同时也方便自己后续查阅&#xff09; 【二】 Systemd 单元&#xff08;Unit&#xff09;的概念 虽然我想介绍的比较偏实际操作&#xff0…

树莓派PICO 设备烧录成cmsis dap

文章目录 1. 实际操作2. IO连接 1. 实际操作 2. IO连接

IntelliJ IDEA中Spring Boot 3.4.x+集成Redis 7.x:最新配置与实战指南

‌前言 Spring Boot 3.4.x作为当前‌最新稳定版本‌&#xff0c;全面支持Java 17与Jakarta EE 10规范。本文以‌Spring Boot 3.4.1‌和‌Redis 7.x‌为例&#xff0c;详解如何在IDEA中快速接入Redis&#xff0c;涵盖‌最新依赖配置‌、‌数据序列化优化‌、‌缓存注解‌及‌高…

VectorBT:使用PyTorch+Transformer训练和回测股票模型 进阶五

VectorBT&#xff1a;使用PyTorchTransformer训练和回测股票模型 进阶五 本方案基于PyTorch框架与Transformer模型&#xff0c;结合VectorBT回测引擎构建多股票量化交易系统&#xff0c;采用滑动窗口技术构建时序特征&#xff0c;通过自注意力机制捕捉市场规律预测收益率&#…

4.3-4.6学习总结 Java:Set系列集合+双列集合+Map

Set系列集合&#xff1a; 元素是唯一的。 HashSet&#xff1a; 哈希值&#xff1a; 如果没有重写hashcode方法和equals方法&#xff0c;那么哈希值是根据地址值计算的。 LinkedHashSet&#xff1a; TreeSet底层为红黑树。 红黑树&#xff1a;两个红色节点不能相连。 双列集合&…

unreal engine5开发仿鬼泣5的游戏,把敌人击飞到空中4连击

UE5系列文章目录 文章目录 UE5系列文章目录前言一、实现思路二、具体蓝图 前言 unreal engine5开发仿鬼泣5的游戏&#xff0c;把敌人击飞到空中4连击&#xff0c;先看下效果 一、实现思路 unreal engine5开发仿鬼泣5的游戏&#xff0c;把敌人击飞到空中4连击 在Unreal Engi…

功耗日志抓取需求

最近罗列了一些功耗分析需要的常见日志&#xff1a; 测试功耗前&#xff1a; adb shell dumpsys batterystats --reset adb shell dumpsys batterystats --enable full-wake-history 测试功耗后&#xff0c;使用脚本导出如下功耗日志&#xff1a; 脚本 chmod x collect_logs.s…

Java后端开发流程

Java后端开发流程 目录 开发流程概述具体实现步骤开发最佳实践项目结构示例代码示例常见问题与解决方案 开发流程概述 Java后端开发是一个系统化的过程&#xff0c;通常包括以下几个主要阶段&#xff1a; 1. 需求分析阶段 业务需求收集&#xff1a;与产品经理、业务方沟通…

Java项目之基于ssm的孩童收养信息管理(源码+文档)

项目简介 孩童收养信息管理实现了以下功能&#xff1a; 实现了用户在线选择试题并完成答题&#xff0c;在线查看考核分数。管理员管理字典管理、收养管理、收养信息更改记录管理、收养者配偶管理、送养管理、员工管理、管理员管理等功能。 &#x1f495;&#x1f495;作者&am…

查询条件与查询数据的ajax拼装

下面我将介绍如何使用 AJAX 动态拼装查询条件和获取查询数据&#xff0c;包括前端和后端的完整实现方案。 一、前端实现方案 1. 基础 HTML 结构 html 复制 <div class"query-container"><!-- 查询条件表单 --><form id"queryForm">…

【算法竞赛】状态压缩型背包问题经典应用(蓝桥杯2019A4分糖果)

在蓝桥杯中遇到的这道题&#xff0c;看上去比较普通&#xff0c;但其实蕴含了很巧妙的“状态压缩 背包”的思想&#xff0c;本文将从零到一&#xff0c;详细解析这个问题。 目录 一、题目 二、思路分析&#xff1a;状态压缩 最小覆盖 1. 本质&#xff1a;最小集合覆盖问题…

STL 性能优化实战:解决项目中标准模板库的性能瓶颈

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、全栈领域优质创作者、高级开发工程师、高级信息系统项目管理师、系统架构师&#xff0c;数学与应用数学专业&#xff0c;10年以上多种混合语言开发经验&#xff0c;从事DICOM医学影像开发领域多年&#xff0c;熟悉DICOM协议及…

大模型如何优化数字人的实时交互与情感表达

标题:大模型如何优化数字人的实时交互与情感表达 内容:1.摘要 随着人工智能技术的飞速发展&#xff0c;数字人在多个领域的应用愈发广泛&#xff0c;其实时交互与情感表达能力成为提升用户体验的关键因素。本文旨在探讨大模型如何优化数字人的实时交互与情感表达。通过分析大模…

qt designer 软件主题程序设计

对于使用Qt Designer设计的界面&#xff0c;主题切换的实现需要结合Qt的信号槽机制、样式表动态加载以及资源管理。以下是针对Qt Designer UI的详细解决方案&#xff1a; 一、UI文件与主题系统的整合架构 二、核心实现步骤 1. 动态样式表加载系统 // ThemeManager.h class …

一、STM32简介

一、实验器材介绍 二、STM32简介 1.STM32 名词解释 STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器。 ST&#xff0c;指ST公司&#xff08;意法半导体&#xff09;;M&#xff0c;MicroController 微控制器&#xff08;MCU,MicroController Unit 微控制器单元/单片机&…

JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解

JVM虚拟机篇&#xff08;一&#xff09;深入理解JVM&#xff1a;组成部分、运行流程及程序计数器详解 JVM虚拟机篇&#xff08;一&#xff09;深入理解JVM&#xff1a;组成部分、运行流程及程序计数器详解一、引言二、JVM的组成部分2.1 类加载子系统2.2 运行时数据区2.3 执行引…

elementui的默认样式修改

今天用element ui &#xff0c;做了个消息提示&#xff0c;发现提示的位置总是在上面&#xff0c;如图&#xff1a; 可是我想让提示的位置到下面来&#xff0c;该怎么办&#xff1f; 最后还是看了官方的api 原来有个自定义样式属性 customClass 设置下就好了 js代码 css代码 效…

游戏引擎学习第204天

回顾并为今天的内容做铺垫 好&#xff0c;现在开始这一集。今天我们将进行一些用户界面编程&#xff0c;觉得这是一个展示如何编写这类代码的好时机。很多人对如何做用户界面代码都很好奇&#xff0c;所以展示一下如何编写是非常有意义的。 我之所以在现在的这个地方做这些工…

我的世界1.20.1forge模组开发进阶教程——TerraBlender

TerraBlender介绍 从模组开发者的视角来看,TerraBlender为Minecraft生物群系类模组的开发提供了全方位的技术支持,显著降低了开发门槛并提升了模组的质量与扩展性: 跨平台兼容性架构支持Forge/Fabric/Quilt/NeoForge四大主流加载器,开发者无需为不同平台单独适配代码客户端…

借助mcpo在open-webui中使用mcp

open-webui前几天发布了0.6版本&#xff0c;我立即进行了升级。新版本中一个重要功能是通过mcpo方式支持了mcp server。本文将介绍mcpo是什么&#xff0c;以及如何在open-webui中使用它。同时&#xff0c;我也会分享几个在接入过程中遇到的问题及解决方案。 首先来介绍mcpo&…