# `std::basic_istream`總結

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;只用你已有的離…