對流對象的理解

在c++里,“流”可以理解為數據傳輸與操作的“介質”。

從輸入輸出角度來看,有輸入流(比如cin)和輸出流(cout)。對于輸入流,數據通過它從外部設備(例如鍵盤)“流入”程序內部;對于輸出流,程序內部的數據通過它“流向”外部設備(例如顯示器)。也就是說,我們可以將“流”理解為數據的“介質”或者“載體”。

還有例如fstream相關的文件流。它能讓程序與文件之間進行數據的讀寫,數據在程序與文件之間的流動,就是借助于流對象這個載體。而且流具有狀態。

輸入流與輸出流,實際上是兩個類istream和ostream。這兩個類具有自己的成員函數。既然如此,我們要進行輸入輸出的時候,就不一定非得用cin與cout了,我們可以自定義istream和ostream對象,比如定義一個istream對象叫input,定義一個ostream對象叫output,那么input>>和cin>>,output<<和cout<<的效果是一樣的。只不過,cin和cout已經和標準的輸入輸出設備(鍵盤和顯示器)關聯好了。

再來說文件流。當我們想要向計算機中的文件寫入內容(或者導出其中的內容),我們就不能僅僅定義一個普通的輸入流對象,因為我們的重點是要向文件內部寫入數據,而不是向程序寫入數據。但是,這本質上還是在解決輸入輸出的問題,只不過解決的是針對計算機內部的文件進行輸入或輸出的問題。

在C++中使用文件流,需要包含fstream頭文件,它包含ifstream(用于從文件中讀取數據)與ofstream(用于向文件寫入數據)和fstream(既能讀又能寫)這幾個類。

比如要向文件中寫入數據,使用ofstream類,示例如下:

#include <iostream>
#include <fstream>
using namespace std;int main() 
{ofstream outFile("example.txt");//構造函數,將文件與程序連接起來if (outFile.is_open()) //成員函數,用來判斷文件是否打開{outFile << "這是要寫入文件的內容" << endl;outFile.close();//成員函數,用來關閉文件} else {cout << "無法打開文件" << endl;}return 0;
}

從文件讀取數據則使用ifstream類,示例如下:
?

#include <iostream>
#include <fstream>
#include <string>
using namespace std;int main() {ifstream inFile("example.txt");if (inFile.is_open()) {string line;while (getline(inFile, line)) {cout << line << endl;}inFile.close();} else {cout << "無法打開文件" << endl;}return 0;
}

這里我們剖析一下getline().getline()的功能是逐行讀取文件中的內容,將其讀入字符串line中。為什么要使用while循環?是因為字符串只能在一個維度延伸,所以只能讀取一行。所以每讀入一行,就要輸出line的內容。但是這樣的話,每次進入while循環中,不應該先清空line中的內容嗎?

事實上,每次getline函數執行時,會直接覆蓋line原有的內容。比如第一次getline把第一行內容讀入line,下一次getline執行時,就直接把第一行的內容覆蓋掉了。就好比數組中將某個區間內的元素往后移動,直接覆蓋。此外,getline函數每次調用時會從指定的流對象(這里是inFile)中讀取一行數據到string類型的變量(這里是line)中,并且會自動忽略換行符。當到達文件末尾時,getline函數會返回false.而且,getline還可以指定分隔符:getline(istream&is,string&str,char ch);這個重載版本會讀到指定的分隔符ch為止,而不是默認的換行符。

再提問:getline(istream&is,string& str)與getline(ifstream&is,string& str)有區別嗎?

實際上,ifstream是從istream派生而來的。這意味著所有ifstream對象都可以當作istream對象來使用。所以是沒有區別的。如果是普通的istream對象,我們就可以在控制臺中輸入內容,然后我們輸入的內容就會被寫入我們指定的字符串當中。如果是ifstream對象,我們就可以將文件中的內容提取出來到指定的字符串中。前者是“寫+讀”,后者是“讀”。這么設計的好處是,getline函數不僅能從文件中讀取數據,還能從標準輸入讀取數據,將控制臺輸入的內容讀入字符串。這種多態性使得代碼更加靈活和可復用。雖然cin更多涉及用戶輸入(寫+讀),ifstream側重從文件讀,但本質上都是從輸入流中獲取數據。統一使用istream&參數,getline函數可以無縫適配不同類型的輸入源。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76888.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76888.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76888.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Visium HD多樣本拼片拆分

Visium HD實驗的時候一個捕獲區域內可以包含多個樣本拼片&#xff08;例如多個組織切片或不同樣本的排列&#xff09;是常見的實驗設計&#xff0c;多樣本拼片能夠提升實驗效率&#xff0c;單張玻片處理多個樣本&#xff0c;降低試劑和測序成本&#xff0c;后續分析的時候只需要…

進程(Process)詳解

進程&#xff08;Process&#xff09;詳解 一、基本定義 ?概念? 進程是計算機中程序的一次動態執行實例&#xff0c;包含程序代碼、數據及運行狀態&#xff0c;是操作系統進行資源分配和調度的基本單位?。與靜態的“程序”不同&#xff0c;進程是動態實體&#xff0c;隨程…

畢業論文超清pdf帶標簽導出

Word直接導出的pdf不夠清晰&#xff0c;使用打印導出的pdf又不帶書簽以及目錄跳轉功能這一問題&#xff0c;查閱網上資料使用Adobe DC似乎能夠解決但是下載安裝比較麻煩&#xff0c;于是寫了python程序解決該問題。 解決思路&#xff1a; 使用python腳本對兩個pdf文件進行合并…

NOIP2012提高組.同余方程

目錄 題目算法標簽: 數論, 擴展歐幾里得算法思路代碼 題目 203. 同余方程 算法標簽: 數論, 擴展歐幾里得算法 思路 簡單的擴展歐幾里得算法應用題, 擴展歐幾里得算法可以直接計算同余方程的通解, 因為求得是最小正整數解, 因此需要取模轉換為正整數 a x b y ≡ 1 ax by …

C++學習-入門到精通-【0】計算機和C++簡介

C學習-入門到精通-[0]計算機和C簡介 計算機和C簡介 C學習-入門到精通-[0]計算機和C簡介一、計算機的組成二、硬件和軟件三、數據的層次結構四、機器語言、匯編語言和高級語言五、C標準庫六、面向對象技術 一、計算機的組成 計算機是由多個不同功能的邏輯單元組成的&#xff1a…

macOS 系統設置息屏情況下,PHP等后臺腳本繼續執行

在 macOS 系統下&#xff0c;當屏幕息屏或合上蓋子時&#xff0c;后臺腳本程序是否會繼續運行&#xff0c;主要取決于以下幾個因素&#xff1a; 1. 系統睡眠狀態的影響 默認情況&#xff1a;合蓋/息屏后&#xff0c;Mac 會進入「睡眠模式」&#xff08;部分硬件休眠&#xff…

SpringBoot集成ActiveMQ異常處理機制:若未捕獲異常,消息會被重新投遞

一、問題描述 SpringBoot項目集成AvtiveMQ&#xff0c;作為消息消費者。如果在消費消息的方法中&#xff0c;拋出異常&#xff0c;會產生什么效果&#xff1f; 二、ActiveMQ異常處理機制&#xff08;AI問答僅供參考&#xff09; 在Spring Boot項目集成ActiveMQ作為消息消費者…

【Java學習筆記】random的使用

random使用方法 使用說明&#xff1a;返回的是(0<n<1)這個范圍中的任意帶正號的double值 代碼實例 public class helloworld{public static void main(String[] args){System.out.println(Math.random());} }生成0-100中的任意數代碼示例 public class Main {public …

(三)垂直分庫架構、分布式數據庫

文章目錄 垂直分庫架構/分布式數據庫什么是垂直分庫架構架構模型優缺點優點缺點 技術案例分布式數據庫架構模型優缺點優點缺點 技術案例 垂直分庫架構/分布式數據庫 什么是垂直分庫架構 根據業務的模塊劃分&#xff0c; 將不同業務的數據放到不同的數據庫中。 比如一個電子商城…

數據結構線性表的順序存儲結構

線性表是由零個或多個數據元素組成的有序序列。 特點&#xff1a; 數據元素間是有順序的&#xff1b; 數據元素的個數是有限的&#xff1b; 一般來說&#xff0c;數據元素的類型是相同的&#xff08;強類型語言&#xff09;。c/c是強類型語言&#xff0c;必須指定數據類型。…

扣子空間試用:生成五一騎行規劃+notion文章編寫

今天試用了一下扣子空間&#xff0c;正好五一快到了&#xff0c;讓它幫忙做了五一騎行規劃&#xff0c;效果不賴&#xff01; 生成五一騎行規劃 點擊前往網站查看效果 prompt 如下&#xff1a; 幫我做一個五一上海騎行規劃 要求&#xff1a; - 風景優美 - 人少 - 100km總路程…

最新得物小程序sign簽名加密,請求參數解密,響應數據解密逆向分析

點擊精選&#xff0c;出現https://app.dewu.com/api/v1/h5/index/fire/index 這個請求 直接搜索sign的話不容易定位 直接搜newAdvForH5就一個&#xff0c;進去再搜sign&#xff0c;打上斷點 可以看到t.params就是沒有sign的請求參數&#xff0c; 經過Object(a.default)該函數…

在C#串口通信中,一發一收的場景,如何處理不同功能碼的幀數據比較合理,代碼結構好

在 C# 串口通信的一發一收場景里&#xff0c;處理不同功能碼的幀數據可采用以下合理的代碼結構&#xff0c;它能讓代碼更具可讀性、可維護性和可擴展性。 實現思路 定義幀結構&#xff1a;創建一個類來表示通信幀&#xff0c;其中包含功能碼、數據等信息。功能碼處理邏輯&…

【C++】vector擴容縮容

vector擴容縮容 1 擴容 一般來說&#xff0c;主要是重新分配內存 2 縮容 resize 縮小后&#xff0c;vector 的容量&#xff08;capacity()&#xff09;可能保持不變&#xff0c;需要顯式調用 shrink_to_fit() 來釋放內存。 驗證代碼&#xff1a; #include <vector>…

java中,線程的執行狀態有哪些

在 Java 里&#xff0c;線程有 6 種執行狀態&#xff0c;這些狀態都在 java.lang.Thread.State 枚舉類中被定義。下面為你詳細介紹這些狀態&#xff1a; 1. NEW&#xff08;新建狀態&#xff09; 當你創建了一個 Thread 對象&#xff0c;卻還未調用其 start() 方法時&#xf…

MATLAB 控制系統設計與仿真 - 41

魯棒控制的其他函數 - 回路成型函數 loopsyn 靈敏度問題由魯棒控制工具箱中的loopsyn就可以直接求解,該函數采用H無窮回路成型算法設計控制器,函數的調用格式為: [K,CL,gamma,info] = loopsyn(G,Gd) % G為受控對象模型% Gd為期望的回路傳遞函數% K為回路成型控制器模型% C…

查詢Hologres或postgresql中的數據

因Hologres使用postgresql的語法.所以兩者查詢一樣. 方案1: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;/*** 一個使用簡單連接池管理PostgreSQL連接的工具類。*/ publi…

OpenBayes 一周速覽|EasyControl 高效控制 DiT 架構,助力吉卜力風圖像一鍵生成;TripoSG 單圖秒變高保真 3D 模型

公共資源速遞 10 個教程&#xff1a; * 一鍵部署 R1-OneVision * UNO&#xff1a;通用定制化圖像生成 * TripoSG&#xff1a;單圖秒變高保真 3D * 使用 VASP 進行機器學習力場訓練 * InfiniteYou 高保真圖像生成 Demo * VenusFactory 蛋白質工程設計平臺 * Qwen2.5-0mni…

中興云電腦W102D_晶晨S905X2_2+16G_mt7661無線_安卓9.0_線刷固件包

中興云電腦W102D_晶晨S905X2_216G_mt7661無線_安卓9.0_線刷固件包 準備工作&#xff1a; 工具和設備在開始刷機之前&#xff0c;確保你已經準備好以下物品&#xff1a;雙公頭USB線&#xff1a;選擇一根30-50厘米長的USB線&#xff0c;長度適中&#xff0c;方便操作&#xff0c;…

Rust 學習筆記:安裝 Rust

Rust 學習筆記&#xff1a;安裝 Rust Rust 學習筆記&#xff1a;安裝 Rust在 Windows 上安裝 Rust命令行創建 Rust 項目在 Mac/Linux 上安裝 Rust一些命令升級卸載cargo -hrustc -h 安裝 RustRoverrust-analyzer Rust 學習筆記&#xff1a;安裝 Rust 在 Windows 上安裝 Rust …