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.pswp.cn/diannao/76908.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76908.shtml
英文地址,請注明出處:http://en.pswp.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&…