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

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 流就像“水管系统”,统一了各种数据处理方式,既灵活又强大!

相关文章:

C++ I/O 流通俗指南

1. std::ostream 是什么&#xff1f; 定义&#xff1a;std::ostream 是 C 标准库中的输出流类&#xff0c;负责将数据输出到各种目标&#xff08;如屏幕、文件、网络等&#xff09;。你可以把 std::ostream 想象成一根“数据水管”&#xff1a; 数据从 C 代码流进 std::ostrea…...

基于python的电影数据分析及可视化系统

一、项目背景 随着电影行业的快速发展&#xff0c;电影数据日益丰富&#xff0c;如何有效地分析和可视化这些数据成为行业内的一个重要课题。本系统旨在利用Python编程语言&#xff0c;结合数据分析与可视化技术&#xff0c;为电影行业从业者、研究者及爱好者提供一个便捷的电…...

【NLP 面经 5】

难以承受的东西只会让我在下一次更平静的面对 —— 25.4.2 一、NER任务&#xff0c;CRF模型改进 命名实体识别&#xff08;NER&#xff09;任务中&#xff0c;你使用基于条件随机场&#xff08;CRF&#xff09;的模型&#xff0c;然而模型在识别嵌套实体和重叠实体时效果不佳&a…...

鸿蒙NEXT小游戏开发:猜小球

1. 引言 “猜小球”是一个经典的益智游戏&#xff0c;通常由一名表演者和多名参与者共同完成。表演者会将一个小球放在一个杯子下面&#xff0c;然后将三个杯子快速地交换位置&#xff0c;参与者则需要猜出最终哪个杯子下面有小球。本文将介绍如何使用HarmonyOS NEXT技术&…...

[NCTF2019]Fake XML cookbook [XXE注入]

题目源代码 function doLogin(){var username $("#username").val();var password $("#password").val();if(username "" || password ""){alert("Please enter the username and password!");return;}var data "…...

Android 防抖和节流

文章目录 Android 防抖和节流概述工具类使用源码下载 Android 防抖和节流 概述 防抖&#xff08;Debounce&#xff09;&#xff1a; 防抖是指在事件被触发后&#xff0c;等待一段时间&#xff0c;如果在这段时间内没有再触发事件&#xff0c;才执行处理函数。如果在这段时间内…...

安徽京准:NTP时间同步服务器操作使用说明

安徽京准&#xff1a;NTP时间同步服务器操作使用说明 3.1 连接天线 天线连接到“ANT”口。 3.2 连接电源 将220V电源线连到AC220V座上或将电源适配器&#xff08;7.5V~12V&#xff09;接到DC口上。也可以同时接上&#xff0c;提高供电可靠性。 3.3 LAN网口 网线连接到NTP…...

【学习记录】pytorch载入模型的部分参数

需要从PointNet网络框架中提取encoder部分的参数&#xff0c;然后赋予自己的模型。因此&#xff0c;需要从一个已有的.pth文件读取部分参数&#xff0c;加载到自定义模型上面。做了一些尝试&#xff0c;记录如下。 关于模型保存与载入 torch.save(): 使用Python的pickle实用程…...

Ubuntu Wayland启动腾讯会议并实现原生屏幕共享

Intro 众所周知&#xff0c;长期以来&#xff0c;由于腾讯会议项目组的尸位素餐、极度不作为&#xff0c;在Wayland成为Ubuntu 24.04 LTS的默认窗口环境下&#xff0c;仍然选择摆烂&#xff0c;甚至还“贴心”地在启动脚本下增加检测Wayland退出的代码&#xff1b;并且即使使用…...

写Prompt的技巧和基本原则

一.基本原则 1.一定要描述清晰你需要大模型做的事情&#xff0c;不要模棱两可 2.告诉大模型需要它做什么&#xff0c;不需要做什么 改写前: 请帮我推荐一些电影 改写后: 请帮我推荐2025年新出的10部评分比较高的喜剧电影&#xff0c;不要问我个人喜好等其他问题&#xff…...

前端Material-UI面试题及参考答案

目录 Material-UI 的设计理念与 Material Design 规范的关系是什么? 如何通过 npm/yarn/pnpm 安装 Material-UI 的核心依赖? Material-UI 的默认主题系统如何实现全局样式管理? 如何在项目中配置自定义字体和颜色方案? 什么是 emotion 和 styled-components,它们在 Ma…...

29、web前端开发之CSS3(六)

13. 多列布局&#xff08;Multi-column Layout&#xff09; 多列布局&#xff08;Multi-column Layout&#xff09;是一种通过CSS实现的布局方式&#xff0c;允许将内容组织成多列&#xff0c;类似于报纸或杂志的排版方式。这种布局方法能够有效地利用页面空间&#xff0c;提升…...

Go 语言语法精讲:从 Java 开发者的视角全面掌握

《Go 语言语法精讲&#xff1a;从 Java 开发者的视角全面掌握》 一、引言1.1 为什么选择 Go&#xff1f;1.2 适合 Java 开发者的原因1.3 本文目标 二、Go 语言环境搭建2.1 安装 Go2.2 推荐 IDE2.3 第一个 Go 程序 三、Go 语言基础语法3.1 变量与常量3.1.1 声明变量3.1.2 常量定…...

MySQL 复制与主从架构(Master-Slave)

MySQL 复制与主从架构&#xff08;Master-Slave&#xff09; MySQL 复制与主从架构是数据库高可用和负载均衡的重要手段。通过复制数据到多个从服务器&#xff0c;既可以实现数据冗余备份&#xff0c;又能分担查询压力&#xff0c;提升系统整体性能与容错能力。本文将详细介绍…...

水下成像机理分析

一般情况下, 水下环境泛指浸入到人工水体 (如水库、人工湖等)或自然水体(如海洋、河流、湖 泊、含水层等)中的区域。在水下环境中所拍摄 的图像由于普遍受到光照、波长、水中悬浮颗粒物 等因素的影响&#xff0c;导致生成的水下图像出现模糊、退 化、偏色等现象&#xff0c;图像…...

腾讯云智测试开发面经

1、投递时间线 2.20投递简历,3.11第一轮面试,3.30第二轮面试,4.4第三轮面试,4.10第四轮面试,4.11offer意向书 2、第一轮面试 第一轮面试技术面,面试官是导师,面试时长40多分钟 1)自我介绍 2)数组和列表的区别 3)了解哪些数据库 4)进程和线程的区别 5)了解哪…...

JVM类加载器详解

文章目录 1.类与类加载器2.类加载器加载规则3.JVM 中内置的三个重要类加载器为什么 获取到 ClassLoader 为null就是 BootstrapClassLoader 加载的呢&#xff1f; 4.自定义类加载器什么时候需要自定义类加载器代码示例 5.双亲委派模式类与类加载器双亲委派模型双亲委派模型的执行…...

@ComponentScan注解详解:Spring组件扫描的核心机制

ComponentScan注解详解&#xff1a;Spring组件扫描的核心机制 一、ComponentScan注解概述 ComponentScan是Spring框架中的一个核心注解&#xff0c;用于自动扫描和注册指定包及其子包下的Spring组件。它是Spring实现依赖注入和自动装配的基础机制之一。 Retention(Retention…...

rust Send Sync 以及对象安全和对象不安全

开头&#xff1a;菜鸟小明的疑惑 小明&#xff1a; “李哥&#xff0c;我最近学 Rust&#xff0c;感觉它超级严谨&#xff0c;啥 Send、Sync、对象安全、静态分发、动态分发的&#xff0c;我都搞晕了&#xff01;为啥 Rust 要设计得这么复杂啊&#xff1f;” 小李&#xff0…...

从一到无穷大 #44:AWS Glue: Data integration + Catalog

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言Glue的历史&#xff0c;设计原则与挑战Serverless ETL 功能设计Glue StudioGlue …...

【Redis】如何处理缓存穿透、击穿、雪崩

Redis 缓存穿透、击穿和雪崩是高并发场景下的典型问题&#xff0c;以下是详细解决方案和最佳实践&#xff1a; 一、缓存穿透&#xff08;Cache Penetration&#xff09; 问题&#xff1a;恶意请求不存在的数据&#xff08;如不存在的ID&#xff09;&#xff0c;绕过缓存直接访…...

区块链技术如何重塑金融衍生品市场?

区块链技术如何重塑金融衍生品市场&#xff1f; 金融衍生品市场一直是全球金融体系的重要组成部分&#xff0c;其复杂性和风险性让许多投资者望而却步。然而&#xff0c;随着区块链技术的兴起&#xff0c;这一领域正在经历一场深刻的变革。区块链以其去中心化、透明和不可篡改…...

实战打靶集锦-35-GitRoot

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查5. 系统提权6. 写在最后 靶机地址&#xff1a;https://download.vulnhub.com/gitroot/GitRoot.ova 1. 主机发现 目前只知道目标靶机在192.168.56.xx网段&#xff0c;通过如下的命令&#xff0c;看看这个网段上在线的主机…...

Vue3 + Element Plus + AntV X6 实现拖拽树组件

Vue3 Element Plus AntV X6 实现拖拽树组件 介绍 在本篇文章中&#xff0c;我们将介绍如何使用 Vue 3 和 Element Plus 结合 antv/x6 实现树形结构的拖拽功能。用户可以将树节点拖拽到图形区域&#xff0c;自动创建相应的节点。我们将会通过简单的示例来一步步讲解实现过程…...

从零开始跑通3DGS教程:介绍

写在前面 本文内容 本文所属《从零开始跑通3DGS教程》系列文章&#xff0c;将实现从原始图像(有序、无序)数据开始&#xff0c;经过处理(视频抽帧成有序)&#xff0c;SFM&#xff0c;3DGS训练、编辑、渲染等步骤&#xff0c;完整地呈现从原始图像到新视角合成的全部流程&#x…...

聊聊Spring AI的Chat Model

序 本文主要研究一下Spring AI的Chat Model Model spring-ai-core/src/main/java/org/springframework/ai/model/Model.java public interface Model<TReq extends ModelRequest<?>, TRes extends ModelResponse<?>> {/*** Executes a method call to …...

将mysql配置成服务的方法

第一步&#xff1a;配置环境变量 1)新建MYSQL_HOME变量&#xff0c;并配置:C:\Program Files\MySQL\MySQL Server 5.6 MYSQL_HOME&#xff1a;C:\Program Files\MySQL\MySQL Server 5.6 2)编辑path系统变量&#xff0c;将%MYSQL_HOME%\bin添加到path变量后。配置path环境变量…...

GaussDB(for PostgreSQL) 存储引擎:ASTORE 与 USTORE 详细对比

GaussDB(for PostgreSQL) 存储引擎&#xff1a;ASTORE 与 USTORE 详细对比 1. 背景说明 GaussDB(for PostgreSQL) 是华为基于 PostgreSQL 开发的企业级分布式数据库&#xff0c;其存储引擎分为 ASTORE 和 USTORE 两种类型&#xff0c;分别针对不同场景优化。 2. 核心对比 (1)…...

英语口语 -- 常用 1368 词汇

英语口语 -- 常用 1368 词汇 介绍常用单词List1 &#xff08;96 个&#xff09;时间类气候类自然类植物类动物类昆虫类其他生物地点类 List2 &#xff08;95 个&#xff09;机构类声音类食品类餐饮类蔬菜类水果类食材类饮料类营养类疾病类房屋类家具类服装类首饰类化妆品类 Lis…...

SpringBoot+Vue 中 WebSocket 的使用

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议&#xff0c;它使得客户端和服务器之间可以进行实时数据传输&#xff0c;打破了传统 HTTP 协议请求 - 响应模式的限制。 下面我会展示在 SpringBoot Vue 中&#xff0c;使用WebSocket进行前后端通信。 后端 1、引入 j…...