Linux內核-標準IO和系統IO的區別

  1. 概念
    標準IO:指的是C語言實現的文件操作的函數
    系統IO(文件IO):指的是linux或windows或unix,實現文件操作的函數。

  2. 為什么要有兩種IO
    C語言要實現跨平臺,所以C語言在不同操作系統中實現文件操作方式是不一樣的
    因為:標準IO函數會去調用系統IO函數

  3. 它們主要的區別
    標準IO有緩沖區,系統IO沒有緩沖區

  4. 緩沖模式
    全緩沖模式:程序員自己打開的文件流
    1、當緩沖區滿了,會實際執行IO操作。
    2、當執行fclose函數或fflush函數(不管緩沖區是否是滿的,
    強制執行IO操作,刷新緩沖區的數據)
    3、當程序退出的時候,操作系統會幫我們把所有已打開的文件流進行關閉
    行緩沖模式:stdin,stdout
    1、行緩沖區滿了,會執行執行IO操作。
    2、當緩沖區中存在了換行操作符\n,會執行IO操作。
    無緩沖模式:stderr

  5. 文件描述符
    C程序啟動起來以后,會有三個默認的文件被打開,
    stdin(標準輸入,編號0)、stdout(標準輸出,編號1)、stderr(標準錯誤,編號2)
    如果我們也打開了一個fopen打開了一個文件,那么這個文件的編號就是3
    這種編號就稱為文件描述符

  6. 流的概念
    stream 流:形象的比喻數據的流向。
    輸入流:數據從文件到內存,I:Input
    輸出流:內存流向文件,O:output
    生活中水流,有方向的

  7. 標準IO相關函數

    打開文件流:

	FILE *fopen(const char *pathname, const char *mode);根據文件的路徑,使用不同打開模式,打開一個文件,返回值是一個文件流FILE *fdopen(int fd, const char *mode);fd:文件描述符,socket 已經打開了一個文件,socket和文件結合起來,就可以使用fdopen。FILE *freopen(const char *pathname, const char *mode, FILE *stream);重新打開文件流,以前設置的文件流的屬性,會被重置

按照文本方式讀流:

  int fgetc(FILE *stream):從流中讀取一個字符,返回值是負數代表的是讀失敗了,整數和0代表讀出來的字符char *fgets(char *s, int size, FILE *stream):從stream中讀取size個字符,讀到s緩沖區中;讀到內容返回是s,讀不到內容返回NULLint getc(FILE *stream):同fgetcint getchar(void):從控制臺拿一個字符,等同于getc(stdin)int ungetc(int c, FILE *stream):c字符放入stream流的后邊,相當于將c追加到stream中

按照文本方式寫流:

  int fputc(int c, FILE *stream):將字符c寫入到stream中,如寫成功返回c的int值,寫失敗返回的EOFint fputs(const char *s, FILE *stream):將字符串s寫入到stream中,如果成功返回寫入的個數,如果失敗返回EOFint putc(int c, FILE *stream):同fputcint putchar(int c):往控制臺輸出一個字符串,等同于putc(c, stdout)int puts(const char *s):往控制臺輸出一行字符串,等同于fputs(s,stdout)

按照二進制方式讀寫流:

   size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream):從stream中讀取nmemb*size個字節,放到ptr中。成功:返回的是讀到了多少個單元數據失敗:若出現錯誤或到達文件末尾,則返回值可能小于nmemb或0。size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream):從ptr中讀取nmemb*size個字節,然后寫入到stream中。成功:返回的是寫入了多少個單元數據失敗:若出現錯誤,則返回值可能小于nmemb或0

檢查或者重置流狀態:

	void clearerr(FILE *stream):clearerr函數就是要復位這些錯誤標志,也就是使fp所指向的文件的錯誤標志和文件結束標志置0,從而使文件恢復正常。int feof(FILE *stream):檢測流上的文件結束符,如果文件結束,則返回非0值,否則返回0int ferror(FILE *stream):如果ferror返回值為0(假),表示未出錯。如果返回一個非零值,表示出錯。應該注意,對同一個文件 每一次調用輸入輸出函數,均產生一個新的ferror函 數值,因此,應當在調用一個輸入輸出函數后立即檢 查ferror函數的值,否則信息會丟失int fileno(FILE *stream):獲取已經打開的文件描述符(用于獲取系統io的文件描述符)

刷新流:

int fflush(FILE *stream):強制刷新輸出緩沖區中的內容到文件中。stream為NULL,將強制刷新進程中的所有緩沖區stream是一個指定的文件流,會刷新stream輸出緩沖區到文件中

重新定位流:

int fseek(FILE *stream, long offset, int whence);whence=SEEK_SET,offset=10,從文件的頭開始計算,偏移10個字節whence=SEEK_CUR,offset = 2,從文件當前位置開始計算,向后偏移2個字節whence=SEEK_CUR,offset = -2,從文件當前位置開始計算,向前偏移2個字節whence=SEEK_END,offset = -2,從文件最后位置開始計算,向前偏移2個字節whence=SEEK_END,offset = 100,從文件最后位置開始計算,向后偏移100個字節設置成功:返回0設置失敗:返回非0fseek函數限制是文件大小不能超過2G
long ftell(FILE *stream):獲取當前文件的位置指針
void rewind(FILE *stream):文件位置指針設置到文件開頭,等價于:(void) fseek(stream, 0L, SEEK_SET)
int fgetpos(FILE *stream, fpos_t *pos):等價于:ftell(從文件頭開始計算)
int fsetpos(FILE *stream, const fpos_t *pos):等價于fseek函數(whence==SEEK_SETint fseeko(FILE *stream, off_t offset, int whence):和fseek類似,但是擴展了long的長度,前提是要加入宏_FILE_OFFSET_BITS
off_t ftello(FILE *stream):類似于ftell

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

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

相關文章

一文詳解Java反射

文章目錄 反射是什么?反射的作用所有方法匯總一、加載Class對象二、加載類的構造器對象三、加載類的成員變量四、加載類的成員方法 反射是什么? 反射就是:加載類,并允許以編程的方式解剖類中的某個成分(成員變量&#…

實戰:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服務協同部署(包含解決瀏覽器訪問Linux部署服務器本地資源問題)

1. 背景 在該實戰中,我們將探討如何使用Docker Compose協同部署Nginx、Java、Mysql和Redis服務,實現一個視頻上傳與展示的應用。具體需求如下: Java應用負責上傳視頻和圖片資源到Nginx目錄下,作為資源服務器。Nginx服務作為靜態…

Numpy數組常用屬性匯總(第5講)

Numpy數組常用屬性匯總 (第5講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ????????????????????????????????????????????????????????????????????????????????????…

【JavaEE進階】 Spring使用注解存儲對象

文章目錄 🌴序言🍀前置?作:配置掃描路徑🎄添加注解存儲 Bean 對象🌳類注解🚩為什么要這么多類注解🚩注解之間的聯系 🎋?法注解 Bean🚩?法注解需要配合類注解使? ?總…

探索AIGC未來:CPU源碼優化、多GPU編程與中國算力瓶頸與發展

★人工智能;大數據技術;AIGC;Turbo;DALLE 3;多模態大模型;MLLM;LLM;Agent;Llama2;國產GPU芯片;GPU;CPU;高性能計算機;邊緣計算;大模型顯存占用;5G…

如何夸張孩子

你剛才很努力啊!——表揚努力盡管艱難,但你一直沒有放棄——表揚耐心和堅持你做事情的態度非常不錯——表揚態度你在_____上進步了很多!——表揚細節這個方法真有新意!——表揚創意你和小伙伴合作得真棒!——表揚合作精…

中國特供閹割版 RTX 4090 曝光,老黃這操作絕了

到了現在大伙兒應該發現:國內禁售 NVIDIA RTX 4090 顯卡這事兒基本實錘了。 實際上根據老美規定,從上個月 17 號開始,凡是公司主體在中國的顯卡品牌,就已經不能生產和銷售 RTX 4090。 以后廠商想要賣 4090 只能以整機形式出售&am…

藝術畫廊展廳網站制作的效果如何

藝術展廳往往有很多人前往,在主要城市有不少畫廊,對經營者來說,不同于銷售行業,其更多的是打造品牌吸引用戶前來或合作等形式,而由于行業特殊性,需要準屬性用戶才會前往。 因此在品牌打造及信息承載宣傳方…

防止企業敏感數據泄露

敏感數據泄露是指意外或故意泄露關鍵信息,例如個人身份信息(PII)、支付卡信息(PCI)、受保護的電子健康信息(ePHI)和知識產權(IP),數據保護措施不足的組織會在…

10-Hadoop組件開發技術

單選題 題目1:下列選項描述錯誤的是? 選項: A Hadoop HA即集群中包含Secondary NameNode作為備份節點存在。 B ResourceManager負責的是整個Yarn集群資源的監控、分配和管理工作 C NodeManager負責定時的向ResourceManager匯報所在節點的資源使用情況…

Spark---DataFrame存儲、Spark UDF函數、UDAF函數

四、DataFrame存儲Spark UDF函數 1、儲存DataFrame 1)、將DataFrame存儲為parquet文件 2)、將DataFrame存儲到JDBC數據庫 3)、將DataFrame存儲到Hive表 2、UDF:用戶自定義函數 可以自定義類實現UDFX接口 java: …

案例062:基于微信小程序的健身房私教預約系統

文末獲取源碼 開發語言:Java 框架:SSM JDK版本:JDK1.8 數據庫:mysql 5.7 開發軟件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序開發軟件:HBuilder X 小程序…

模塊式雨水調蓄池施工簡單,無需大型機械,可實現當天開挖當天回填

模塊式雨水調蓄池的施工過程非常簡單,無需大型機械和繁瑣的施工工藝。在施工過程中,只需要進行簡單的開挖和回填即可,而且可以在當天完成。這種施工方式不僅節省了施工時間和成本,還可以避免因大型機械和繁瑣工藝引起的安全隱患。…

MIT_線性代數筆記: 復習一

目錄 問題一問題二問題三問題四 本講為考前復習課,考試范圍就是 Axb 這個單元,重點是長方形矩陣,與此相關的概念包括零空間、左零空間、秩、向量空間、子空間,特別是四個基本子空間。當矩陣為可逆的方陣時,很多性質是一…

二叉樹的層次遍歷

102. 二叉樹的層序遍歷 - 力扣(LeetCode) 題目描述 給你二叉樹的根節點 root ,返回其節點值的 層序遍歷 。 (即逐層地,從左到右訪問所有節點)。 樣例輸入 示例 1: 輸入:root [3…

php研究課題

對于PHP這門語言而言,可以研究的課題有很多,以下是可能的課題方向和對應的內容: PHP語言基礎研究 PHP語言特性和基本語法PHP的數據類型、變量、運算符和表達式PHP的流程控制語句PHP的函數和引用PHP的面向對象編程和設計模式 PHP與Web開發 …

harmony開發之Text組件的使用

TextInput、TextArea是輸入框組件,通常用于響應用戶的輸入操作,比如評論區的輸入、聊天框的輸入、表格的輸入等,也可以結合其它組件構建功能頁面,例如登錄注冊頁面。 圖片來源黑馬程序員 Text組件的使用: 文本顯示組…

flutter學習-day1-環境搭建和啟動第一個項目

📚 目錄 SDK 下載配置環境變量安裝 flutter搭建 Android 環境SDK 和依賴升級IDE 配置與使用 Android Studio 配置與使用VS Code 配置與使用 真機調試 本文學習和引用自《Flutter實戰第二版》:作者:杜文 1. SDK下載 前置需要操作系統 window …

Spring Cloud + Vue前后端分離-第4章 使用Vue cli 4搭建管理控臺

Spring Cloud Vue前后端分離-第4章 使用Vue cli 4搭建管理控臺 4-1 使用vue cli創建admin項目 Vue 簡介 Vue作者尤雨溪在google工作時,最早只想研究angular的數據綁定功能,后面覺得這個小功能很好用,有前景,就再擴展&#xff…

[MySQL] MySQL復合查詢(多表查詢、子查詢)

前面我們學習了MySQL簡單的單表查詢。但是我們發現,在很多情況下單表查詢并不能很好的滿足我們的查詢需求。本篇文章會重點講解MySQL中的多表查詢、子查詢和一些復雜查詢。希望本篇文章會對你有所幫助。 文章目錄 一、基本查詢回顧 二、多表查詢 2、1 笛卡爾積 2、2…