Linux系統程序設計:從入門到高級Day02

這一篇 我帶大家復習一下,C語言中的文件 那一部分

大家注意 這里的圖并非原創 是當時我老師的圖片?

本片作用主要是 后續會有文件相關操作,這篇幫大家復習C語言文件中的內容 有助于大家后面的理解。

文章中代碼大多是圖片格式,是因為這是我當時學的時候記得筆記,當時為了方便閱讀,都以截圖的方式記錄,找不到源碼的,我截取了老師當時的源碼,并不是沒有理解的搬運過程,謝謝理解!!希望對你有所幫助
?

知識點1【文件的概述】

1、文件的分類(存儲介質)

磁盤文件:文件的數據存在磁盤上(音視頻,圖片文件,文檔文件)

設備文件:通過系統將外部設備具體成文件

2、文件分類(存儲方式)

任何磁盤文件 在物理上的都是二進制存儲(計算機只能識別01)

邏輯上:硬盤文件分為二進制文件、文本文件

文本文件:基于字符編碼的文件

二進制文件:基于值編碼的文件

文本文件:

基于字符編碼,常見編碼ASCII,Unicode等

一般可以用文本編輯器直接打開

例如:數 5678 的以 ASCII 存儲形式為:

ASCII 碼:00110101 00110110 00110111 00111000

歌詞文件(lrc):文本文件

二進制文件:

基于值編碼,把內存中的數據原樣輸出到磁盤上

一般需要自己判斷或使用特定軟件分析數據格式

例如:數 5678 的存儲形式為: 二進制碼:0001 0110 0010 1110

文本文件和二進制文件的區別

文本文件

優點:

一個字節一個意思,便于查看 :可以直接使用char *p 指向首元素位置,%c打印

缺點:

空間大:一個碼一個字節

效率低:將內存數據 進行ASCII碼轉換后,再存儲到磁盤

二進制文件

二進制文件

優點:

空間小:原樣存儲(內存怎么寫,硬盤怎么存),按照數據大小分配空間

效率高:不需要來回轉換

缺點:

數據不定長,不方便查看

還有以下區別

注意:

寫代碼 是操作內存;

也可以直接編輯硬盤中的文件

當要用文件區分是哪個系統時:

現在各系統的磁盤文件的分別輸入換行操作,在內存rb(二進制文件讀取)打開文件,字符查找\r即可

利用知識點

在windows下換行是\r\n,Linux下是\n

文本文件 有一個轉換的過程

二進制文件 數據原樣存儲與提取

知識點2【文件緩沖區】

緩沖區的目的

1、文件緩沖區的刷新方式

1、行刷新(遇到換行符 刷新)

2、滿刷新(緩沖區數據放滿 刷新)

這個的現象時我們可以每隔一段時間就會看到 終端上刷新數據

3、強制刷新(使用ffulsh函數 刷新)

4、結束刷新 (關閉文件的時候 將緩沖區的數據 全部刷新)

2、模擬時鐘

\r 回到行首

知識點3【文件指針】

文件的指針類型 FILE *

用戶定義一個指針變量

指針變量指明文件信息的起始地址 通過庫函數去操作文件即可

此時的文件指針指向的地址并不是文件的真實地址,真實地址在磁盤中,這時指向的是用fopen后,產生的文件信息的首地址

庫函數借助流指針操作磁盤文件

還有 fflush 中 使用的fflush(stdout) 強制刷新到當前輸出終端(屏幕)

使用fgets時 使用fgets(buf,sizeof(buf),stdin)

知識點4【文件的API】

文件的操作步驟 打開 讀寫 關閉

1、打開文件fopen

返回值

成功:成功打開的文件的地址

失敗:NULL

path

是 文件的路徑,包含文件名

指針類型可以做字符串的首地址 而路徑保存在字符串中

char* p= “/home/work/c/day07/a.txt”;

/home/work/c/day07/a.txt 為文件的路徑

fopen(p,mode)

mode為打開文件的方式 以讀 寫 可讀可寫 追加的方式打開

文件的打開方式mode:

r:只讀

w:只寫

a:追加方式打開

+:可讀可寫的方式打開

t:以文本文件方式打開(默認省略 即r默認打開文本文件)

b:以二進制文件方式打開(必須顯式說明 讀的時候必須是rb)

模式間可以組合

文件信息的空間在fopen調用后自動生成,無需用戶創建,只需要用文件指針變量取接地址即可

2、關閉文件fclose

兩個動作

1、刷新緩沖區,把緩沖區剩下的數據刷新到文件中

2、每個文件都申請了一個堆區空間,即調用fopen時,生成的FILE* fp 指向的區域(文件信息),將其釋放

以上兩個動作在庫函數fclose 中進行

若上式沒有return;

會出現段錯誤,因為若無return; 函數會繼續執行到fclose 會訪問fp的地址(NULL),出現段錯誤

3、一次讀寫一個字符

fputc fgetc

fputc(寫操作)

EOF(end of file)是stdio.h中的一個宏定義,值為-1

注意:EOF只在文本文件中有效,文本文件中存的是字符(0~128),可用-1表示文件結束;然而二進制文件中存的是數值,數據原樣輸出,-1被當作數值處理無特殊含義

案例

fgetc(讀操作)

案例

補充

fgets 內部流指針控制,讀完一個自動都下一個,不用手動++

注:文件內部是沒有EOF的,是系統判斷指針已經指向文件末尾,系統會給一個EOF

流 的概念:在編程中都是以字節為單位出的

EOF 打印出來

我們從磁盤中打開文件 會發現是亂碼

4、一次讀寫一個字符串

fputs fgets

fputs(寫操作)

返回值:該函數返回一個非負值,如果發生錯誤則返回 EOF(-1)

把字符串寫進文件時,‘\0’并不算文件大小,因為文件的空間大,初始化為0('\0' = 0),可見'\0'在文件中并沒有特殊含義,并不能算一個字節

fgets(讀操作)

與到換行符或者文件末尾結束讀取

一次只能讀取個字節

或者在讀取 size-1 個字節停止(size-1:最后一個字節存放'\0'結束字符串)

會獲取回車與空格

需要將buf[strlen[buf] - 1] = 0;

案例

實現 將一個文件 中的內容轉移到另一個文件

5、一次讀寫n塊字符串

fwrite fread

fwrite(寫操作)

將內存數據原樣寫入 硬盤文件中

返回值是實際寫入的塊數即nmemb

不做轉換不方便閱讀

案例

fread(讀操作)

將磁盤數據 原樣輸入到 內存

返回值:實際讀到的塊數,若每塊100,nmenb為5,文件中有250給字節,則返回值為2

案例

使用:大文件拷貝,只要不需要在終端上查看就可以用write

優點:快

缺點:不方便查看

6、格式化讀寫

有一個轉換的過程 方便查看

fprintf fscanf

慢 但是閱讀性高

fprintf (寫操作)

想一下sprintf

是將數據先轉化為字符后,存入數組中,而fprintf是先轉化字符后存入文件中

可知過程 內存數據變為數組,在存入文件

案例

fscanf (讀操作)

知識點5 隨機讀寫

文件默認是順序讀寫:讀寫才能移動流指針,用戶不能修改

隨機讀寫:用戶可以更改文件流指針的位置(使用函數實現)

1、引入案例

如果沒有紅色框內的部分,直接讀取,是得不到內容的,因為流指針的位置沒有在起始位置

2、隨機讀寫的API

fseek rewind ftell

1、rewind 復位文件流指針

2、ftell 返回文件流指針 距離文件首部的字節數

再次強調:‘\0’在文件中無特殊含義,不算文件大小

3、fseek 文件流指針定位

參數3

參數2

案例(重點)

一次性讀取文件數據

回顧

windows下即在VS code 中編輯文本時輸入回車,大小為2個字節

當在linux下vim編輯文本,輸入回車,大小為1個字節

結束

代碼需要手敲,才能更好的理解。希望今天的內容對你能夠有所幫助,如果你喜歡我的分享,請點贊收藏加關注,謝謝大家!!

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

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

相關文章

N元語言模型的時間和空間復雜度計算

對于N元語言模型,時間復雜度是O(V ^ {N-1}),空間復雜度是O(V ^ {N}),N是詞匯表的大小。 空間復雜度:存儲所有可能的N-1元組及其對應的詞的頻次需要大量的存儲空間。例如,對于一個三元模型(N3)&…

Tmux 核心操作速查指南

Tmux 最常用操作筆記 1. 基本概念 會話(Session):一個tmux會話可以包含多個窗口,適合長期任務管理。窗口(Window):每個窗口是一個獨立的終端界面,可包含多個面板。面板&#xff08…

哈希表系列一>兩數之和

目錄 題目:方法:暴力代碼:優化后代碼: 題目: 鏈接: link 方法: 暴力代碼: public int[] twoSum(int[] nums, int target) {解法一:暴力解法:int n nums.length;for(int…

端到端機器學習流水線(MLflow跟蹤實驗)

目錄 端到端機器學習流水線(MLflow跟蹤實驗)1. 引言2. 項目背景與意義2.1 端到端機器學習流水線的重要性2.2 MLflow的作用2.3 工業級數據處理需求3. 數據集生成與介紹3.1 數據集構成3.2 數據生成方法4. 機器學習流水線與MLflow跟蹤4.1 端到端機器學習流水線4.2 MLflow跟蹤實驗…

英語學習:讀科技論文的難處

如果讀起科技論文, 我們就知道自己到底欠缺什么知識了, 那是一個挨著一個的缺。 而且還沒有維基百科可用。 怎么辦?沒辦法!硬看! 而且還要面臨語言的差異性困難。比如這一句怎么翻譯比較合適?還是直接不翻譯…

001 使用單片機實現的邏輯分析儀——吸收篇

本內容記錄于韋東山老師的畢設級開源學習項目,含個人觀點,請理性閱讀。 個人筆記,沒有套路,一步到位,歡迎交流! 00單片機的邏輯分析儀與商業版FPGA的邏輯分析儀異同 對比維度自制STM32邏輯分析儀商業版邏…

基數排序算法解析與TypeScript實現

基數排序(Radix Sort)是一種高效的非比較型整數排序算法,通過逐位分配與收集的方式實現排序。本文將深入解析其工作原理,并給出完整的TypeScript實現。 一、算法原理 1. 核心思想 多關鍵字排序:將整數按位數切割成不同…

最新全開源碼支付系統,贈送3套模板

最新全開源碼支付系統,贈送3套模板 碼支付是專為個人站長打造的聚合免簽系統,擁有卓越的性能和豐富的功能。它采用全新輕量化的界面UI 讓您能更方便快捷地解決知識付費和運營贊助的難題,同時提供實時監控和管理功能,讓您隨時隨地…

PHP基礎二【變量/輸出/數據類型/常量/字符串/運算符】

PHP基礎二 1. PHP變量2. PHP輸出3. 數據類型3.1 字符串3.2 整型3.3 浮點型3.4 布爾型3.5 數組3.6 對象3.7 NULL3.8 資源類型3.9 類型比較 4. 常量5. 運算符 1. PHP變量 1. 我們來看一個實例&#xff1a; <?php$x 5;$y 6;$z $x $y;echo $z; // echo 是輸出&#xff0c;…

ue5 仿鬼泣5魂類游戲角色和敵人沒有碰撞

UE5系列文章目錄 文章目錄 UE5系列文章目錄前言一、問題原因二、設置碰撞2.讀入數據 總結 前言 ue5 仿鬼泣5魂類游戲角色和敵人沒有碰撞 一、問題原因 在UE5中&#xff0c;角色和敵人沒有碰撞可能是由多種原因導致的&#xff0c;以下是一些可能的原因及解決方法&#xff1a…

《AdaBoost:從弱分類器到強模型的進化之路》

目錄 1. AdaBoost 的核心思想 2. AdaBoost 的關鍵步驟 步驟 1&#xff1a;初始化樣本權重 步驟 2&#xff1a;迭代訓練弱分類器 步驟 3&#xff1a;組合弱分類器 3. 用例子詳解 AdaBoost 數據集&#xff1a; 迭代過程&#xff1a; 第1輪&#xff08;t1&#xff09;&am…

Android Settings 有線網設置界面優化

Android Settings 有線網設置界面優化 文章目錄 Android Settings 有線網設置界面優化一、前言二、簡單修改1、修改的EthernetSettings代碼&#xff1a;2、有線網ip獲取代碼&#xff1a;3、AndroidManifest.xml定義有線網的Activity4、修改后界面&#xff1a; 三、其他1、有線網…

基于web的生產過程執行管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 隨著世界經濟信息化、全球化的到來和電子商務的飛速發展&#xff0c;推動了很多行業的改革。若想達到安全&#xff0c;快捷的目的&#xff0c;就需要擁有信息化的組織和管理模式&#xff0c;建立一套合理、暢通、高效的線上管理系統。當前的生產過程執行管理存在管理效率…

XSS 攻擊風險與防御實踐

? 框架與 XSS 防護概況 框架是否默認轉義高危場景建議防御措施React? 是使用 dangerouslySetInnerHTML避免使用&#xff0c;必要時做內容清洗Vue.js? 是使用 v-html避免使用&#xff0c;或使用 DOMPurify 清洗Angular? 是使用 innerHTML、bypassSecurityTrustHtml謹慎繞過…

Cesium 時間線 及 坐標轉換

文章目錄 Cesium 基礎理解&#xff08;二&#xff09;TimeLine & Clock 應用場景核心代碼實例及解釋代碼解釋 Cesium 之 實體動畫構建實體動畫的技巧1. 利用時間屬性2. 組合動畫效果3. 使用動畫曲線 優化點1. 減少屬性更新頻率2. 優化實體數量3. 合理使用材質和紋理 注意事…

ngx_regex_init

定義在 src\core\ngx_regex.c void ngx_regex_init(void) { #if !(NGX_PCRE2)pcre_malloc ngx_regex_malloc;pcre_free ngx_regex_free; #endif } NGX_PCRE21 #if !(NGX_PCRE2) 就為假 條件不成立 ngx_regex_init 函數就成了空實現 NGX_PCRE2 被定義&#xff0c;則表示 Ngin…

第二期:深入理解 Spring Web MVC [特殊字符](核心注解 + 進階開發)

前言&#xff1a; 歡迎來到 Spring Web MVC 深入學習 的第二期&#xff01;在第一期中&#xff0c;我們介紹了 Spring Web MVC 的基礎知識&#xff0c;學習了如何 搭建開發環境、配置 Spring MVC、編寫第一個應用&#xff0c;并初步了解了 控制器、視圖解析、請求處理流程 等核…

一文讀懂數據倉庫:從概念到技術落地

數據倉庫是一個面向主題的、集成的、相對穩定的、反映歷史變化的數據集合&#xff0c;用于支持管理決策。以下是關于數據倉庫的詳細介紹&#xff1a; 一、特點 面向主題&#xff1a;數據倉庫圍繞特定主題組織數據&#xff0c;如客戶、產品、銷售等&#xff0c;而不是像傳統數…

JavaScript學習18-css操作和事件處理程序(html/DOM0/DOM2)

一、css操作 第一種&#xff1a;容易出錯 第二種&#xff1a;有效避免錯誤 第三種&#xff1a; 二、事件處理程序 1.HTML事件 2.DOM0級事件處理 3.DOM2級事件處理

npm設置代理和取消代理

設置代理 具體代理端口要根據自己的來 npm config set proxy http://127.0.0.1:7890 npm config set https-proxy http://127.0.0.1:7890取消代理 npm config delete proxy npm config delete https-proxy查看代理 npm config get proxy # 應返回 null npm config get…