【c語言】玩轉文件操作

🌟🌟作者主頁:ephemerals__

🌟🌟所屬專欄:C語言

目錄

引言

一、文件的打開和關閉

1.流

2.標準流

3.文本文件和二進制文件

4.控制文件打開與關閉的函數

二、文件的順序讀寫

三、文件的隨機讀寫

1.fseek函數

2.ftell函數

3.rewind函數

四、文件讀取結束的判定

總結


引言

? ? ? ? 我們在寫程序的時候,往往會將數據存放在變量當中。如果程序退出,內存回收,這些數據就會丟失。那么我們是否有辦法對這些數據進行持久化的保存,再次打開程序時數據仍然存在?答案是肯定的。而能夠做到這件事的就是:文件操作

一、文件的打開和關閉

1.流

? ? ? ? 程序的數據需要輸出到外部設備,也需要從外部設備輸入。對于不同設備,輸入輸出方式各有不同。為了方便我們在對各種輸入輸出設備進行操作,就有了“流”這一高度抽象的概念。在c語言中,對文件,畫面,鍵盤等的輸入輸出操作都是同過“流”進行的。在一般情況下,我們想要寫入數據或者讀取數據,都需要打開流。

2.標準流

? ? ? ? c語言程序在啟動的時候,默認有三個流已經為我們打開:

stdin--標準輸入流,絕大多數情況下從鍵盤輸入。

stdout--標準輸出流,絕大多數情況輸出至顯示器上。

stderr--標準錯誤流,絕大多數情況輸出至顯示器上。

正因為這三個流已經默認打開,所以我們使用scanf、printf等函數就可以直接進行輸入輸出操作。

這三個流也是具有類型的,它們的類型是:文件指針(FILE*)。我們在進行文件操作的時候,通過文件指針變量就可以間接找到與它關聯的文件

3.文本文件和二進制文件

????????根據數據的組織形式,數據文件被稱為文本文件或者二進制文件。 數據在內存中以二進制的形式存儲,如果不加轉換的輸出到外存的文件中,就是二進制文件
????????如果要求在外存上以ASCII碼的形式存儲,則需要在存儲前轉換。以ASCII字符的形式存儲的文件就是文本文件
?????????個數據在文件中是怎么存儲的呢?
????????字符?律以ASCII形式存儲,數值型數據既可以以ASCII形式存儲,也可以使用二進制形式存儲。如有整數10000,如果以ASCII碼的形式輸出到磁盤,則磁盤中占用5個字節(每個字符?個字節),而二進制形式輸出,則在磁盤上只占4個字節。

4.控制文件打開與關閉的函數

? ? ? ? 在了解了這些前置知識之后,我們切入正題--打開文件和關閉文件。c語言提供了兩個函數,它們分別負責文件的打開和關閉,原型如下:

打開文件:
FILE * fopen ( const char * filename, const char * mode );
關閉文件:
int fclose ( FILE * stream );

fopen函數有兩個參數,第一個參數是以字符串形式表示的文件名,第二個參數是文件的打開方式,用字符串表示。這個函數在使用的時候我們需要創建一個文件指針變量來接收,當文件打開失敗時,它會返回空指針。關于打開方式,在這里一一列舉:

打開方式含義如果指定的文件不存在
“r”(只讀)
為了輸?數據,打開?個已經存在的?本?件
返回空指針
“w”(只寫)
為了輸出數據,打開?個?本?件
建??個新的?件
“a”(追加)向?本?件尾添加數據建??個新的?件
“rb”(只讀)為了輸?數據,打開?個?進制?件返回空指針
“wb”(只寫)為了輸出數據,打開?個?進制?件建??個新的?件
“ab”(追加)向?個?進制?件尾添加數據建??個新的?件
“r+”(讀寫)為了讀和寫,打開?個?本?件返回空指針
“w+”(讀寫)為了讀和寫,建立一個新的文本文件建??個新的?件
“a+”(讀寫)打開?個?件,在?件尾進?讀寫建??個新的?件
“rb+”(讀寫)為了讀和寫打開?個?進制?件返回空指針
“wb+”(讀寫)
為了讀和寫,建立?個新的?進制?件建??個新的?件
“ab+”(讀寫)
打開?個?進制?件,在?件尾進?讀和寫建??個新的?件

對于fclose函數,它的參數是文件指針,用于關閉這個文件指針指向的文件。

接下來,我們嘗試打開和關閉一個文件:

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL)//文件打開失敗則退出程序{perror("fopen");return 0;}printf("文件打開成功\n");fclose(pf);pf = NULL;//避免出現野指針,及時制空return 0;
}
運行結果:

可以看到,由于打開方式是“w”,該路徑下確實出現了一個名為“test.txt”的文件。

二、文件的順序讀寫

? ? ? ? 接下來介紹幾個函數,用于在文件當中讀取或者寫入數據

函數名功能適?于
fgetc字符輸?函數所有輸?流
fputc字符輸出函數所有輸出流
fgets?本?輸?函數所有輸?流
fputs?本?輸出函數所有輸出流
fscanf格式化輸?函數所有輸?流
fprintf格式化輸出函數 所有輸出流
fread?進制輸??件輸?流
fwrite?進制輸出?件輸出流

接下來我們嘗試使用一下fscanffprintf函數:

這兩個函數的第一個參數是一個文件指針,用于對文件數據進行讀取和寫入操作。之后的參數與scanf、printf函數相同。

#include <stdio.h>int main()
{FILE* pf = fopen("test.txt", "w");//要寫入數據,以寫的形式打開文件if (pf == NULL){perror("fopen");return 0;}fprintf(pf, "123456");//向文件中寫入數據fclose(pf);pf = NULL;return 0;
}

可以看到,數據已經寫入到文件當中了。接下來我們使用fscanf函數將文件數據打印到屏幕上:

#include <stdio.h>int main()
{char str[20] = { 0 };FILE* pf = fopen("test.txt", "r");//要讀取數據,以讀的形式打開文件if (pf == NULL){perror("fopen");return 0;}fscanf(pf, "%s", str);//讀取數據到str當中printf(str);fclose(pf);pf = NULL;return 0;
}
運行結果:

三、文件的隨機讀寫

1.fseek函數

? ? ? ? fseek函數的作用是根據文件指針的位置和偏移量來定位文件指針。它的原型如下:

int fseek ( FILE * stream, long int offset, int origin );

它的第一個參數是文件指針,第二個參數是相對于設置位置的偏移量,第三個參數是設置的位置。

c語言定義了三個,可選擇其中一個作為第三個參數:

SEEK_SET:文件的起始位置

SEEK_CUR:文件指針當前的位置

SEEK_END:文件的末尾

定位了文件指針之后,我們就可以在文件的指定位置處進行讀取或者寫入操作了。

2.ftell函數

????????ftell函數用于返回文件指針相對于起始位置的偏移量。函數原型:

long int ftell ( FILE * stream );

3.rewind函數

? ? ? ? rewind函數用于將文件指針的位置回到文件的起始位置。它的函數原型:

void rewind ( FILE * stream );

四、文件讀取結束的判定

? ? ? ? 1.對于文本文件,我們首先可以使用fgetc函數循環讀取文件中的字符,直到讀到EOF為止,說明文件讀取結束

????????2.對于二進制文件,我們使用fread函數判斷其返回值:是否小于實際要讀的個數。如果小于,則說明讀取結束。

? ? ? ? 對于以上兩種情況,文件讀取結束時,我們可以繼續判斷文件讀取結束的原因。介紹兩個函數:feofferror

????????feof函數用于判斷文件讀取結束的原因是否是遇到文件尾。它的原型如下:

int feof ( FILE * stream );

如果文件由于讀取到文件末尾而讀取結束,則返回EOF;如果是其他情況,則會返回0。

????????ferror函數用于判斷文件讀取結束的原因是否是出現I/O錯誤。原型如下:

int ferror ( FILE * stream );

如果文件由于出現I/O錯誤而讀取結束,則返回非0值;其他情況則返回0。

接下來我們嘗試寫一段代碼對文件讀取結束進行判斷:

#include <stdio.h>int main()
{int c = 0;FILE* fp = fopen("test.txt", "r");if (fp == NULL){perror("fopen");return 0;}while ((c = fgetc(fp)) != EOF)//返回EOF則讀取結束{putchar(c);}//判斷讀取結束的原因if (ferror(fp))puts("I/O錯誤\n");else if (feof(fp))puts("文件讀取結束\n");fclose(fp);fp = NULL;return 0;
}

總結

? ? ? ? 今天我們學習了文件操作相關的知識,了解了文件的打開關閉,寫入數據或者從文件讀取數據的方法,以及調整文件指針的函數,還有對文件讀取結束的判定。如果你覺得博主講的還不錯,就請留下一個小小的贊在走哦,感謝大家的支持???

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

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

相關文章

深入理解OAuth 2.0:原理、流程與實踐

一、什么是OAuth 2.0 1. 什么是OAuth 2.0 OAuth 2.0 是一套關于授權的行業標準協議。 OAuth 2.0 允許用戶授權第三方應用訪問他們在另一個服務提供方上的數據&#xff0c;而無需分享他們的憑據&#xff08;如用戶名、密碼&#xff09;。 2. OAuth 2.0 應用場景 OAuth 2.0的…

非參數檢測6——優缺點

優點&#xff1a; 參量檢測的特點在于以似然比處理器為基礎&#xff0c;并建立在假定干擾或噪聲的統計特性已知的基礎上。但實際上&#xff0c;干擾環境往往十分復雜&#xff0c;包括自然和人為因素&#xff0c;且常常隨時改變。這使我們很難確定噪聲的統計特性。因此人們提出…

服務器U盤安裝Centos 7時提示Warning:/dev/root does not exist

這是沒有找到正確的鏡像路徑導致的&#xff0c;我們可以在命令行輸入ls /dev看一下有哪些盤符 像圖中紅色圈起來的就是我插入U盤的盤符&#xff0c;大家的輸幾盤可能做了多個邏輯盤&#xff0c;這種情況下就可以先將U盤拔掉再ls /dev看一下和剛才相比少了那兩個盤符&#xff0c…

在Spring Boot中實現多線程任務調度

在Spring Boot中實現多線程任務調度 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. Spring Boot中的任務調度 Spring Boot通過集成Spring框架的Task Execution和Scheduling支持&#xff0c;提供…

Double 4 VR仿真情景實訓教學系統在法律專業課堂上的應用

隨著科技的飛速發展&#xff0c;VR技術逐漸滲透到各個領域&#xff0c;為教育行業帶來了革命性的變化。 VR技術以其獨特的沉浸式體驗&#xff0c;為法律課堂帶來了前所未有的學習體驗。通過Double 4 VR仿真情景實訓教學系統&#xff0c;學生可以身臨其境地進入虛擬的仿真情景中…

vue前端面試

一 .v-if和v-show的區別 v-if 和 v-show 是 Vue.js 中兩個常用的條件渲染指令&#xff0c;它們都可以根據條件決定是否渲染某個元素。但是它們之間存在一些區別。 語法&#xff1a;v-if 和 v-show 的語法相同&#xff0c;都接收一個布爾值作為參數。 <div v-if"show…

權力之望怎么下載客戶端 權力之望一鍵下載

《權力之望》是一款由NX3 Games開發、Smilegate發行的多人在線動作MMORPG游戲。這款游戲最大的特點是高度的自由度和豐富的角色定制選項。我們在游戲中不僅可以自由更換武器&#xff0c;而且游戲還提供了54種能力和60多種職業選擇&#xff0c;讓我們可以根據自己的游戲風格和喜…

繼 承

為什么要有繼承&#xff0c;繼承的作用&#xff1f; 繼承(inheritance)機制&#xff1a;是面向對象程序設計使代碼可以復用的最重要的手段&#xff0c;它允許程序員在保持原有類特性的基礎上進行擴展&#xff0c;增加新功能&#xff0c;這樣產生新的類&#xff0c;稱派生類。 …

【人工智能】—基于成都市各區(市)縣租房價格預測建模研究

引言 隨著城市化進程的加速&#xff0c;人口流動日益頻繁&#xff0c;租房市場作為城市生活的重要組成部分&#xff0c;其價格波動對居民生活質量和城市經濟發展具有顯著影響。成都市&#xff0c;作為中國西部地區的經濟、文化、交通和科技中心&#xff0c;近年來吸引了大量人…

為什么獨立站需要高質量的GPB外鏈?

獨立站需要高質量的GPB外鏈&#xff0c;主要是因為它們能顯著提升網站的可信度和可見性。高質量的外鏈相當于得到其他權威網站的認可和推薦&#xff0c;這會讓搜索引擎認為你的內容有價值&#xff0c;從而提升你的搜索排名。試想一下&#xff0c;當其他有影響力的網站愿意鏈接到…

非阻塞式 I/O 模型 【NIO】補充內容

NIO是一種同步非阻塞IO, 基于Reactor模型來實現的。其實相當于就是一個線程處理大量的客戶端的請求&#xff0c;通過一個線程輪詢大量的channel&#xff0c;每次就獲取一批有事件的channel&#xff0c;然后對每個請求啟動一個線程處理即可。這里的核心就是非阻塞&#xff0c;就…

請求接口在控制臺報cors跨域問題

我的問題是&#xff1a;BASE_URL沒有和本地IP設置一致 剛開始&#xff1a;&#xff08;這個不是我本地電腦的地址&#xff09; 所以我要把&#xff1a;這個地址改為我本地電腦的ip&#xff08;http://192.168.2.50:8087&#xff09; BASE_URL: http://localhost:8087/api/ 或…

單位電腦文檔怎么加密?哪種方法最有效?

單位電腦文檔的加密是保障信息安全的重要措施之一&#xff0c;它可以防止未經授權的訪問和數據泄露。 選擇最佳的加密方法取決于您的具體需求&#xff0c;包括文檔的敏感程度、加密的便捷性、成本、以及是否需要跨平臺兼容性。下面是幾種常見的加密方法及其優缺點&#xff0c;…

【SpringBoot3】結合 gRpc 實現遠程服務調用

一、gRPC概念介紹 gRPC&#xff08;Google Remote Procedure Call&#xff0c;Google遠程過程調用&#xff09;是一個現代開源高性能遠程過程調用(RPC)框架&#xff0c;可以在任何環境中運行。它由Google開發&#xff0c;旨在幫助開發人員更輕松地構建分布式應用&#xff0c;特…

昇思學習打卡-8-FCN圖像語義分割

目錄 FCN介紹FCN所用的技術訓練數據的可視化模型訓練模型推理FCN的優點和不足優點不足 FCN介紹 FCN主要用于圖像分割領域&#xff0c;是一種端到端的分割方法&#xff0c;是深度學習應用在圖像語義分割的開山之作。通過進行像素級的預測直接得出與原圖大小相等的label map。因…

clean code-代碼整潔之道 閱讀筆記(第十六章)

第十六章 重構SerialDate 16.1 首先&#xff0c;讓它能工作 利用SerialDateTests來完整的理解和重構SerialDate用Clover來檢查單元測試覆蓋了哪些代碼&#xff0c;效果不行重新編寫自己的單元測試經過簡單的修改&#xff0c;讓測試能夠通過 16.2 讓它做對 全過程&#xff1…

若依微服務初始化搭建教程

文章目錄 &#x1f95d;從Gitee拉取代碼&#x1f344;初始化項目配置配置項目maven配置項目JDKmaven - clean - install &#x1f352;數據源配置創建config / seata數據庫創建ry-cloud數據源導入ry-cloud數據 &#x1f370;啟動Nacos下載Nacos修改Nacos配置雙擊startup.cmd啟動…

梧桐數據庫:查詢優化器是提升數據庫性能的關鍵技術

查詢優化器是數據庫管理系統中的核心組件之一&#xff0c;它的主要作用是在執行查詢語句之前&#xff0c;選擇最優的執行計劃&#xff0c;以提高查詢性能。 查詢優化器的基本原理 查詢優化器的主要目標是找到一個執行代價最小的查詢執行計劃。它通過對查詢語句進行語法分析、…

GraphRAG:AI的全局文本理解革新

前言 在人工智能領域&#xff0c;處理和理解大量文本數據始終是一個挑戰。隨著大型語言模型&#xff08;LLMs&#xff09;的出現&#xff0c;自動化地進行復雜的語義理解和文本摘要變得可能。檢索增強生成&#xff08;RAG&#xff09;方法因其能有效結合檢索與生成技術&#x…

C++基礎語法之重載引用和命名空間等

1.C關鍵字 c的關鍵字比我們的c語言的關鍵字多&#xff0c;c包容C語言并對C語言進行了補充&#xff0c;但是我們對關鍵字的學習是在我們后面逐漸學習的。這里我們的只是提供一個表格對齊了解一下。 2.命名空間 我們c出現了命名空間的概念&#xff0c;用關鍵字namespace來定義。…