標準io(1)

標準I/O基礎概念

標準I/O(Standard Input/Output)是C語言提供的一組高級文件操作函數,位于<stdio.h>頭文件中。與低級I/O(如Unix的系統調用read/write)相比,標準I/O引入了緩沖機制,能顯著提升讀寫效率。核心概念包括:

  • 文件指針(FILE*:指向FILE結構的指針,用于標識打開的文件流
  • 緩沖類型:全緩沖、行緩沖、無緩沖
  • 文本流與二進制流:文本流會處理換行符轉換,二進制流直接讀寫原始數據

文件打開與關閉

fopen函數

FILE *fopen(const char *filename, const char *mode);

  • 參數:

    • filename:文件路徑字符串
    • mode:打開模式:
      • "r":只讀(文件必須存在)
      • "w":只寫(創建新文件或清空已有文件)
      • "a":追加(在文件末尾寫入)
      • "r+":讀寫(文件必須存在)
      • "w+":讀寫(創建新文件或清空已有文件)
      • "a+":讀寫(從文件末尾開始)
      • 附加b表示二進制模式(如"rb"
  • 返回值:成功返回FILE指針,失敗返回NULL

fclose函數

int fclose(FILE *stream);

  • 參數:要關閉的文件流指針
  • 返回值:成功返回0,失敗返回EOF
  • 注意:關閉前會刷新緩沖區,多次關閉同一流會導致未定義行為

字符I/O操作

fgetc函數

int fgetc(FILE *stream);

  • 從指定流讀取一個字符
  • 返回值:成功返回讀取的字符(轉為unsigned char再轉int),失敗或到達文件尾返回EOF

fputc函數

int fputc(int c, FILE *stream);

  • 向指定流寫入一個字符
  • 參數:c會被轉為unsigned char寫入
  • 返回值:成功返回寫入的字符,失敗返回EOF

使用示例:

// 文件復制示例
FILE *src = fopen("input.txt", "r");
FILE *dst = fopen("output.txt", "w");
int ch;
while ((ch = fgetc(src)) != EOF) {fputc(ch, dst);
}
fclose(src);
fclose(dst);

行I/O操作

fgets函數

char *fgets(char *str, int n, FILE *stream);

  • 從流中讀取最多n-1個字符到str緩沖區
  • 遇到換行符或EOF時停止,換行符會被保留
  • 緩沖區末尾自動添加'\0'
  • 返回值:成功返回str指針,失敗或到達文件尾返回NULL

fputs函數

int fputs(const char *str, FILE *stream);

  • 將字符串寫入流,不包含結尾的'\0'
  • 返回值:成功返回非負值,失敗返回EOF

使用示例:

// 行計數示例
FILE *fp = fopen("file.txt", "r");
char buffer[256];
int lines = 0;
while (fgets(buffer, sizeof(buffer), fp)) {lines++;
}
fclose(fp);

格式化I/O操作

fscanf函數

int fscanf(FILE *stream, const char *format, ...);

  • 從流中按指定格式讀取數據
  • 格式字符串與scanf相同
  • 返回值:成功匹配并賦值的參數個數,失敗或到達文件尾返回EOF

fprintf函數

int fprintf(FILE *stream, const char *format, ...);

  • 按指定格式向流寫入數據
  • 格式字符串與printf相同
  • 返回值:成功寫入的字符數,失敗返回負值

使用示例:

// 結構化數據讀寫
typedef struct {int id;char name[50];float score;
} Student;FILE *fp = fopen("data.txt", "w+");
Student s = {1, "Alice", 95.5f};
fprintf(fp, "%d %s %f\n", s.id, s.name, s.score);rewind(fp);
Student new_s;
fscanf(fp, "%d %49s %f", &new_s.id, new_s.name, &new_s.score);
fclose(fp);

錯誤處理與狀態檢查

  • ferror:檢查流錯誤標志

    int ferror(FILE *stream);
    

  • feof:檢查文件結束標志

    int feof(FILE *stream);
    

  • clearerr:清除錯誤和EOF標志

    void clearerr(FILE *stream);
    

正確使用模式:

while (1) {ch = fgetc(fp);if (feof(fp)) break;if (ferror(fp)) {perror("Read error");break;}// 處理字符
}

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

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

相關文章

線性代數1000題學習筆記

1000題線代基礎第一章1-101000題線代基礎第二章1-171000題線代基礎第三章1-11

LeetCode算法日記 - Day 8: 串聯所有單詞的子串、最小覆蓋子串

目錄 1.串聯所有單詞的子串 1.2 解法 1.3 代碼實現 2. 最小覆蓋子串 2.1 題目解析 2.2 解法 2.3 代碼實現 1.串聯所有單詞的子串 30. 串聯所有單詞的子串 - 力扣&#xff08;LeetCode&#xff09; 給定一個字符串 s 和一個字符串數組 words。 words 中所有字符串 長度…

linux實戰:基于Ubuntu的專業相機

核心組件就是QTimerOpenCV的組合方案攝像頭啟停控制用QPushButton實現&#xff0c;幀顯示必須用QLabel而不能用普通控件&#xff0c;視頻流刷新用QTimer比多線程更簡單想快速實現攝像頭控制功能&#xff0c;核心組件就是QTimerOpenCV的組合方案。攝像頭啟停控制用QPushButton實…

《深度剖析前端框架中錯誤邊界:異常處理的基石與進階》

錯誤邊界作為一種特殊的組件機制&#xff0c;正悄然重塑著應用應對異常的底層邏輯。它并非簡單的代碼片段組合&#xff0c;而是一套貫穿組件生命周期的防護體系&#xff0c;其核心價值在于將局部錯誤的影響牢牢鎖定在可控范圍內&#xff0c;避免整個應用陷入不可挽回的崩潰狀態…

6GB顯存玩轉SD微調!LoRA-scripts本地部署教程,一鍵煉出專屬AI畫師

一、介紹LoRA-scripts&#xff08;又名 SD-Trainer&#xff09;&#xff0c;是一個專為訓練低秩自適應&#xff08;LoRA&#xff09;模型設計的開源工具集主要應用于Stable Diffusion等AI繪圖模型的微調&#xff0c;幫助用戶高效創建定制化風格、角色或概念的輕量級模型。目前已…

探索AI的數學奇跡:Gemini 2.5 Pro如何摘得IMO金牌

?? 引言:從人類天才到AI奇才的跨越 想象一下,一個AI模型坐在國際數學奧林匹克(IMO)的考場里,手里拿著筆(好吧,其實是處理token),面對那些讓高中生們頭疼不已的難題。它不是靠死記硬背,而是通過深思熟慮的推理,一步步攻克難關。這聽起來像科幻小說,但2025年,這已…

MCP學習與實踐

目錄 1.MCP簡介 1.1 MCP是什么 1.2 MCP與Agent關系&#xff1a; 1.3 MCP的架構 2. MCP原理 2.1 MCP 工作過程 2.2 MCP 通訊方式 2. MCP使用 2.1 cursor中增加MCP-SSE(高德地圖MCP) 2.2 cursor中增加MCP-STDIO&#xff08;12306-MCP&#xff09; 本文詳細講解了什么是…

MySQL(187)如何使用pt-query-digest進行查詢分析?

使用 pt-query-digest 工具可以幫助分析 MySQL 查詢的性能&#xff0c;找出慢查詢、頻繁查詢以及消耗資源較多的查詢&#xff0c;從而為優化提供依據。以下是詳細深入的使用 pt-query-digest 進行查詢分析的步驟和相關示例。 一、安裝 pt-query-digest pt-query-digest 是 Perc…

分享一個基于Python和Hadoop的的電信客戶特征可視化分析平臺 基于Spark平臺的電信客服數據存儲與處理系統源碼

&#x1f495;&#x1f495;作者&#xff1a;計算機源碼社 &#x1f495;&#x1f495;個人簡介&#xff1a;本人八年開發經驗&#xff0c;擅長Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬蟲、大數據、機器學習等&#xff0c;大家有這一塊的問題…

初識STL

一 、STL的誕生在C發展早期&#xff0c;程序員在不同的項目中需要反復編寫相似的數據結構和算法。重復開發帶來以下問題&#xff1a;代碼冗余&#xff1a;每個項目都要重新實現基本數據結構和算法維護困難&#xff1a;不同人編寫的代碼風格不一致&#xff0c;難以維護效率低下&…

DDoS 防護的未來趨勢:AI 如何重塑安全行業?

隨著網絡攻擊規模和復雜性的不斷升級&#xff0c;分布式拒絕服務&#xff08;DDoS&#xff09;攻擊已成為企業數字化轉型中的一大威脅。傳統防御手段在應對智能化、動態化的攻擊時逐漸顯露出局限性。而人工智能&#xff08;AI&#xff09;技術的崛起&#xff0c;正為 DDoS 防護…

【每天一個知識點】深度領域對抗神經網絡

Deep Domain Adversarial Neural Network&#xff08;深度領域對抗神經網絡&#xff0c;DDANN&#xff09; 是一類結合 深度學習 與 領域自適應&#xff08;domain adaptation&#xff09; 思想的神經網絡結構&#xff0c;主要用于不同數據域之間的知識遷移&#xff0c;尤其是在…

【C語言】深入理解預處理

文章目錄一、預定義符號二、#define定義常量&#xff1a;便捷的符號替換常見用法示例&#xff1a;注意事項&#xff1a;三、#define定義宏&#xff1a;帶參數的文本替換關鍵注意點&#xff1a;四、帶有副作用的宏參數五、宏替換的規則&#xff1a;預處理的執行步驟重要注意&…

展銳平臺(Android15)WLAN熱點名稱修改不生效問題分析

前言 在展銳Android V項目開發中&#xff0c;需要修改softAp/P2P熱點名稱時&#xff0c;發現集成GMS后直接修改framework層代碼無效。具體表現為&#xff1a; 修改packages/modules/Wifi/WifiApConfigStore中的getDefaultApConfiguration方法編譯燒錄后修改不生效 問題根源在…

wsl ubuntu訪問(掛載)vmware vmdk磁盤教程

之前使用VMware Workstation 虛擬機跑了個ubuntu&#xff0c;現在改用wsl了&#xff0c; 想把vmware的磁盤掛載到wsl ubuntu。一、磁盤合并我原先的vmware跑的ubuntu存在多個vmdk文件&#xff08;磁盤文件&#xff09;&#xff0c;需要先將磁盤合并成一個才方便掛載。首先你電腦…

UGUI源碼剖析(3):布局的“原子”——RectTransform的核心數據模型與幾何學

UGUI源碼剖析&#xff08;第三章&#xff09;&#xff1a;布局的“原子”——RectTransform的核心數據模型與幾何學 在前幾章中&#xff0c;我們了解了UGUI的組件規范和更新調度機制。現在&#xff0c;我們將深入到這個系統的“幾何學”核心&#xff0c;去剖析那個我們每天都在…

c++注意點(15)----設計模式(橋接模式與適配器模式)

一、結構型設計模式兩者有點相似&#xff0c;都是為了做到解耦的功能。適配器模式是一種結構型設計模式&#xff0c; 它能使接口不兼容的對象能夠相互合作。橋接模式是一種結構型設計模式&#xff0c; 可將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構&…

DuoPlus支持導入文件批量配置云手機參數,還優化了批量操作和搜索功能!

作為我常用的一款還不錯的跨境工具&#xff0c;DuoPlus云手機幫我高效完成了很多跨境工作&#xff0c;它的功能也在逐步完善和優化&#xff0c;今天來聊聊它最近新更新的一些功能。功能更新一覽新增導入文件配置參數&#xff1a;批量初始化代理、批量修改參數支持導入文件一鍵配…

PLC如何實現通過MQTT協議物聯網網關接入管理云平臺

在工業4.0與智能制造浪潮下&#xff0c;企業亟需實現設備數據的高效采集與云端協同&#xff0c;以支撐遠程監控、預測性維護等場景。工業智能網關憑借其強大的協議解析能力、邊緣計算功能及安全傳輸機制&#xff0c;成為PLC接入云平臺的核心解決方案。本文將從技術架構、功能模…

通過sealos工具在ubuntu 24.02上安裝k8s集群

一、系統準備&#xff08;1&#xff09;安裝openssh服務 sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh&#xff08;2&#xff09;放通防火墻 sudo ufw allow ssh&#xff08;3&#xff09;開通root直接登錄 vim /etc/ssh/sshd_config#…