【C語言】—— 文件操作(上)

【C語言】—— 文件操作(上)

  • 一、 為什么使用文件
  • 二、 什么是文件
    • 2.1、 程序文件
    • 2.2、 數據文件
    • 2.3、 文件名
    • 2.4、二進制文件與文本文件
  • 三、 文件的打開和關閉
    • 3.1、流和標準流
      • (1)流
      • (2)標準流
    • 3.2、文件指針
  • 四、文件的打開和關閉

一、 為什么使用文件

??我們為什么要使用文件呢?回答這個問題之前,我們先來看一段代碼:

#include<stdio.h>int main()
{int n = 0;scanf("%d", &n);printf("%d\n", n);return 0;
}

??這段代碼創建了一個變量 n n n,當程序運行時,我們輸入一個值(比如說 10 )存在變量 n n n 中,當我們下一次運行程序時,這個10 不見了,它的值又恢復到 0,我們又得重新輸入一個值。

??原來,像 n n n 這樣的變量是在內存里創建的,當程序結束時,剛剛申請的 4 個字節又還給了操作系統,當程序再次運行時, n n n中的值依然是 0

??因此,如果將數據存在內存中,當程序結束,下次再運行時,這個值就不見了,它無法持久化地保存起來

??怎么辦呢?

??這時我們想,如果我們在電腦上創建了一個文件,文件中存這一個 10。這個文件是放在硬盤上的(比如C盤、E盤)。這即使把電腦關機,下次打開里面依然存的是 10。

??這是因為,當我們把數據放在文件中,即硬盤上時,這些數據持久化地保存下來。而相對的,放在內存中數據只要程序退出,數據就丟失

??因此當我們想把數據持久化地保存下來時,就需要文件

??

二、 什么是文件

??硬盤(磁盤)上的文件就是文件
??但是在程序設計中,我們一般談的文件有兩種:程序文件數據文件(從文件功能的角度分類)
??

2.1、 程序文件

??所謂的程序文件就是我們寫出來的代碼,程序文件包括源程序文件(后綴文 . c .c .c),目標文件 w i n d o w s windows windows 環境后綴為 . o b j .obj .obj),可執行程序 w i n d o w s windows windows環境后綴為 . e x e .exe .exe

在這里插入圖片描述

??

2.2、 數據文件

??什么是數據文件呢?當我們寫程序,從某一個文件中讀取數據;或者把一些數據寫到文件中,這種文件就稱為數據文件

??本章我們討論的內容主要是數據文件

??在之前的學習中,我們所處理的輸入輸出都是以終端為對象的,即:從終端的鍵盤輸入數據,運行結果顯示到顯示器(屏幕)上。

??其實有時候我們會把信息輸出到磁盤上,當需要的時候再從磁盤上把數據讀取到內存中使用,這里處理的就是磁盤上的文件
??

2.3、 文件名

??一個文件要有唯一標識,以便用戶識別和引用
??文件名包含 3 部分:文件路徑+文件名主干+文件后綴

??如:c:\code\test.txt

  • c:\code\ 為文件路徑
  • t e s t test test 為文件名主干
  • t x t txt txt 為文件后綴

??

2.4、二進制文件與文本文件

??根據文件的組織形式,數據文件一般被稱為文本文件二進制文件

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

??前面曾提到的 . o b j .obj .obj文件就是一種 二進制文件,通過文本編輯器打開是一堆亂碼,我們是看不懂的

在這里插入圖片描述

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

在這里插入圖片描述

??
??那么一個數據在文件中是如何存儲的呢?
??字符一律以 A S C I I ASCII ASCII形式存儲,數值型數據及可以用 A S C I I ASCII ASCII形式存儲,也可以使用二進制形式存儲。

??什么意思呢?假設現在有一個整數 10000:
??如果以 A S C I I ASCII ASCII 碼的形式存儲,則磁盤中占用 5 個字節(一個字符一個字節):一個字符 ‘1’,四個字符 ‘0’
??如果以二進制的形式存儲,磁盤上只占4個字節(一個整型)
??

在這里插入圖片描述

??而以 A S C I I ASCII ASCII形式存儲則為文本文件;以二進制形式存儲則為二進制文件
??
測試代碼:

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

??這段代碼可能有些看不懂,但是沒關系,我們只需知道其大致意思即可:這段代碼就是將 10000 以二進制的形式寫到文件中

??執行程序后,我們直接打開文件:

在這里插入圖片描述

??
??我們再通過二進制的形式打開文件

在這里插入圖片描述

VS上打開二進制文件的方法

?

在這里插入圖片描述

10000 在二進制文件中

?
??那 10 和 27 又是什么意思呢?其實就是 0001 0000 和 0010 0111 的十六進制表示,同時,因為是小端字節序存儲,因此存儲時反過來的。
??

三、 文件的打開和關閉

3.1、流和標準流

(1)流

??我們程序的數據要輸出到各種外部設備(屏幕、硬盤、U盤、網絡上),也需要從外部設備(鍵盤、文件、網絡上、U盤)獲取數據,不同的外部設備的輸入輸出的操作各不相同,為了方便程序員對各種設備進行方便操作,我們抽象出 的概念,我們可以把流想象成流淌著數據的河

??沒有流,程序員就要學會如何從各種不同的設備上輸入輸出數據,而有了流,程序員只需知道如何將數據從流中取出和寫入流即可,至于流如何與外部設備之間進行交流,我們并不關心,這是C語言底層和操作系統要關系的事情。這樣大大簡化了程序員學習編程的難度

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

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

??進行文件操作,打開文件其實就是打開流,然后再對流進行讀寫
?

(2)標準流

??那為什么我們從鍵盤輸入數據,向屏幕上輸出數據,并沒有打開流呢?
??那是因為C語言程序在啟動的時候,默認打開了 3 個流

  • stdin(標準輸入流):在大多數的環境中從鍵盤輸入 s c a n f scanf scanf 函數就是從標準輸入流中讀取數據。
  • stdout(標準輸出流):大多數的環境中輸出至顯示器界面 p r i n t f printf printf函數就是將信息輸出到標準輸出流中。
  • stderr(標準錯誤流):大多數環境中輸出到顯示器界面

??這是默認打開了的三個流,我們使用 s c a n f scanf scanf p r i n t f printf printf 等函數就可以直接進行輸入輸出操作的。

?? s t d i n stdin stdin s t d o u t stdout stdout s t d e r r stderr stderr 三個流的類型是: F I L E FILE FILE* ,通常稱為文件指針

??C語言中,就是通過 F I L E FILE FILE* 的文件指針來維護流的各種操作

??

3.2、文件指針

??在緩沖文件系統中,關鍵的概念是“文件類型指針”,簡稱 文件指針
??
??每一個被使用的文件都在內存中開辟了一個相應的文件信息區,用來存儲文件的相關信息(如文件的名字,文件狀態及文件當前的位置等)。這些信息是保存在一個結構體變量中的。該結構體類型是有系統聲明的,取名 F I L E FILE FILE
??
??例如在VS2013編譯器環境提供的 s t d i o . h stdio.h stdio.h 頭文件中有以下的文件類型聲明:

struct _iobuf {char* _ptr;int _cnt;char* _base;int _flag;int _file;int _charbuf;int _bufsiz;char* _tmpfname;};typedef struct _iobuf FILE;

??
??不同的編譯器的 F I L E FILE FILE 類型包含的內容不完全相同,但是大同小異。

??每當打開一個文件的時候,系統會根據文件的情況自動創建一個FILE結構的變量,并填充其中的信息,使用者不必關系細節。

??一般都是通過一個 F I L E FILE FILE 指針來維護這個FILE結構的變量,這樣使用起來更加方便。

??下面我們可以創建一個 F I L E FILE FILE *的指針變量
??

FILE* pf;

??
??定義 p f pf pf 是一個指向 F I L E FILE FILE 類型數據的指針變量。可以使 p f pf pf指針指向某個文件信息區(是一個結構體變量)。通過該文件信息區中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠簡潔找到與它關聯的文件
??

在這里插入圖片描述

??

四、文件的打開和關閉

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

??在編寫程序的時候,在打開文件的同時,都會返回一個 FILE* 指針變量指向該文件,也相當于建立了指針和文件的關系。

?? A N S I ANSI ANSI? C C C規定使用 f o p e n fopen fopen函數來打開文件, f c l o s e fclose fclose函數來關閉文件。

在這里插入圖片描述

f o p e n fopen fopen 函數(打開文件)

?

  • 如果文件打開成功,返回一個FILE* 指針,打開失敗則返回空指針
  • f i l e n a m e filename filename 表示要打開的文件名,其應符合文件的命名規范,可以包含文件路徑
  • m o d e mode mode 表示文件的打開模式,下面都是文件的打開模式
    ?
文件使用方式含義如果指定文件不存在
“r” (只讀)為了輸入數據,打開一個已經存在的文本文件出錯
“w” (只寫)為了輸入輸出數據,打開一個文本文件建立一個新的文件
“a”(追加)向文本文件尾添加數據建立一個新的文件
“rb”(只讀)為了輸入數據,打開一個二進制文件出錯
“wb”(只寫)為了輸出數據,打開一個二進制文件建立一個新的文件
“ab”(追加)向一個二進制文件尾添加數據建立一個新的文件
“r+”(讀寫)為了讀和寫,打開一個新的文件出錯
“w+”(讀寫)為了讀和寫,創建一個新的文件建立一個新的文件
“a+”(讀寫)打開一個文件,在文件尾進行讀寫建立一個新文件
“rb+”(讀寫)為了讀和寫,打開一個二進制文件出錯
“wb+”(讀寫)為了讀和寫,創建一個新的二進制文件建立一個新的文件
“ab+”(讀寫)打開一個未禁止文件,在文件尾進行讀和寫建立一個新的文件

??注:“ w w w”(只寫)會將原文件的內容全部清空,再從第一位開始寫入數據;“a”(追加) 是從文件末尾開始追加
??

在這里插入圖片描述

f c l o s e fclose fclose 函數(關閉文件)

??使用 f c l o s e fclose fclose 函數將文件關閉后,要將該文件指針置空(如 f r e e free free 函數一樣)
??
??
??可能有些小伙伴對輸入輸出的關系還有些糊涂,我們可以來看下面一張圖

在這里插入圖片描述

??其實,究竟是輸入還是輸出,應該站在程序的角度分析程序從外界獲取數據,是輸入;程序向外輸出數據,是輸出。

??
下面,我們先來嘗試打開和關閉一個文件

#include<stdio.h>int main()
{FILE* pf = NULL;//打開文件pf = fopen("test.txt", "r");//文件操作if (NULL == pf){perror("fopen fail");return 1;}//讀文件//關閉文件fclose(pf);pf = NULL;
}
  • 前面曾提到,文件打開失敗時, f o p e n fopen fopen 函數會返回一個空指針,因此使用 f o p e n fopen fopen 函數打開一個文件,要對其返回值進行判斷
  • r e t u r n return return 1 :表示的是程序異常,提前結束程序,正常結束時返回0
  • 使用 f c l o s e fclose fclose 函數將文件關閉,別忘了將指針置空,如同 f r e e free free函數一樣。
    ??
    ??
    未完待續······

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

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

相關文章

64.函數參數和指針變量

目錄 一.函數參數 二.函數參數和指針變量 三.視頻教程 一.函數參數 函數定義格式&#xff1a; 類型名 函數名(函數參數1,函數參數2...) {代碼段 } 如&#xff1a; int sum(int x&#xff0c;int y) {return xy; } 函數參數的類型可以是普通類型&#xff0c;也可以是指針類…

Python可實現各種算法庫之algorithms使用詳解

概要 在軟件開發和計算機科學領域,算法是解決問題的核心工具。Python 作為一種廣泛使用的編程語言,提供了多種內置和第三方庫來實現各種算法。algorithms 庫是一個集合了多種常用算法和數據結構的 Python 庫,旨在幫助開發者快速實現和應用這些算法。本文將詳細介紹 algorit…

QT元對象系統的用法技巧

文章目錄 聲明對象屬性獲取對象的屬性和方法通過對象名稱查找對象判斷對象的繼承關系給類添加額外的信息Qt的元對象系統是Qt框架的一個核心特性,它為對象提供了運行時類型信息、屬性系統、信號和槽機制以及動態屬性功能。這個系統是由Qt的元對象編譯器(MOC)支持的,MOC是一個預…

代碼隨想錄-DAY②-數組——leetcode 977 | 209

977 思路 使用兩個指針分別指向位置 0 和 n?1&#xff0c;每次比較兩個指針對應的數&#xff0c;選擇較大的那個逆序放入答案并移動指針。這種方法無需處理某一指針移動至邊界的情況。 時間復雜度&#xff1a;O(n) 空間復雜度&#xff1a;O(1) 代碼 class Solution { pub…

SpringCloud Feign 報錯 Request method ‘POST‘ not supported 的解決辦法

通過SpringCloud Feign 調用其他項目或微服務的接口方法時報Request method ‘POST‘ not supported 的錯誤&#xff1a; 問題出現原因&#xff1a; 可能的原因是 Feign 默認使用的請求方法為 POST&#xff0c;而不是 GET。另外也有可能是由于消費方法和接口方法使用的注解不…

拼多多店鋪電話采集軟件使用步驟解析

要快速訪問拼多多店鋪鏈接&#xff0c;可以使用一個提供快速訪問功能的拼多多店鋪鏈接程序。以下是使用步驟的簡要解析&#xff1a; 下載和安裝程序&#xff1a;首先&#xff0c;在可靠的下載平臺或官方網站上下載并安裝拼多多店鋪鏈接程序。確保選擇一個可信賴的程序&#xff…

Dialog設置背景透明和尺寸

class TestDialog(context: Context?,var clickListener: OnClickCallBack) : Dialog(context!!) {lateinit var binding:TestDialogBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding TestDialogBinding.inflate(Lay…

軟件測試面試題:Redis的五種數據結構,以及使用的場景是什么?

字符串&#xff08;Strings&#xff09;&#xff1a;簡單直接&#xff0c;就像記事本一樣&#xff0c;用來存儲和快速訪問簡單的數據&#xff0c;比如緩存網頁或者保存用戶會話信息。 列表&#xff08;Lists&#xff09;&#xff1a;有序的數據集合&#xff0c;適合用來存儲按…

Ollama基于Casaos一鍵部署,并接入Dify知識庫,無需再為API付費

什么是Ollama Ollama是一個開源的大型語言模型服務工具&#xff0c;它幫助用戶快速的運行大模型。浪浪云將它做為一鍵部署通過簡單的安裝&#xff0c;用戶可以執行一條命令就可以運行開源大型語言模型&#xff0c;如 llama3 ,通以千問。極大地簡化了部署和管理LLM的過程&#x…

modelscope可控細節的長文檔摘要

modelscope可控細節的長文檔摘要嘗試 本文的想法來自今年OpenAI cookbook的一篇實踐&#xff1a;summarizing_long_documents&#xff0c;目標是演示如何以可控的細節程度總結大型文檔。 如果我們想讓大語言模型總結一份長文檔&#xff08;例如 10k 或更多tokens&#xff09;&…

6個步驟實現Postman接口壓力測試(建議收藏)

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 這里講是postman做接口并發測試&#xff0c;基礎用法不做贅述 1、第一步接口可以通的情況下點擊…

Proteus-51單片機-DS18B20多點測溫

DS18B20多點測溫 一、Proteus仿真演示 每個DS18B20都有一個唯一的64位序列號,這使得在同一總線上可以掛載多個傳感器,無需額外的地址分配。主機(通常為單片機)通過特定的時序控制,可以依次讀取各個DS18B20的溫度數據,實現分布式測溫。 二、代碼特點 三、開發環境介紹 本…

基于Arduino平臺開源小車的初步使用體驗

創作原因&#xff1a;偶然有機會接觸到基于Arduino平臺的開源智能小車&#xff0c;初步使用后與大家分享。因使用時間不常&#xff0c;可以純當個樂子看看&#xff0c;感謝大家的閱讀&#xff01; 圖&#xff1a;一款基于Arduino平臺的開源小車 一、開發環境 Misly&#xff1…

el表達式筆記及ognl

文章目錄 spel底層spel核心代碼TokenKind源碼 spel本地調試 spel示例spel list例子spel 對象例子spel list例子SimpleEvaluationContext 類找不到##### spel 如何表示包含(也就是like)? spel官網文檔 ognl表達式ognl和表達式語言的區別 這里重點說下SPEL(Spring Expression La…

shark云原生-日志體系-filebeat高級配置(適用于生產)

文章目錄 1. filebeat.inputs 靜態日志收集器2. filebeat.autodiscover 自動發現2.1. autodiscover 和 inputs2.2. 如何配置1.2.1. Providers 提供者1.2.2. Providers kubernetes templates1.2.3. 基于提示&#xff08;hints&#xff09;的自動發現支持的 **hints**的完整列表&…

windows搭建mqtt服務器,并配置DTU收集傳感器數據

1.下載并安裝emqx服務器 參考&#xff1a;Windows系統下本地MQTT服務器搭建&#xff08;保姆級教程&#xff09;_mqtt windows-CSDN博客 這里我下載的是emqx-5.3.0-windows-amd64.zip版本 下載好之后&#xff0c;放到服務器的路徑&#xff0c;我這里放的地方是&#xff1a;C…

腦啟發設計:人工智能的進化之路

編者按&#xff1a;你可以用左手&#xff08;不常用的那只手&#xff09;的小指與食指拿起一件物品么&#xff1f; 試完你是不是發現自己竟然可以毫不費力地用自己不常用的手中&#xff0c;兩根使用頻率相對較低的手指&#xff0c;做一個不常做的動作。這就是人類大腦不可思議…

如何聲明一個類?類如何繼承?

要聲明一個類&#xff0c;需要使用關鍵字class&#xff0c;后面跟著類名。類名通常以大寫字母開頭。類的聲明通常包括類的成員變量和成員函數。 類可以通過繼承來擴展現有的類。要讓一個類繼承另一個類&#xff0c;需要使用冒號&#xff08;:&#xff09;并在后面跟著父類的名…

等保2.0中,云計算平臺如何做到數據的分類和加密?

數據分類 在等保2.0中&#xff0c;數據分類是確保數據安全的首要步驟。云計算平臺需要根據數據的敏感性和重要性進行分類&#xff0c;以便采取相應的保護措施。數據分類通常包括以下幾個步驟&#xff1a; 數據識別&#xff1a;識別出哪些數據是需要保護的&#xff0c;這可能包…

py黑帽子學習筆記_burp

配置burp kali虛機默認裝好了社區版burp和java&#xff0c;其他os需要手動裝 burp是用java&#xff0c;還得下載一個jython包&#xff0c;供burp用 配apt國內源&#xff0c;然后apt install jython --download-only&#xff0c;會只下載包而不安裝&#xff0c;下載的目錄搜一…