C++ 的 IO 流

💬 :如果你在閱讀過程中有任何疑問或想要進一步探討的內容,歡迎在評論區暢所欲言!我們一起學習、共同成長~!

👍 :如果你覺得這篇文章還不錯,不妨順手點個贊、加入收藏,并分享給更多的朋友噢~!


1. C 語言的輸入輸出

1.1?常用輸入輸出函數

C 語言中最常用的輸入輸出方式是?scanf()?與?printf()?

  • scanf():從標準輸入流(通常是鍵盤)讀取格式化數據,按照指定的格式將輸入數據存儲到對應的變量中。
  • printf():將格式化的數據輸出到標準輸出流(通常是顯示器)。使用時需注意寬度輸出和精度輸出控制。

1.2?輸入輸出緩沖區

C 語言借助相應的緩沖區來進行輸入與輸出,輸入輸出緩沖區作用如下:

  • 屏蔽低級 I/O 的實現:低級 I/O 的實現依賴操作系統本身內核,屏蔽這部分差異可使程序更具可移植性。
  • 實現 “行” 讀取行為:計算機本身沒有 “行” 的概念,通過緩沖區可定義 “行”,并解析其內容返回 “行”。


2. 流是什么

“流” 是對有序連續且具有方向性的數據的抽象描述。

C++ 流指信息從外部輸入設備(如鍵盤)向計算機內部(如內存)輸入,以及從內存向外部輸出設備(顯示器)輸出的過程。

C++ 流的特性:

  • 有序連續:數據按順序流動。
  • 有方向性:分為輸入流和輸出流。
  • 基于 I/O 標準類庫:通過類對象實現輸入輸出操作。


3.?C++ ?IO 流

C++ 中構建了一個體系龐大的類庫,在這個類庫的繼承體系里,ios類是基類,其他所有相關類均直接或間接派生自ios類。

3.1?C++ 標準?IO 流

3.1.1?全局流對象

C++ 標準庫提供了 4 個全局流對象:cincoutcerrclog

  • cin:標準輸入流(鍵盤輸入到程序),屬于istream類。
  • cout:標準輸出流(程序輸出到顯示器),屬于ostream類。
  • cerr:標準錯誤輸出流(無緩沖,直接輸出)。
  • clog:標準日志輸出流(有緩沖)。

coutcerrclogostream類的三個不同對象,應用場景不同,但基本功能類似。使用時必須包含頭文件<iostream>,并引入std標準命名空間。

3.1.2 關鍵細節

3.1.2.1 緩沖機制
  • cin為緩沖流,輸入數據先存入緩沖區,提取時從緩沖區讀取。
  • 輸入錯誤會設置流狀態字state,但程序繼續執行。
3.1.2.2 數據類型匹配
  • 輸入類型需與提取類型一致,否則出錯(如給int變量輸入字符將出錯)。
3.1.2.3 分隔符處理
  • 空格和回車可作為數據分隔符,字符型和字符串無法讀取空格或回車。
3.1.2.4 內置類型支持
  • 標準庫已重載<<>>運算符,可直接輸入輸出內置類型(如intdouble)。
3.1.2.5 自定義類型支持
  • 需重載<<>>運算符才能使用cin/cout
3.1.2.6 在線 OJ 輸入輸出

<1> IO類型的算法,一般都要循環輸入:

(1)單個元素循環輸入

適用場景:讀取多組單一類型數據(如多組整數)。

?
int num;
while (cin >> num) 
{  // 輸入整數,遇EOF結束cout << "輸入的數:" << num << endl;
}

(2)多個元素循環輸入

適用場景:讀取每行包含多個數據的輸入(如每行輸入 “姓名 年齡 分數”)。

string name;
int age;
double score;
while (cin >> name >> age >> score) 
{  // 按順序讀取多個元素cout << name << " " << age << " " << score << endl;
}

(3)非整行字符串輸入(不含空格)

適用場景:讀取以空格 / 換行分隔的單詞(如多個獨立字符串)。

string word;
while (cin >> word) 
{  // 讀取單個單詞,遇空格/換行/EOF結束cout << "單詞:" << word << endl;
}

(4)整行字符串輸入(含空格)

適用場景:讀取完整句子或段落(如 “Hello, world!”)。

string line;
while (getline(cin, line)) 
{  // 讀取整行,包括空格,遇EOF或空行結束if (line.empty()) break;  // 可選:跳過空行cout << "整行內容:" << line << endl;
}

<2> 輸出必須與題目要求完全一致,包括空格、換行符、標點符號等,多一個或少一個字符均可能導致錯誤

<3> Windows 系統的 VS 系列編譯器中,通過輸入?Ctrl + Z??再按下?Enter?,就可發送?EOF(文件結束符)?信號,快捷終止輸入循環。

3.1.2.7 流對象的邏輯判斷
  • istream 對象能直接用于條件判斷。若輸入成功,則繼續執行相關操作;若輸入失敗,則停止執行相關操作。
  • 自定義類型可通過重載?operator bool()?函數來添加額外的邏輯判斷。這些額外邏輯判斷通常用于設置業務層面的結束條件。

istream?對象可作為邏輯條件值,是因為該對象會調用?operator bool?函數。

當流提取成功時,operator bool返回true;當遇到文件結束符(EOF,如鍵盤輸入Ctrl+Z)、提取類型不匹配(如給int變量輸入字符)或流被關閉時,operator bool返回false,循環終止。

示例:

#include <iostream>
#include <string>
using namespace std;class Date 
{// 聲明友元函數以訪問私有成員friend ostream& operator<<(ostream& out, const Date& d);friend istream& operator>>(istream& in, Date& d);public:Date(int year = 1, int month = 1, int day = 1): _year(year), _month(month), _day(day) {}// 類型轉換運算符:定義Date對象的邏輯判斷條件explicit operator bool() const {// 假設輸入_year為0時,返回falsereturn _year != 0;}private:int _year;int _month;int _day;
};// 重載流提取運算符:從輸入流讀取Date對象
istream& operator>>(istream& in, Date& d) 
{in >> d._year >> d._month >> d._day; return in; // 返回輸入流對象,支持鏈式調用(如cin >> d1 >> d2)
}// 重載流插入運算符:向輸出流寫入Date對象
ostream& operator<<(ostream& out, const Date& d) 
{out << d._year << "-" << d._month << "-" << d._day; return out; // 返回輸出流對象,支持鏈式調用(如cout << d << endl)
}int main() 
{// 輸出內置類型(自動調用標準庫重載的<<運算符)int i = 1;double j = 2.2;cout << "內置類型輸出:" << endl;cout << "整數i = " << i << endl;cout << "浮點數j = " << j << endl;// 輸出自定義類型Date(調用重載的<<運算符)Date d(2022, 4, 10); cout << "\n初始化的日期:" << d << endl;// 循環輸入Date對象,直到輸入年份為0時結束cout << "\n請輸入日期(格式:年 月 日,輸入0 0 0結束):" << endl;while (cin >> d) { // 用operator>>返回的istream對象調用operator bool// 輸入成功后,檢查Date對象的邏輯狀態(_year是否為0)if (!d) { cout << "檢測到結束標志(年份為0),退出程序。" << endl;break;}cout << "輸入的日期為:" << d << endl; cout << "請繼續輸入(或輸入0 0 0結束):" << endl;}return 0;
}

3.2?C++ 文件?IO 流

根據數據的組織形式,數據文件可分為二進制文件和文本文件。

  • 數據在內存中以二進制形式存儲,若不加轉換輸出到外存文件中,就是二進制文件;
  • 若要求在外存上以 ASCII 碼形式存儲,則需在存儲前轉換,以 ASCII 字符形式存儲的文件就是文本文件。

采用文件流對象操作文件的一般步驟:

  • (1)定義文件流對象
類名用途定義語法示例
ifstream只讀取文件

1.直接構造并打開文件:

ifstream 對象名("文件名",模式);
2. 默認構造后打開文件:
ifstream 對象名;
對象名.open("文件名", 模式);

若未顯式指定模式將默認ios_base::in

std::ifstream fin("data.txt");
std::ifstream fin;
fin.open("data.bin", std::ios_base::binary);
// 或
std::ifstream fin;
fin.open("data.bin", std::ios_base::in | std::ios_base::binary);

ofstream只寫入文件

1. 直接構造并打開文件(覆蓋寫入):
ofstream 對象名("文件名",模式);
2.默認構造后打開文件:
ofstream 對象名;
對象名.open("文件名", 模式);

若未顯式指定模式將默認ios_base::out

類似?ifstream
fstream讀寫文件fstream 對象名("文件名", 模式);
模式必須包含?ios_base::in?|?ios_base::out?)
std::fstream file("data.txt", std::ios_base::in | std::ios_base::out);
// 追加讀寫:
std::fstream file("data.txt", std::ios_base::in | std::ios_base::out | std::ios_base::app);

注意ifstream /?ofstream /?fstream?均需包含頭文件?<fstream> ;ifstream 、ofstream 、fstream?、ios_base 要展開命名空間或使用?std::?前綴。

  • (2)打開文件
    • 成員函數:open(const char* filename, ios_base::mode)
    • 常用打開模式:
      • ios_base::in:輸入模式(讀文件)。
      • ios_base::out:輸出模式(寫文件,覆蓋原有內容)。
      • ios_base::app:追加模式(寫文件,內容追加到末尾)。
      • ios_base::binary:二進制模式(默認為文本模式)。
  • (3)讀寫文件
    • 文本讀寫:使用<<>>運算符(需重載自定義類型運算符)。
    • 二進制讀寫:使用write()和read()成員函數(按字節操作)。
  • (4)關閉文件:調用close()成員函數。

3.2.1?模擬服務器配置信息的讀寫

#include <iostream>       
#include <fstream>        
#include <string>         
using namespace std;      class Date 
{
public:Date(int year = 1, int month = 1, int day = 1): _year(year), _month(month), _day(day) {}friend ostream& operator<<(ostream& out, const Date& d);friend istream& operator>>(istream& in, Date& d);private:int _year;   int _month;  int _day;    
};ostream& operator<<(ostream& out, const Date& d) 
{out << d._year << "-" << d._month << "-" << d._day;return out;
}istream& operator>>(istream& in, Date& d) 
{char separator1, separator2; // 用于讀取日期中的分隔符(如'-')in >> d._year >> separator1 >> d._month >> separator2 >> d._day;return in;
}// 服務器信息結構體
struct ServerInfo 
{char _address[32];  // 地址(字符數組)int _port;          // 端口號Date _date;         // 日期(已重載IO運算符)
};// 配置管理類
class ConfigManager 
{
public:// 構造函數:初始化文件名explicit ConfigManager(const char* filename) : _filename(filename) {}// 二進制寫入文件void WriteBin(const ServerInfo& info) {ofstream ofs(_filename, ios_base::out | ios_base::binary); if (!ofs.is_open()) { // 檢查文件是否打開成功cerr << "Error: Failed to open file for writing (binary)." << endl;return;}// 寫入結構體數據(需保證結構體無虛函數、無動態成員,否則需自定義序列化邏輯)ofs.write(reinterpret_cast<const char*>(&info), sizeof(info));ofs.close();}// 二進制讀取文件void ReadBin(ServerInfo& info) {ifstream ifs(_filename, ios_base::in | ios_base::binary);if (!ifs.is_open()) { cerr << "Error: Failed to open file for reading (binary)." << endl;return;}// 讀取結構體數據ifs.read(reinterpret_cast<char*>(&info), sizeof(info));ifs.close();}// 文本寫入文件void WriteText(const ServerInfo& info) {ofstream ofs(_filename);if (!ofs.is_open()) { cerr << "Error: Failed to open file for writing (text)." << endl;return;}// 使用流插入運算符寫入數據(需保證Date類已重載<<)ofs << info._address << " " << info._port << " " << info._date << endl;ofs.close();}// 文本讀取文件void ReadText(ServerInfo& info) {ifstream ifs(_filename);if (!ifs.is_open()) { cerr << "Error: Failed to open file for reading (text)." << endl;return;}// 使用流提取運算符讀取數據(需保證Date類已重載>>)ifs >> info._address >> info._port >> info._date;ifs.close();}private:string _filename; // 配置文件名
};int main() 
{// 初始化服務器信息ServerInfo winfo = {"192.0.0.1",    // 地址80,             // 端口號{2022, 4, 10}   // 日期(使用Date構造函數初始化)};// 創建配置管理器對象(二進制和文本文件)ConfigManager cf_bin("test.bin");ConfigManager cf_text("test.txt");// ---------------------- 二進制操作 ----------------------// 寫入二進制文件cf_bin.WriteBin(winfo);cout << "二進制文件寫入完成。" << endl;// 讀取二進制文件ServerInfo rbinfo;cf_bin.ReadBin(rbinfo);cout << "二進制讀取結果:" << endl;cout << "地址:" << rbinfo._address << endl;cout << "端口:" << rbinfo._port << endl;cout << "日期:" << rbinfo._date << endl;cout << endl;// ---------------------- 文本操作 ----------------------// 寫入文本文件cf_text.WriteText(winfo);cout << "文本文件寫入完成。" << endl;// 讀取文本文件ServerInfo rtinfo;cf_text.ReadText(rtinfo);cout << "文本讀取結果:" << endl;cout << "地址:" << rtinfo._address << endl;cout << "端口:" << rtinfo._port << endl;cout << "日期:" << rtinfo._date << endl;return 0;
}


4. 簡單介紹?stringstream

傳統C語言方法(如 sprintf / itoa )在進行類型轉換與字符串操作時,存在緩沖區溢出風險且需手動管理內存空間,尤其在處理結構體數據的序列化與反序列化時不夠安全便捷。

stringstream 通過流式操作實現自動類型推導,并利用安全的string緩沖區管理,有效簡化了類型轉換與字符串拼接過程,規避了上述風險,更適用于序列化場景。

4.1 頭文件與類定義

  • 頭文件:#include <sstream>
  • 相關類:
    • istringstream:從字符串讀取數據(輸入流)。
    • ostringstream:向字符串寫入數據(輸出流)。
    • stringstream:雙向操作(讀寫字符串)。

4.2 核心功能

4.2.1 數值類型轉字符串

  • 避免itoa()sprintf()的緩沖區溢出問題,自動推導類型。

示例代碼:

#include <iostream>       
#include <sstream>        
#include <string>         // 包含string類型頭文件using namespace std;      int main()
{int a = 12345678;     string sa;            // 定義用于存儲轉換結果的string對象stringstream s;       // 定義stringstream對象,用于數據轉換// 第一次轉換:將整數a轉換為字符串s << a;               // 向stringstream中插入int類型數據(自動格式化)s >> sa;              // 從stringstream中提取數據到string對象sacout << "整數轉字符串結果:" << sa << endl;  // ---------------------- 關鍵操作:清空流狀態和底層緩沖區 ----------------------s.clear();            // 重置流狀態標志(清除可能的badbit狀態)s.str("");            // 清空stringstream底層維護的string對象,避免殘留數據影響下次轉換// ----------------------------------------------------------------------------// 第二次轉換:將雙精度浮點數d轉換為字符串double d = 12.34;     s << d;               // 向stringstream中插入double類型數據(自動格式化)s >> sa;              // 從stringstream中提取數據到string對象sacout << "浮點數轉字符串結果:" << sa << endl;  return 0;
}

4.2.2 字符串拼接

  • 方便合并多個字符串或變量。

示例代碼:

#include <iostream>      
#include <sstream>        
#include <string>         using namespace std;      int main() 
{// 創建stringstream對象用于字符串操作stringstream sstream;// 向流中插入多個字符串進行拼接sstream << "Hello" << " " << "World," << " 你好!";// 從stringstream中提取拼接后的完整字符串string result = sstream.str();cout << "拼接結果:" << result << endl;  return 0;
}

4.2.3 序列化與反序列化結構數據

  • 將結構體數據轉為字符串(如網絡傳輸),或從字符串解析回結構體。

示例代碼:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;class Date 
{
public:Date(int year = 1, int month = 1, int day = 1): _year(year), _month(month), _day(day) {}friend istream& operator>>(istream& in, Date& d);friend ostream& operator<<(ostream& out, const Date& d);private:int _year;int _month;int _day;
};istream& operator>>(istream& in, Date& d) 
{char separator1, separator2; // 用于處理日期格式中的分隔符(如YYYY-MM-DD)in >> d._year >> separator1 >> d._month >> separator2 >> d._day;return in;
}ostream& operator<<(ostream& out, const Date& d) 
{out << d._year << "-" << d._month << "-" << d._day; return out;
}struct ChatInfo 
{string _name;int _id;Date _date; // 假設已重載<<和>>string _msg;
};int main() 
{// 序列化:結構體轉字符串ChatInfo winfo = {"張三",135246,{2022, 4, 10}, // 使用Date構造函數初始化日期"晚上一起看電影吧"};ostringstream oss;// 按順序輸出結構體成員,用空格分隔(需注意字符串中的空格會導致反序列化問題)oss << winfo._name << " "<< winfo._id << " "<< winfo._date << " "<< winfo._msg; // 假設_msg中不含空格,否則需特殊處理(如轉義或使用其他分隔符)string str = oss.str();cout << "序列化字符串:" << str << endl;// 反序列化:字符串轉結構體ChatInfo rInfo;istringstream iss(str);// 按順序讀取數據,與序列化順序嚴格一致iss >> rInfo._name >> rInfo._id >> rInfo._date >> rInfo._msg;// 檢查反序列化是否成功(處理可能的讀取錯誤)if (iss.fail()) {cerr << "反序列化失敗:輸入格式錯誤" << endl;return 1;}cout << "\n反序列化結果:" << endl;cout << "姓名:" << rInfo._name << "(" << rInfo._id << ")" << endl;cout << "時間:" << rInfo._date << endl;cout << "消息:" << rInfo._msg << endl;return 0;
}

4.3 注意事項

  1. 狀態與緩沖區管理
    • clear():重置流狀態(如badbit),但不清空底層字符串。
    • str(""):清空底層string對象,避免多次轉換時數據累積。
  2. 安全性
    • 使用string代替字符數組,避免緩沖區溢出。
    • 自動類型推導,無需手動格式化,減少錯誤風險。

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

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

相關文章

spring cloud gateway前面是否必須要有個nginx

在 **"客戶端 → Nginx (前置限流) → Spring Cloud Gateway → 微服務(Sentinel 熔斷限流)"** 的架構中&#xff0c;**Spring Cloud Gateway 前面并不強制要求必須有 Nginx**&#xff0c;是否需要取決于具體場景。以下是詳細分析&#xff1a; 一、必須使用 Nginx 的…

Spark和Hadoop之間的對比和聯系

&#xff08;一&#xff09;Spark概述 Spark是一種基于內存的快速、通用、可拓展的大數據分析計算引擎。Hadoop是一個分布式系統基礎架構。 1&#xff09;官網地址&#xff1a;Apache Spark? - Unified Engine for large-scale data analytics 2&#xff09;文檔查看地址&…

多線程進階(Java)

注&#xff1a;此博文為本人學習過程中的筆記 1.常見的鎖策略 當我們需要自己實現一把鎖時&#xff0c;需要關注鎖策略。Java提供的synchronized已經非常好用了&#xff0c;覆蓋了絕大多數的使用場景。此處的鎖策略并不是和Java強相關的&#xff0c;只要涉及到并發編程&#…

c++STL——stack、queue、priority_queue的模擬實現

文章目錄 stack、queue、priority_queue的模擬實現使用部分模擬實現容器適配器deque的介紹原理真實結構deque的迭代器deque的操作deque的優缺點 stack的模擬實現按需實例化queue的模擬實現priority_queue的模擬實現為何引入仿函數代碼實現 stack、queue、priority_queue的模擬實…

【深度學習—李宏毅教程筆記】Transformer

目錄 一、序列到序列&#xff08;Seq2Seq&#xff09;模型 1、Seq2Seq基本原理 2、Seq2Seq模型的應用 3、Seq2Seq模型還能做什么&#xff1f; 二、Encoder 三、Decoder 1、Decoder 的輸入與輸出 2、Decoder 的結構 3、Non-autoregressive Decoder 四、Encoder 和 De…

C++鐫刻數據密碼的樹之銘文:二叉搜索樹

文章目錄 1.二叉搜索樹的概念2.二叉搜索樹的實現2.1 二叉搜索樹的結構2.2 二叉搜索樹的節點尋找2.2.1 非遞歸2.2.2 遞歸 2.3 二叉搜索樹的插入2.3.1 非遞歸2.3.2 遞歸 2.4 二叉搜索樹的刪除2.4.1 非遞歸2.4.2 遞歸 2.5 二叉搜索樹的拷貝 3.二叉樹的應用希望讀者們多多三連支持小…

系統架構設計師:流水線技術相關知識點、記憶卡片、多同類型練習題、答案與解析

流水線記憶要點? ?公式 總時間 (n k - 1)Δt 吞吐率 TP n / 總時間 → 1/Δt&#xff08;max&#xff09; 加速比 S nk / (n k - 1) | 效率 E n / (n k - 1) 關鍵概念 周期&#xff1a;最長段Δt 沖突?&#xff1a; ?數據沖突&#xff08;RAW&#xff09; → 旁路/…

強制重裝及驗證onnxruntime-gpu是否正確工作

#工作記錄 我們經常會遇到明明安裝了onnxruntime-gpu或onnxruntime后&#xff0c;無法正常使用的情況。 一、強制重新安裝 onnxruntime-gpu 及其依賴 # 強制重新安裝 onnxruntime-gpu 及其依賴 pip install --force-reinstall --no-cache-dir onnxruntime-gpu1.18.0 --extra…

桌面我的電腦圖標不見了怎么恢復 恢復方法指南

在Windows操作系統中&#xff0c;“我的電腦”或在較新版本中稱為“此電腦”的圖標&#xff0c;是訪問硬盤驅動器、外部存儲設備和系統文件的重要入口。然而&#xff0c;有些用戶可能會發現桌面上缺少了這個圖標&#xff0c;這可能是由于誤操作、系統設置更改或是不小心刪除造成…

2025.04.20【Lollipop】| Lollipop圖繪制命令簡介

Customize markers See the different options allowing to customize the marker on top of the stem. Customize stems See the different options allowing to customize the stems. 文章目錄 Customize markersCustomize stems Lollipop圖簡介R語言中的Lollipop圖使用ggp…

docker-compose搭建kafka

1、單節點docker-compose.yml version: 3 services:zookeeper:image: zookeeper:3.8container_name: zookeeperports:- "2181:2181"volumes:- ./data/zookeeper:/dataenvironment:ZOO_MY_ID: 1ZOO_MAX_CLIENT_CNXNS: 100kafka:image: bitnami/kafka:3.7container_na…

【問題】一招解決vscode輸出和終端不一致的困擾

背景&#xff08;閑話Trae&#xff09; Trae是挺好&#xff0c;用了幾天&#xff0c;發現它時不時檢查文件&#xff0c;一檢測就轉悠半天&#xff0c;為此我把當前環境清空&#xff0c;就留一個正在調的程序&#xff0c;結果還照樣檢測&#xff0c;雖然沒影響什么&#xff0c;…

Git,本地上傳項目到github

一、Git的安裝和下載 https://git-scm.com/ 進入官網&#xff0c;選擇合適的版本下載 二、Github倉庫創建 點擊右上角New新建一個即可 三、本地項目上傳 1、進入 要上傳的項目目錄&#xff0c;右鍵&#xff0c;選擇Git Bash Here&#xff0c;進入終端Git 2、初始化臨時倉庫…

從零開始配置spark-local模式

1. 環境準備 操作系統&#xff1a;推薦使用 Linux 或 macOS&#xff0c;Windows 也可以&#xff0c;但可能會有一些額外的配置問題。 Java 環境&#xff1a;Spark 需要 Java 環境。確保安裝了 JDK 1.8 或更高版本。 檢查 Java 版本&#xff1a; bash 復制 java -version 如果…

前端~地圖(openlayers)繪制車輛運動軌跡(仿高德)

繪制軌跡路線軌跡路線描邊增加起點終點圖標繪制仿高德方向箭頭模仿車輛動態運動動畫 車輛運行軌跡 車輛軌跡經緯度坐標 const linePoints [new Point([123.676031, 43.653421]),new Point([123.824347, 43.697124]),new Point([124.197882, 43.946811]),new Point([124.104498…

分布式之CAP原則:理解分布式系統的核心設計哲學

聲明&#xff1a;CAP中的P原則都是需要帶著的 在分布式系統的設計與實踐中&#xff0c;CAP原則&#xff08;又稱CAP定理&#xff09;是開發者必須掌握的核心理論之一。它揭示了分布式系統在一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#x…

IF=40.8|腫瘤免疫:從免疫基因組學到單細胞分析和人工智能

一、寫在前面 今天分享的是發表在《Signal Transduction and Targeted Therapy》上題目為"Technological advances in cancer immunity: from immunogenomics to single-cell analysis and artificial intelligence"的文章。 IF&#xff1a;40.8 DOI:10.1038/s41392…

深入理解 Spring @Bean 注解

在 Spring 框架中,@Bean 注解是用于顯式地聲明一個或多個 Bean 實例,并將其注冊到 Spring 容器中的重要工具。與 @Component 系列注解不同的是,@Bean 是方法級別的注解,通常與 @Configuration 注解結合使用。本文將詳細介紹 @Bean 注解的功能、用法及其應用場景。 1. @Bean…

Pycharm 如何刪除某個 Python Interpreter

在PyCharm中&#xff0c;點擊右下角的“Interpreter Settings”按鈕&#xff0c;或者通過菜單欄選擇“File” > “Settings”&#xff08;macOS用戶選擇“PyCharm” > “Preferences”&#xff09;。在設置窗口中&#xff0c;導航到“Project: [Your Project Name]” >…

如何改電腦網絡ip地址完整教程

更改電腦的網絡IP地址以滿足特定的網絡需求&#xff0c;本文將為您提供一份詳細的步驟指南。其實&#xff0c;改變IP地址并不是一件復雜的事&#xff0c;能解決因為IP限制帶來的麻煩。以下是操作指南&#xff1a; 方法一&#xff1a;Windows 系統&#xff0c;通過圖形界面修改 …