C++ 中的 iostream 库:cin/cout 基本用法

iostream 是 C++ 标准库中用于输入输出操作的核心库,它基于面向对象的设计,提供了比 C 语言的 stdio.h 更强大、更安全的 I/O 功能。下面详细介绍 iostream 库中最常用的输入输出工具:cincout

一、 基本概念

  • iostream:包含在 <iostream> 头文件中,提供标准输入输出流。
  • 标准流对象
    • cin:标准输入流(通常对应键盘)。
    • cout:标准输出流(通常对应控制台)。
    • cerr:标准错误流(无缓冲,直接输出)。
    • clog:标准日志流(有缓冲)。

二、 cout 的基本用法

输出基本数据类型
#include <iostream>int main() {int num = 42;double pi = 3.14159;char letter = 'A';std::string name = "Alice";  // 需要包含 <string> 头文件// 输出变量std::cout << "整数: " << num << std::endl;std::cout << "浮点数: " << pi << std::endl;std::cout << "字符: " << letter << std::endl;std::cout << "字符串: " << name << std::endl;// 输出表达式std::cout << "1 + 2 = " << (1 + 2) << std::endl;return 0;
}

输出结果

整数: 42
浮点数: 3.14159
字符: A
字符串: Alice
1 + 2 = 3
格式化输出

使用 std::endl'\n' 换行:

std::cout << "第一行" << std::endl;
std::cout << "第二行\n";  // '\n' 更高效,不强制刷新缓冲区

使用 std::setw()std::setfill() 控制宽度和填充字符(需包含 <iomanip>):

#include <iomanip>std::cout << std::setw(10) << std::setfill('*') << "Hello" << std::endl;
// 输出:*****Hello

三、 cin 的基本用法

输入基本数据类型
#include <iostream>int main() {int age;double salary;std::string name;std::cout << "请输入姓名: ";std::cin >> name;  // 读取一个单词(空格分隔)std::cout << "请输入年龄: ";std::cin >> age;std::cout << "请输入薪水: ";std::cin >> salary;std::cout << "姓名: " << name << ", 年龄: " << age << ", 薪水: " << salary << std::endl;return 0;
}

输入示例

请输入姓名: Alice
请输入年龄: 25
请输入薪水: 5000.5
姓名: Alice, 年龄: 25, 薪水: 5000.5
输入多行字符串

cin >> 遇到空格会停止读取,若要读取整行,使用 std::getline()

#include <iostream>
#include <string>int main() {std::string fullName;std::cout << "请输入全名: ";std::getline(std::cin, fullName);  // 读取整行(包括空格)std::cout << "你好, " << fullName << std::endl;return 0;
}

四、 输入输出重定向

可以将 cincout 重定向到文件:

#include <iostream>
#include <fstream>int main() {// 输出重定向到文件std::ofstream outFile("output.txt");std::streambuf* coutBuf = std::cout.rdbuf();std::cout.rdbuf(outFile.rdbuf());std::cout << "这句话会写入文件" << std::endl;// 恢复标准输出std::cout.rdbuf(coutBuf);std::cout << "这句话会显示在控制台" << std::endl;return 0;
}

五、 常见问题与解决方案

1. cin 缓冲区残留问题

若先使用 cin >> 读取数值,再用 getline() 读取字符串,可能导致 getline() 读取到残留的换行符。
解决方案

int num;
std::string line;std::cin >> num;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');  // 清除缓冲区
std::getline(std::cin, line);  // 正常读取
2. 输入验证

检查输入是否合法:

int num;
std::cout << "请输入整数: ";
if (!(std::cin >> num)) {std::cout << "输入无效,请输入整数!" << std::endl;std::cin.clear();  // 清除错误标志std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');  // 清除缓冲区
}

六、 进阶用法

格式化输出(精度控制)
#include <iomanip>double pi = 3.14159265358979;
std::cout << std::fixed << std::setprecision(4) << pi << std::endl;  // 输出 3.1416
自定义类型的 I/O

重载 <<>> 运算符:

class Point {
private:int x, y;
public:// 重载 << 运算符friend std::ostream& operator<<(std::ostream& os, const Point& p) {os << "(" << p.x << ", " << p.y << ")";return os;}// 重载 >> 运算符friend std::istream& operator>>(std::istream& is, Point& p) {is >> p.x >> p.y;return is;}
};// 使用示例
Point p;
std::cin >> p;  // 输入: 3 4
std::cout << p;  // 输出: (3, 4)

七、总结

  • cout:用 << 输出数据,支持链式调用(如 cout << a << b)。
  • cin:用 >> 读取数据,默认以空格分隔,可用 getline() 读取整行。
  • 格式化:通过 <iomanip> 控制输出宽度、精度、填充字符等。
  • 注意事项:处理输入缓冲区残留、输入验证和自定义类型的 I/O 重载。

通过这些基本操作,可以实现大多数控制台程序的输入输出功能。

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

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

相关文章

SAP复制一个自定义移动类型

SAP复制移动类型 在SAP系统中&#xff0c;复制移动类型201可以通过事务码OMJJ或SPRO路径完成&#xff0c;用于创建自定义的移动类型以满足特定业务需求。 示例操作步骤 进入OMJJ事务码&#xff1a; 打开事务码OMJJ&#xff0c;选择“移动类型”选项。 复制移动类型&#xff…

Bambu Studio 中的“回抽“与“装填回抽“的区别

回抽 装填回抽: Bambu Studio 中的“回抽” (Retraction) 和“装填回抽”(Prime/Retract) 是两个不同的概念&#xff0c;它们都与材料挤出机的操作过程相关&#xff0c;但作用和触发条件有所不同。 回抽(Retraction): 回抽的作用, 在打印机移动到另一个位置之前&#xff0c;将…

危化品安全监测数据分析挖掘范式:从被动响应到战略引擎的升维之路

在危化品生产的复杂生态系统中,安全不仅仅是合规性要求,更是企业生存和发展的生命线。传统危化品安全生产风险监测预警系统虽然提供了基础保障,但其“事后响应”和“单点预警”的局限性日益凸显。我们正处在一个由大数据、人工智能、数字孪生和物联网技术驱动的范式变革前沿…

C++ RPC 远程过程调用详细解析

一、RPC 基本原理 RPC (Remote Procedure Call) 是一种允许程序调用另一台计算机上子程序的协议,而不需要程序员显式编码这个远程交互细节。其核心思想是使远程调用看起来像本地调用一样。 RPC 工作流程 客户端调用:客户端调用本地存根(stub)方法参数序列化:客户端存根将参…

Python:操作 Excel 预设色

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…

中科院1区|IF10+:加大医学系团队利用GPT-4+电子病历分析,革新肝硬化并发症队列识别

中科院1区|IF10&#xff1a;加大医学系团队利用GPT-4电子病历分析&#xff0c;革新肝硬化并发症队列识别 在当下的科研领域&#xff0c;人工智能尤其是大语言模型的迅猛发展&#xff0c;正为各个学科带来前所未有的机遇与变革。在医学范畴&#xff0c;从疾病的早期精准筛查&am…

Python学习小结

bg&#xff1a;记录一下&#xff0c;怕忘了&#xff1b;先写一点&#xff0c;后面再补充。 1、没有方法重载 2、字段都是公共字段 3、都是类似C#中顶级语句的写法 4、对类的定义直接&#xff1a; class Student: 创建对象不需要new关键字&#xff0c;直接stu Student() 5、方…

QCustomPlot 中实现拖动区域放大‌与恢复

1、拖动区域放大‌ 在 QCustomPlot 中实现 ‌拖动区域放大‌&#xff08;即通过鼠标左键拖动绘制矩形框选区域进行放大&#xff09;的核心方法是设置 SelectionRectMode。具体操作步骤&#xff1a; 1‌&#xff09;禁用拖动模式‌ 确保先关闭默认的图表拖动功能&#xff08;否…

如何将文件从 iPhone 传输到闪存驱动器

您想将文件从 iPhone 或 iPad 传输到闪存盘进行备份吗&#xff1f;这是一个很好的决定&#xff0c;但您需要先了解一些实用的方法。虽然 Apple 生态系统在很大程度上是封闭的&#xff0c;但您可以使用一些实用工具将文件从 iPhone 或 iPad 传输到闪存盘。下文提供了这些行之有效…

互联网大厂Java求职面试:云原生架构与微服务设计中的复杂挑战

互联网大厂Java求职面试&#xff1a;云原生架构与微服务设计中的复杂挑战 面试官开场白 面试官&#xff08;严肃模式开启&#xff09;&#xff1a;郑薪苦&#xff0c;欢迎来到我们的技术面试环节。我是本次面试的技术总监&#xff0c;接下来我们将围绕云原生架构、微服务设计、…

leetcode-hot-100 (链表)

1. 相交链表 题目链接&#xff1a;相交链表 题目描述&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 解答&#xff1a; 其实这道题目我一开始没太看懂题目给…

Web前端基础之HTML

一、浏览器 火狐浏览器、谷歌浏览器(推荐)、IE浏览器 推荐谷歌浏览器原因&#xff1a; 1、简洁大方,打开速度快 2、开发者调试工具&#xff08;右键空白处->检查&#xff0c;打开调试模式&#xff09; 二、开发工具 核心IDE工具 Visual Studio Code (VS Code)‌ 微软开发…

11.TCP三次握手

TCP连接建立与传输 1&#xff0e;主机 A 与主机 B 使用 TCP 传输数据&#xff0c;A 是 TCP 客户&#xff0c;B 是 TCP 服务器。假设有512B 的数据要传输给 B&#xff0c;B 仅给 A 发送确认&#xff1b;A 的发送窗口 swnd 的尺寸为 100B&#xff0c;而 TCP 数据报文段每次也携带…

Python 爬虫入门 Day 3 - 实现爬虫多页抓取与翻页逻辑

Python 第二阶段 - 爬虫入门 &#x1f3af; 今日目标 掌握网页分页的原理和定位“下一页”的链接能编写循环逻辑自动翻页抓取内容将多页抓取整合到爬虫系统中 &#x1f4d8; 学习内容详解 &#x1f501; 网页分页逻辑介绍 以 quotes.toscrape.com 为例&#xff1a; 首页链…

分布式定时任务系列12:XXL-job的任务触发为什么是死循环?

传送门 分布式定时任务系列1&#xff1a;XXL-job安装 分布式定时任务系列2&#xff1a;XXL-job使用 分布式定时任务系列3&#xff1a;任务执行引擎设计 分布式定时任务系列4&#xff1a;任务执行引擎设计续 分布式定时任务系列5&#xff1a;XXL-job中blockingQueue的应用 …

位运算详解之异或运算的奇妙操作

位运算详解之异或运算的奇妙操作 一、异或运算的本质与核心性质1.1 异或运算的定义与逻辑规则1.2 异或运算的核心代数性质&#xff08;1&#xff09;自反性&#xff1a;a ^ a 0&#xff08;2&#xff09;恒等性&#xff1a;a ^ 0 a&#xff08;3&#xff09;交换律&#xff1…

Element Plus 去除下拉菜单周黑边

问题&#xff1a; 如上图所示&#xff0c;当鼠标移入&#xff08;hover&#xff09;和点击时就会围绕一圈黑色边框&#xff0c;但通过本文的方案 100% 完美解决。 解决方案: :deep(:focus-visible) {outline: none; } 备用方案 :deep(.el-tooltip__trigger:focus-visible) …

React Native 项目实战 —— 记账本应用开发指南

React Native 项目实战 —— 记账本应用开发指南 项目概述&#xff1a;本文将指导您使用 React Native 开发一个简单的记账本应用&#xff0c;帮助用户记录收入和支出。核心内容&#xff1a;我们将分析功能模块、设计接口、划分组件结构、管理数据流、实现页面跳转&#xff0c…

从 PPO、DPO 到 GRPO:大语言模型策略优化算法解析

从 PPO、DPO 到 GRPO&#xff1a;大语言模型策略优化算法解析 背景与简介 大语言模型&#xff08;LLM&#xff09;的训练通常分为预训练和后训练两个阶段。预训练阶段&#xff0c;模型在海量文本上学习下一词预测的能力&#xff1b;后训练阶段&#xff0c;我们希望进一步对齐…

React中使用Day.js指南

文章目录 引言什么是Day.js&#xff1f;Day.js的核心特性 安装和基础配置安装Day.js基础导入和使用 在React中的基础使用1. 显示格式化日期2. 实时时钟组件 常用插件配置1. 相对时间插件2. 高级格式化插件3. 时区处理插件 实战案例&#xff1a;博客文章时间组件高级应用场景1. …