std::basic_istream总结

文章目录

  • `std::basic_istream`总结
    • 概述
      • 常用类型定义
      • 全局对象
    • 核心成员函数
      • 1. 格式化输入
      • 2. 非格式化输入
      • 3. 流定位
      • 4. 其他功能
    • 继承的功能
      • 来自 `std::basic_ios`
        • 状态检查
        • 状态管理
      • 来自 `std::ios_base`
        • 格式化标志
        • 流打开模式
    • 特点说明
  • 例子
  • `std::basic_istream`全面用法演示
    • 1. 基础用法(格式化输入)
    • 2. 非格式化输入操作
    • 3. 流状态管理
    • 4. 定位操作
    • 5. 高级用法(sentry类)
    • 6. 综合示例(文件处理)

概述

std::basic_istream是 C++ 标准库中用于高级字符流输入操作的类模板,定义于 <istream>头文件中。它提供格式化和非格式化输入功能,构建在 basic_streambuf接口之上。

常用类型定义

类型定义
std::istreamstd::basic_istream<char>
std::wistreamstd::basic_istream<wchar_t>

全局对象

对象描述
cin标准 C 输入流 (stdin)
wcin宽字符标准输入流

核心成员函数

1. 格式化输入

  • ​**operator>>**: 提取格式化数据(如整数、字符串等)

2. 非格式化输入

函数描述
get提取字符
peek读取下一个字符但不提取
unget将字符放回输入流
putback将字符放回输入流
getline提取字符直到遇到指定分隔符
ignore提取并丢弃字符直到遇到指定字符
read提取字符块
readsome提取当前可用的字符块
gcount返回最后非格式化输入提取的字符数

3. 流定位

函数描述
tellg返回输入位置指示器
seekg设置输入位置指示器

4. 其他功能

  • ​**sync**: 与底层存储设备同步

  • ​**swap**​ (C++11): 交换流对象(除关联缓冲区外)

继承的功能

来自 std::basic_ios

状态检查
函数描述
good()检查是否无错误
eof()检查是否到达文件末尾
fail()检查是否发生错误
bad()检查是否发生不可恢复错误
operator!错误检查(fail()的同义词)
operator bool无错误检查(!fail()的同义词)
状态管理
  • rdstate(): 返回状态标志

  • setstate(): 设置状态标志

  • clear(): 修改状态标志

来自 std::ios_base

格式化标志
标志描述
dec十进制整数 I/O
oct八进制整数 I/O
hex十六进制整数 I/O
left左对齐输出
right右对齐输出
scientific科学计数法浮点输出
fixed固定点表示法浮点输出
boolalpha布尔值字母格式输入输出
流打开模式
模式描述
in打开用于读取
out打开用于写入
binary二进制模式打开
ate打开后立即定位到文件末尾
app每次写入前定位到文件末尾
trunc打开时清空内容

特点说明

  • 主要用于处理字符流的高级别输入操作

  • 同时支持格式化和非格式化输入

  • 通过虚继承从 std::basic_ios派生

  • 通常唯一非继承的数据成员是 gcount()的返回值

  • 提供 sentry 类用于输入操作前的准备工作

此总结涵盖了 std::basic_istream的主要功能和特性,适用于日常使用参考。

例子

std::basic_istream全面用法演示

我将全面展示 std::basic_istream的核心功能,包括格式化输入、非格式化输入、流状态管理、定位操作、自定义sentry类等高级用法。

1. 基础用法(格式化输入)

#include <iostream>
#include <sstream>
#include <iomanip>void basic_usage() {// 1. 基本格式化输入std::basic_istringstream<char> iss1("42 3.14 Hello");int i; double d; std::string s;iss1 >> i >> d >> s;std::cout << "Int: " << i << ", Double: " << d << ", String: " << s << "\n";// 2. 控制输入格式std::basic_istringstream<char> iss2("0x2A 0101");iss2 >> std::hex >> i;  // 十六进制输入std::cout << "Hex: " << i << "\n";iss2 >> std::oct >> i;  // 八进制输入std::cout << "Oct: " << i << "\n";// 3. 设置输入字段宽度std::basic_istringstream<char> iss3("123456");char buf[4];iss3 >> std::setw(4) >> buf;std::cout << "Width-limited: " << buf << "\n";
}

2. 非格式化输入操作

#include <iostream>
#include <sstream>void unformatted_input() {std::basic_istringstream<char> iss("ABCDEFGHIJ\n123456");// 1. get() 系列方法char c1, c2, c3;iss.get(c1).get(c2);std::cout << "Got: " << c1 << c2 << "\n";// 2. getline() 方法char line[10];iss.getline(line, sizeof(line));std::cout << "Line: " << line << "\n";// 3. read() 方法char buffer[5];iss.read(buffer, 4);buffer[4] = '\0';std::cout << "Read: " << buffer << "\n";// 4. peek() 和 putback()c3 = iss.peek();std::cout << "Peek: " << c3 << "\n";iss.putback('X');iss.get(c3);std::cout << "After putback: " << c3 << "\n";// 5. ignore() 方法iss.ignore(2, '5');  // 跳过2个字符或直到遇到'5'iss.get(c3);std::cout << "After ignore: " << c3 << "\n";// 6. gcount() 获取最后读取的字符数std::cout << "Last read count: " << iss.gcount() << "\n";
}

3. 流状态管理

#include <iostream>
#include <sstream>void stream_state() {std::basic_istringstream<char> iss("123 abc 456");// 1. 基本状态检查int val;iss >> val;if (iss.good()) {std::cout << "Good state: " << val << "\n";}// 2. 处理失败状态iss >> val;  // 尝试读取非数字if (iss.fail()) {std::cout << "Failed to read\n";iss.clear();  // 清除错误状态}// 3. 处理eof状态std::string str;while (iss >> str) {std::cout << "Read: " << str << "\n";}if (iss.eof()) {std::cout << "Reached EOF\n";}// 4. 综合状态检查iss.clear();iss.setstate(std::ios_base::badbit);if (iss.bad()) {std::cout << "Bad bit set\n";}
}

4. 定位操作

#include <iostream>
#include <sstream>void positioning() {std::basic_istringstream<char> iss("0123456789ABCDEF");// 1. tellg() 获取当前位置auto pos = iss.tellg();std::cout << "Start pos: " << pos << "\n";// 2. seekg() 绝对定位iss.seekg(5);char c;iss.get(c);std::cout << "Char at pos 5: " << c << "\n";// 3. seekg() 相对定位iss.seekg(2, std::ios_base::cur);iss.get(c);std::cout << "Char at pos+2: " << c << "\n";// 4. seekg() 从末尾定位iss.seekg(-3, std::ios_base::end);iss.get(c);std::cout << "Char 3 from end: " << c << "\n";// 5. 保存和恢复位置auto save_pos = iss.tellg();iss.seekg(0);iss.get(c);std::cout << "First char: " << c << "\n";iss.seekg(save_pos);iss.get(c);std::cout << "Restored char: " << c << "\n";
}

5. 高级用法(sentry类)

#include <iostream>
#include <sstream>void advanced_usage() {std::basic_istringstream<char> iss("   Hello World");// 1. 手动使用sentrystd::basic_istream<char>::sentry se(iss);if (se) {char c;iss.get(c);std::cout << "First non-whitespace: " << c << "\n";}// 2. 在自定义提取操作中使用sentrystruct Point { int x, y; };std::basic_istringstream<char> iss2("(10,20)");char dummy;Point p;iss2 >> dummy;  // 读取'('if (dummy != '(') iss2.setstate(std::ios_base::failbit);std::basic_istream<char>::sentry se2(iss2);if (se2) {iss2 >> p.x >> dummy >> p.y;if (dummy != ',') iss2.setstate(std::ios_base::failbit);}iss2 >> dummy;  // 读取')'if (dummy != ')') iss2.setstate(std::ios_base::failbit);if (iss2) {std::cout << "Point: (" << p.x << "," << p.y << ")\n";}
}

6. 综合示例(文件处理)

#include <iostream>
#include <fstream>
#include <vector>void file_processing() {// 1. 创建测试文件{std::basic_ofstream<char> ofs("test.txt");ofs << "10 20 30\n40 50 60\n70 80 90\n";}// 2. 读取文件内容std::basic_ifstream<char> ifs("test.txt");if (!ifs) {std::cout << "Failed to open file\n";return;}std::vector<int> values;int val;// 3. 读取直到EOFwhile (ifs >> val) {values.push_back(val);// 检查流状态if (ifs.bad()) {std::cout << "Critical error\n";break;}if (ifs.fail()) {ifs.clear();ifs.ignore(1);  // 跳过错误字符}}// 4. 输出结果std::cout << "Read values:";for (int v : values) {std::cout << " " << v;}std::cout << "\n";// 5. 重新定位并读取ifs.clear();ifs.seekg(0);std::string line;while (std::getline(ifs, line)) {std::cout << "Line: " << line << "\n";}
}int main() {basic_usage();unformatted_input();stream_state();positioning();advanced_usage();file_processing();return 0;
}

这个全面演示涵盖了:

  1. 所有主要的格式化输入操作

  2. 完整的非格式化输入方法

  3. 详细的流状态管理

  4. 全面的定位操作

  5. 高级sentry类用法

  6. 实际文件处理示例

每个示例都直接使用basic_istream及其相关组件,展示了从基础到高级的各种用法场景。

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

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

相关文章

人工智能——课程考核

课程考核包括平时测验&#xff08;75%&#xff09;和讨论&#xff08;25%&#xff09;两个环节&#xff0c;测验采用线上随堂考试&#xff08;2-3次&#xff0c;具体会在本课堂发布&#xff09;重点考核&#xff1a;A*算法、极大极小过程&#xff08;α-β剪枝&#xff09;、不…

机器学习-时序预测1

最近面试过程中&#xff0c;Predict-then-Optimize是运筹优化算法工程师未来的发展方向。就像我之前写过的运筹优化&#xff08;OR&#xff09;-在机器学习&#xff08;ML&#xff09;浪潮中何去何从&#xff1f;-CSDN博客&#xff0c;机器学习适合预测、运筹优化适合决策。我研…

vim-plugin AI插件

文章目录一、vim 插件管理vim-plug二、如何使用和配置 vim-plug第 1 步&#xff1a;安装 vim-plug第 2 步&#xff1a;配置你的 .vimrc / init.vim第 3 步&#xff1a;安装插件常用 vim-plug 命令三、配置vim-aivim-aivim-deepseekvim升级四、配置 AI 插件GitHub Copilot第 1 步…

Adobe Photoshop 2025 最新下载安装教程,附PS2025下载

点击获取&#xff1a;Adobe Photoshop 2025 安装教程&#xff1a; 1、安装包下载后&#xff0c;鼠标右键解压安装包 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 2、双击打开解压后的安装包文件夹 3、打开setup文件夹 添加图片注释&#xff0c;不超过…

LeetCode算法日记 - Day 27: 计算右侧小于当前元素的个数、翻转对

目录 1. 计算右侧小于当前元素的个数 1.1 题目解析 1.2 解法 1.3 代码实现 2. 翻转对 2.1 题目解析 2.2 解法 2.3 代码实现 1. 计算右侧小于当前元素的个数 315. 计算右侧小于当前元素的个数 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums &#xf…

基于SamOut的音频Token序列生成模型训练指南

通过PyTorch实现从音频特征到语义Token的端到端序列生成&#xff0c;适用于语音合成、游戏音效生成等场景。&#x1f9e0; 模型架构与核心组件 model SamOut(voc_sizevoc_size, # 词汇表大小&#xff08;4098目录名特殊Token&#xff09;hidden_sizehidden_size, …

AWD攻防总结

基本防守策略 1、改用户密码和服务密码 1&#xff09;改linux用户密码&#xff1a; #passwd 如果有权限就删除用户&#xff1a; #userdel -r [用户名] 2&#xff09;改mysql密码&#xff1a; #update mysql.user set passwordpassword(密码) where userroot; 删除匿名用户&…

Android14 基于Configfs的USB动态配置init.usb.configfs.rc

1 Android14 USB子系统启动以及动态切换的init.usb.rc 2 Android14 基于Configfs的USB动态配置init.usb.configfs.rc 3 Android14 高通平台的USB子系统启动和动态配置init.qcom.usb.rc 1. 什么是ConfigFS ConfigFS 是 Linux 内核提供的一种用户空间可配置的伪文件系统在Linu…

2025年KBS SCI1区TOP,矩阵差分进化算法+移动网络视觉覆盖无人机轨迹优化,深度解析+性能实测

目录1.摘要2.系统模型和问题表述3.矩阵差分进化算法4.结果展示5.参考文献6.算法辅导应用定制读者交流1.摘要 本文提出了一种面向无人机&#xff08;UAV&#xff09;新型轨迹优化方法&#xff0c;以实现对地面移动节点的高效视觉覆盖。与传统方法不同&#xff0c;该方法显式考虑…

Python OpenCV图像处理与深度学习:Python OpenCV图像几何变换入门

图像变换&#xff1a;掌握OpenCV中的几何变换 学习目标 通过本课程&#xff0c;学员们将能够理解图像的几何变换原理&#xff0c;包括缩放、旋转和平移&#xff0c;并能够使用Python和OpenCV库实现这些变换。本课程将通过理论讲解与实践操作相结合的方式&#xff0c;帮助学员们…

Redis Windows 7.0.5 安装教程(附exe/msi下载+环境配置+命令测试)

​第一步&#xff1a;下安装包​ 打开浏览器&#xff08;比如 Edge 或 Chrome&#xff09;&#xff0c;复制这个链接到地址栏敲回车&#xff1a; https://pan.quark.cn/s/31912e0d0443 进去后往下翻&#xff0c;找名字带 ​**redis-7.0.5​ 的文件&#xff0c;​选那个 .exe 结…

数据结构(单链表)

目录 1.链表的概念及结构 2.单链表的应用 2.1 打印链表 2.2申请新节点 2.3插入&#xff08;尾删和头删&#xff09; 2.4删除&#xff08;尾删和头删&#xff09; 2.5查找 2.6任意位置插入 2.7删除指定位置的元素 2.8 销毁链表 3.总结 1.链表的概念及结构 &#xff…

电脑没加域却能获取到IP地址

企业网络管理的核心逻辑&#xff01;电脑没加域却能获取到IP地址&#xff0c;这完全是一种刻意为之的安全设计&#xff0c;而不是网络故障。 简单来说就是&#xff1a;“给你IP&#xff0c;但不给你权限。” 这背后是一套完整的 网络准入控制&#xff08;NAC&#xff09; 策略。…

Go语言入门学习笔记

&#x1f4da; 前言 欢迎学习Go语言&#xff01;这份教材假设您是编程零基础&#xff0c;从最基本的概念开始讲解。Go语言&#xff08;也称为Golang&#xff09;由Google开发&#xff0c;简单、高效、并发能力强&#xff0c;适合后端开发、系统编程和云计算。 学习建议&#xf…

gradle安装、配置环境变量、配置阿里源及idea 中配置gradle

下载gradle https://services.gradle.org/distributions/ 配置系统环境变量 新增GRADLE_HOME D:\Information_Technology\App\gradle-8.14.3-bin\gradle-8.14.3 新增GRADLE_USER_HOME D:\Information_Technology\App\gradleHouse 设置 path&#xff0c;新增一行 %GRADLE_…

C# FlaUI win 自动化框架,介绍

一、简洁介绍 FlaUI 是一套基于 .NET 的 Windows 桌面应用自动化测试库&#xff0c;支持 Win32、WinForms、WPF、UWP 等多种类型的应用。它基于微软原生 UI Automation 库&#xff0c;提供了更现代、易用的 API&#xff0c;适合自动化测试工程师和开发者实现高效、可维护的 UI …

命名空间级别应用 Pod 安全标准

&#x1f3af; 命名空间级别应用 Pod 安全标准 一、创建 Kubernetes 集群&#xff08;使用 kind&#xff09; 使用 kind &#xff08;Kubernetes IN Docker&#xff09;快速创建一个本地集群&#xff1a; kind create cluster --name my-cluster验证集群是否运行正常&#xff1…

Ubuntu 25.10 Snapshot4 发布。

Ubuntu 25.10 的第四个快照&#xff08;Snapshot 4&#xff09;已于 2025 年 8 月 28 日发布&#xff0c;供开发者和测试人员进行验证。这是 Ubuntu 25.10 正式发布前的最后一个月度快照&#xff0c;标志着该版本已进入功能冻结阶段&#xff0c;预计将在 10 月发布正式版。 Ca…

STM32F2/F4系列单片机解密和芯片应用介绍

STM32F2/F4系列单片机解密和芯片应用介绍STM32F2和STM32F4系列微控制器凭借其出色的性能、丰富的外设接口和强大的连接能力&#xff0c;在很多对计算能力和实时性有要求的领域都有应用。同时&#xff0c;芯片解密的价格因其型号、加密技术等因素差异较大。&#x1f9ed; 重要提…

250901-BookStack跨服务器从Rootless-Docker到Rootful-Docker的备份迁移及服务启动

下面给你一套「可离线、最小停机」的迁移步骤&#xff0c;从 A&#xff08;rootless&#xff09;搬到 B&#xff08;rootful&#xff09;。思路是&#xff1a;停 A → 打包数据卷 → 传到 B → 还原 → 用同版本镜像启动 → 验证。整套操作不依赖公网&#xff0c;只用你已有的离…