【C語言】文件操作(詳解)

在這里插入圖片描述
個人主頁
在這里插入圖片描述

今天我們來講一下有關文件的相關操作,希望看完這篇文章對你有所幫助,大力感謝你對博主的支持!

文章目錄

  • ?一、為什么使用文件
  • 🎉二、什么是文件
    • 2.1 程序文件
    • 2.2 數據文件
    • 2.3 文件名
  • 🎡三、二進制文件和文本文件
  • 🚀四、文件的打開和關閉
    • 4.1 流和標準流
    • 4.2 文件指針
    • 4.3 文件的打開和關閉
  • 🏝?五、文件的順序讀寫
    • 5.1 fgetc (字符輸入函數)
    • 5.2 fputc (字符輸出函數)
    • 5.3 fgets (文本行輸入函數)
    • 5.4 fputs (文本行輸出函數)
    • 5.5 fscanf (格式化輸入函數)
    • 5.6 fprintf (格式化輸出函數)
    • 5.7 fread (二進制輸入)
    • 5.8 fwrite (二進制輸出)
  • 🎄六、文件的隨機讀寫
    • 6.1 fseek
    • 6.2 ftell
    • 6.3 rewind
  • 🚆七、文件讀取結束的判定
  • 🚘八、文件緩沖區

?一、為什么使用文件

在日常中,我們寫的程序的數據是存儲在電腦的內存中,如果程序退出,內存就會被回收,數據就丟失了。我們再次運行程序時就看不到上次程序的數據。因此像要將數據進行持久化的保存,我們就需要使用文件。

🎉二、什么是文件

磁盤(硬盤)上的文件是文件。

但是在設計程序中,我們一般把文件分為兩種:一是程序文件,另一個是數據文件。(從文件功能的角度進行分類)

2.1 程序文件

程序文件包括源程序文件(后綴為.c),目標文件(windows環境后綴為.obj),可執行程序(windows
環境后綴為.exe)。

2.2 數據文件

程序運行時讀寫的數據,比如程序運行需要從中讀取數據的文件,或者輸出內容的文件。

2.3 文件名

文件名包含3部分:文件路徑+文件名主干+文件后綴

例如:c:\code\test.txt

注意:文件標識常被稱為文件名。

🎡三、二進制文件和文本文件

數據在內存中以二進制的形式存儲,如果不加轉換的輸出到外存的文件中,就是二進制文件

如果要求在外存上以ASCII碼的形式存儲,則需要在存儲前轉換。以ASCII字符的形式存儲的文件就是文本文件。

我們以二進制存儲的方式舉例:

int main()
{int a = 10000;FILE * pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//?進制的形式寫到?件中 fclose(pf);pf = NULL;return 0;
}

由于我們是以二進制的存儲方式,因此打開文件的方式也要用二進制的打開方式

在這里插入圖片描述
在這里插入圖片描述
編譯器是以小端存儲且以16進制的方式進行打印

🚀四、文件的打開和關閉

4.1 流和標準流


? 由于我們程序的數據需要輸出到各種外部設備,也需要從外部設備獲取數據,而不同的外部設備的輸入和輸出操作各不相同,因此為了程序員方便操作,抽象出了流的概念,我們可以把流想象成流淌著字符的河。

? C程序針對文件、畫面和鍵盤等的數據輸入和輸出操作都是通過流來進行操作的。

? 一般情況下,我們要想向從流里寫數據,或者從流中讀取數據,都是需要打開流,然后操作。

標準流
為什么我們從鍵盤中輸入數據,向屏幕上輸出數據時,并沒有打開流呢?那是因為C語言程序在啟動的時候,默認打開了3個流:
? stdin - 標準輸入流,在大多數的環境中從鍵盤輸入,scanf函數就是從標準輸入流中讀取數據。
? stdout - 標準輸出流,大多數的環境中輸出至顯示器界面時,printf函數就是將信息輸出到標準輸出流中。
? stderr - 標準錯誤流,大多數環境中輸出到顯示器界面。

4.2 文件指針

緩沖文件系統中,關鍵的概念是 “文件類型指針”,簡稱“文件指針”

每個被使用的文件都在內存中開辟了?個相應的文件信息區,用來存放文件的相關信息(如文件的名字,文件狀態以及文件當前的位置等)。這些信息是保存在?個結構體變量中的。該結構體類型是由系統聲明的,取名FILE

4.3 文件的打開和關閉

文件在讀寫之前應該先打開文件,在使用結束之后應該關閉文件

ANSIC規定使用 fopen 函數來打開文件, fclose 函數來關閉文件。

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

文件的打開模式有很多種,例如:“r” 表示輸入數據,打開一個已經存在的文本文件;“w” 表示輸出數據,打開一個文本文件,若該文件不存在則建立一個新文件;“a” 表示向文本文件末尾添加數據等等,這里就不一一贅述了。

下面我們就以寫的方式舉個例子:

在這里插入圖片描述

🏝?五、文件的順序讀寫

5.1 fgetc (字符輸入函數)

函數形式:int fgetc ( FILE * stream );

該函數成功讀入數據時會返回讀取字符的ASCII值,否則則會返回EOF。

例如:假如.c路徑下有一文件名叫test.txt,該文件中有字符串”abcdef"

在這里插入圖片描述

5.2 fputc (字符輸出函數)

函數形式:int fputc ( int character, FILE * stream );

該函數返回文件指針當前指向的字符,文件指針向后移動一位
如果文件指針位于文件末尾,那么就返回EOF,并為流設置feof的文件結束顯示器
如果文件讀取錯誤,同樣返回EOF,為流設置為錯誤顯示器ferror

例如:向一個文件寫入26個小寫英文字符
在這里插入圖片描述

5.3 fgets (文本行輸入函數)

函數形式:char * fgets ( char * str, int num, FILE * stream );

從流中讀取字符,并以字符串的形式存儲到str中。 直到讀夠(num - 1)個字符,或到達換行符,或讀到文件末尾時才停止

如果讀取成功,則返回str的頭指針,若讀取失敗,則為流設置錯誤顯示器,并返回空指針。

在這里插入圖片描述

5.4 fputs (文本行輸出函數)

函數形式:int fputs ( const char * str, FILE * stream );

將str中的字符串輸出到流中,結束符‘\0’不會被寫入

在這里插入圖片描述

5.5 fscanf (格式化輸入函數)

函數形式:int fscanf ( FILE * stream, const char * format, ... );

以格式化的形式從流中讀取數據

例如:從文件中讀取字符串 “abcd”

在這里插入圖片描述

5.6 fprintf (格式化輸出函數)

函數形式:int fprintf ( FILE * stream, const char * format, ... );

將格式化的數據輸出到指定流。

在這里插入圖片描述

5.7 fread (二進制輸入)

函數形式:size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

二進制的形式從流中讀取count個元素,每個元素的大小為size字節,并將它們存儲在 ptr 指定的內存塊中。

返回成功讀取的元素總數。

在這里插入圖片描述

5.8 fwrite (二進制輸出)

函數形式:size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

二進制的形式將ptr存儲的數據寫入流中,一共寫入count個元素,每個元素的大小為size字節

返回成功寫入的元素總數。

int main()
{int a = 10000;FILE * pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf);//?進制的形式寫到?件中 fclose(pf);pf = NULL;return 0;
}

🎄六、文件的隨機讀寫

6.1 fseek

函數形式:int fseek ( FILE * stream, long int offset, int origin );

offset為偏移量

origin為起始位置,有三種取值:

SEEK_SET:文件頭
SEEK_CUR:文件指針的當前位置
SEEK_END:文件尾

如果成功,則返回0,否則返回非零值

例如:在data.txt文件中有字符串"abcdefghi",從a的位置偏移四位就得到f
在這里插入圖片描述

6.2 ftell

函數形式:long int ftell ( FILE * stream );

返回文件指針相對于起始位置的偏移量

假設.c路徑上的data.txt文件中存儲字符串“abcdefghijk”
在這里插入圖片描述

6.3 rewind

函數形式:void rewind ( FILE * stream );

讓文件指針的位置回到文件起始位置

在這里插入圖片描述

🚆七、文件讀取結束的判定

牢記:在文件讀取過程中,不能用feof函數的返回值直接來判斷文件的是否結束。

feof 的作用是:當文件讀取結束的時候,判斷是讀取結束的原因是否是遇到文件尾結束。

? 文本文件讀取是否結束,判斷返回值是否為 EOF

? fgetc 判斷是否為 EOF

? fgets 判斷返回值是否為 NULL

二進制文件的讀取結束判斷: 判斷返回值是否小于實際要讀的個數

🚘八、文件緩沖區

ANSIC標準采用“緩沖文件系統”來處理的數據文件的,所謂緩沖文件系統,是指系統能自動地在內存中為程序中每?個正在使用的文件開辟?塊“文件緩沖區”。從內存向磁盤輸出數據會先送到內存中的緩沖區,裝滿緩沖區后才?起送到磁盤上。

緩沖區的大小根據C編譯系統決定的。

在這里插入圖片描述
今天的分享到這里就結束了,如果感到對你有所幫助,希望給博主一鍵三連,你的支持就是對博主最大的鼓勵,我們下期再見!

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

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

相關文章

基于web的家政服務網站

內容摘要 由于互聯網的使用,人們在管理、應用、服務等領域使用數據更加簡潔、方便,大大提高了工作效率。互聯網正逐漸融入我們的生活,影響和改變我們的生活。 家政服務管理系統是典型的信息管理系統(MIS)。其開發主要…

【leetcode hot 100 739】每日溫度

解法一&#xff1a;暴力解法 class Solution {public int[] dailyTemperatures(int[] temperatures) {int ntemperatures.length; // 指向要找下一個更高溫度的地方int[] result new int[n];for(int left0;left<n;left){int rightleft1; // 指向正在找最高溫度的地方wh…

藍橋杯C++基礎算法-0-1背包(優化為一維)

這段代碼實現了0-1 背包問題的動態規劃解法&#xff0c;并且使用了滾動數組來優化空間復雜度。以下是代碼的詳細思路解析&#xff1a; 1. 問題背景 給定 n 個物品&#xff0c;每個物品有其體積 v[i] 和價值 w[i]&#xff0c;以及一個容量為 m 的背包。目標是選擇物品使得總價值…

算法 | 麻雀搜索算法原理,公式,改進算法綜述,應用場景及matlab完整代碼

一、麻雀搜索算法(SSA)原理 1. 算法基礎 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一種群體智能優化算法,靈感來源于麻雀群體的覓食與反捕食行為。算法將麻雀分為三類角色:發現者(Producer):適應度最高,負責探索全局最優區域;加入者(Follower)…

SQL 版本歷史

SQL&#xff08;Structured Query Language&#xff09;是一種用于管理和操作關系數據庫的標準語言。SQL標準由多個組織制定和維護&#xff0c;主要包括以下幾個版本&#xff1a; SQL-86 (SQL-87): 這是SQL的第一個官方標準&#xff0c;由ANSI&#xff08;美國國家標準協會&…

CAT1模塊 EC800M HTTP 使用后續記錄

記錄一下 CAT1 模塊EC800 HTTP 使用后續遇到的問題 by 矜辰所致目錄 前言一、一些功能的完善1.1 新的交互指令添加1.2 連不上網絡處理 二、問題出現三、分析及解決3.1 定位問題3.2 問題分析與解決3.2.1 查看變量在內存中的位置 3.3 數據類型說明3.3.1 常用格式化輸出符號…

單純形法之大M法

1. 問題背景與標準化 在求解某些線性規劃問題時&#xff0c;往往難以直接找到初始的基本可行解。特別是當約束中存在等式或 “≥” 類型的不等式時&#xff0c;我們需要引入人工變量來構造一個初始可行解。 考慮如下標準形式問題&#xff08;假設為最大化問題&#xff09;&am…

Springboot集成Debezium監聽postgresql變更

1.創建springboot項目引入pom <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>io.debezium</groupI…

報錯 standard_init_linux.go:228: exec user process caused: exec format error

docker logs 容器名 報錯&#xff1a; standard_init_linux.go:228: exec user process caused: exec format error 或者 standard_init_linux.go:228: exec user process caused: input/output error 排查思路 1、檢查源鏡像的框架是否正確&#xff0c;是否amd64&#x…

Go 代理爬蟲

現在注冊&#xff0c;還送15美金注冊獎勵金 --- 亮數據-網絡IP代理及全網數據一站式服務商 使用代理服務器&#xff0c;通過 Colly、Goquery、Selenium 進行網絡爬蟲的基礎示例程序 本倉庫包含兩個分支&#xff1a; basic 分支包含供 Go Proxy Servers 這篇文章改動的基礎代碼…

STM32實現智能溫控系統(暖手寶):PID 算法 + DS18B20+OLED 顯示,[學習 PID 優質項目]

一、項目概述 本文基于 STM32F103C8T6 單片機&#xff0c;設計了一個高精度溫度控制系統。通過 DS18B20 采集溫度&#xff0c;采用位置型 PID 算法控制 PWM 輸出驅動 MOS 管加熱Pi膜&#xff0c;配合 OLED 實時顯示溫度數據。系統可穩定將 PI 膜加熱至 40℃&#xff0c;適用于…

neo4j知識圖譜常用命令

1. 查看所有節點和關系 如果你想查看圖數據庫中的所有節點和關系&#xff0c;可以使用以下查詢&#xff1a; Cypher 深色版本 MATCH (n)-[r]->(m) RETURN n, r, m n 和 m 表示節點。r 表示兩個節點之間的關系。這條命令會返回所有節點及其直接相連的關系。 2. 查看所有節…

從零開始:使用Luatools工具高效燒錄Air780EPM核心板項目的完整指南

本文將深入講解如何使用Luatools工具燒錄一個具體的項目到Air780EPM開發板中。如何使用官方推薦的Luatools工具&#xff08;一款跨平臺、命令行驅動的燒錄利器&#xff09;&#xff0c;通過“環境配置→硬件連接→參數設置→一鍵燒錄”四大步驟&#xff0c;幫助用戶實現Air780E…

2024年認證杯SPSSPRO杯數學建模C題(第二階段)云中的海鹽全過程文檔及程序

2024年認證杯SPSSPRO杯數學建模 C題 云中的海鹽 原題再現&#xff1a; 巴黎氣候協定提出的目標是&#xff1a;在2100年前&#xff0c;把全球平均氣溫相對于工業革命以前的氣溫升幅控制在不超過2攝氏度的水平&#xff0c;并為1.5攝氏度而努力。但事實上&#xff0c;許多之前的…

大疆上云api介紹

概述 目前對于 DJI 無人機接入第三方云平臺,主要是基于 MSDK 開發定制 App,然后自己定義私有上云通信協議連接到云平臺中。這樣對于核心業務是開發云平臺,無人機只是其中一個接入硬件設備的開發者來說,重新基于 MSDK 開發 App 工作量大、成本高,同時還需要花很多精力在無人…

云原生之開源遙測框架OpenTelemetry(在 Gin 框架中使用 OpenTelemetry 進行分布式追蹤和監控)

文章目錄 云原生之開源遙測框架OpenTelemetry背景什么是可觀測性&#xff1f; 什么是 OpenTelemetry&#xff1f;Opentelemetry的主要優勢有以下幾點&#xff1a;理解分布式鏈路日志Spans分布式鏈路 在 Gin 框架中使用 OpenTelemetry 進行分布式追蹤和監控0. 整體思路1. 初始化…

【藍橋杯速成】| 11.回溯 之 子集問題

題目一&#xff1a;子集 問題描述 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 給你一個整數數組 nums &#xff0c;數組中的元素 互不相同 。返回該數組所有可能的子集&#xff08;冪集&#xff09;。 解集 不能 包含重復的子集。你可以按 任意順序 返回解集。 示例…

Nginx目錄結構

Nginx目錄結構 ? Nginx 的安裝目錄結構可能會因安裝方式&#xff08;如使用包管理器、源碼編譯等&#xff09;和操作系統的不同而有所差異。以下是通過在線安裝時&#xff0c;Nginx 默認的目錄結構&#xff0c;以及各目錄和文件的作用。 yum install nginx查詢nginx [rootRo…

2.(vue3.x+vite)使用vue-router

前端技術社區總目錄(訂閱之前請先查看該博客) 效果預覽 路由配置的“/”與“helloWorld”都可以訪問到以下內容 http://10.11.0.87:4000/#/ http://10.11.0.87:4000/#/helloWorld 1:安裝vue-router npm i vue-router 2:創建router文件 在src的目錄下創建router文件夾…

后端返回了 xlsx 文件流,前端怎么下載處理

當后端返回一個 .xlsx 文件流時&#xff0c;前端可以通過 JavaScript 處理這個文件流并觸發瀏覽器下載。 實現步驟 發送請求獲取文件流&#xff1a; 使用 fetch 或 axios 等工具向后端發送請求&#xff0c;確保響應類型設置為 blob&#xff08;二進制數據流&#xff09;。 創建…