前言:為什么要使用文件
使用文件可以讓程序在不同運行之間保存和讀取數據。這樣可以實現持久化存儲,即使程序關閉后數據也不會丟失。文件也可以用于數據交換,允許不同程序之間共享信息。在 C 語言中,文件還可以用于讀取配置信息,日志記錄等。當你玩電腦游戲時,游戲通常會讓你保存進度。這就好比把游戲狀態保存到一個文件中,這樣你可以在之后重新加載游戲而不會丟失進度。另外,想象一下你在做一份報告,你可以把報告內容保存到文件中,這樣即使你關掉電腦,文件中的內容也會被保存下來,以便你之后再次打開并繼續編輯。文件就像是一個存儲盒,可以把數據放進去,然后在需要的時候再取出來使用。總的來說,文件在編程中是非常重要的,可以幫助程序處理數據和信息。
文件的定義
文件是計算機存儲數據的一種方式,可以存儲文本、圖像、音頻、視頻等各種類型的信息。在計算機中,文件通常被組織成一個由字節組成的序列,每個文件都有一個唯一的名稱用于標識。文件可以存儲在計算機的硬盤、固態硬盤、光盤、U盤等存儲介質上。
分類:
從文件功能的角度分為兩類:程序文件,數據文件。
程序文件:
程序文件是計算機中用來存儲軟件程序代碼的文件。程序文件可以包含各種編程語言編寫的指令和數據,用于告訴計算機如何執行特定的任務或操作。
程序文件通常也具有特定的文件擴展名或后綴,以便操作系統和用戶能夠識別它們并正確地處理。這些后綴通常指示了程序文件的類型或格式。例如:
- 可執行程序文件通常以.exe、.app、.bat等結尾。
- 腳本文件通常以.sh、.py、.js等結尾。
- 動態鏈接庫文件通常以.dll、.so等結尾。
- Java程序文件通常以.jar、.class等結尾。
- HTML網頁文件通常以.html、.htm結尾。
數據文件:
數據文件是計算機中用來存儲各種類型數據的文件。這些數據可以是文本、圖像、音頻、視頻、數據庫記錄等。數據文件通常以特定的格式存儲,以便計算機能夠正確地讀取和解釋其中的信息。這些文件可以通過各種應用程序進行創建、編輯和訪問,以便用戶能夠查看、修改和管理其中的數據。
數據文件通常具有特定的文件擴展名或后綴,以便操作系統和應用程序能夠識別它們并正確地處理。這些后綴通常指示了數據文件的類型或格式。例如:
- 文本文件通常以.txt、.doc、.pdf等結尾。
- 圖像文件通常以.jpg、.png、.gif等結尾。
- 音頻文件通常以.mp3、.wav、.flac等結尾。
- 視頻文件通常以.mp4、.avi、.mov等結尾。
- 數據庫文件通常以.db、.mdb、.sql等結尾。
文件名
假設你有一個名為"mydocument.docx"的文件,它存儲在Windows操作系統的C盤的Documents文件夾中。在這種情況下,文件名的各部分如下:
- 文件路徑:C:\Documents\
- 文件名主干:mydocument
- 文件后綴:.docx
C:\Documents\mydocument.docx
二進制文件和文本文件
根據數據的組織形式,數據文件被稱為文本文件或者二進制文件。
二進制文件:數組在內存中以二進制的形式存儲,不加轉換的輸出到外存。
文本文件:以ASCLL字符的形式存儲的文件。
示例:
#include<stdio.h>
int main()
{// 定義一個整型變量a,賦值為10000int a = 10000;// 打開一個名為test.txt的文件,以二進制寫入模式打開FILE* pf = fopen("test.txt", "wb");// 將變量a的內容以二進制形式寫入到文件中fwrite(&a, 4, 1, pf);// 關閉文件fclose(pf);// 將文件指針置為空pf = NULL;// 返回0,表示程序正常結束return 0;
}
?這段代碼的功能是將整數變量a的值10000以二進制形式寫入到名為test.txt的文件中。具體來說,它通過fopen
函數以二進制寫入模式打開文件,然后使用fwrite
函數將整數a的二進制表示寫入到文件中,最后使用fclose
關閉文件。
效果演示:
1.運行完程序后,返回解決方案資源管理器。
找到源文件,添加,現有項
2.點開, 找到test文件,雙擊test文件。
3,回到解決方案中,?此時,已經出現了test.txt文件,右鍵此文件,找到打開方式,選擇二進制編譯器,確定
4.得到結果,觀察二進制文件。
?
?流和標準流
在C語言中,流(stream)是一個用于輸入和輸出的抽象概念。它提供了一種統一的方式來處理不同類型的輸入和輸出,包括文件、鍵盤、屏幕和其他設備。
你可以把它想象成水流。就像水流可以從一個地方流向另一個地方一樣,流在計算機編程中也是用于數據的流動。
標準流
C語言中有三個標準流:
- 標準輸入流(stdin):?用于從鍵盤或其他輸入設備讀取數據。在C語言中,
scanf
函數就是從標準輸入流中讀取數據的一個例子。 - 標準輸出流(stdout):?用于向屏幕或其他輸出設備輸出數據。在C語言中,
printf
函數就是向標準輸出流輸出數據的一個例子。 - 標準錯誤流(stderr):?用于向屏幕或其他輸出設備輸出錯誤信息。在C語言中,
fprintf
函數可以向標準錯誤流輸出數據。
stdin、stdout、stderr三個流的類型是:FILE*,通常稱為文件指針。
C語言中,就是通過FILE*的文件指針來維護流的各種操作的。
文件指針
文件指針是C語言中用于處理文件的重要概念。它是一個指向FILE類型的指針,FILE類型是C語言標準庫中用于表示文件的結構體類型。
例如:VS2022編譯器環境下提供的stdio.h頭文件中,有以下的文件類型聲明:
typedef struct
{int _Placeholder;
} fpos_t;typedef struct
{unsigned int _Mode;
} _fmode_t;typedef struct
{long long _Placeholder;
} fpos64_t;typedef struct _iobuf
{char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;
} FILE;typedef struct _wfinddata_t
{unsigned attrib;time_t time_create;time_t time_access;time_t time_write;_fsize_t size;wchar_t name[260];
} _wfinddata_t;typedef struct _wfinddatai64_t
{unsigned attrib;__time64_t time_create;__time64_t time_access;__time64_t time_write;__int64 size;wchar_t name[260];
} _wfinddatai64_t;typedef struct _wfinddata32_t
{unsigned attrib;time_t time_create;time_t time_access;time_t time_write;unsigned long size;wchar_t name[260];
} _wfinddata32_t;typedef struct _wfinddata32i64_t
{unsigned attrib;__time64_t time_create;__time64_t time_access;__time64_t time_write;unsigned __int64 size;wchar_t name[260];
} _wfinddata32i64_t;
文件的關閉和打開:
打開文件
要使用文件指針,首先需要打開文件。可以使用fopen
函數來打開文件,該函數會返回一個指向FILE類型的指針,表示打開的文件。fopen
函數的原型如下:
FILE *fopen(const char *filename, const char *mode);
其中,filename
是要打開的文件名,mode
表示文件的打開模式,比如讀取、寫入、追加等。
?文件指針的位置
文件指針指示了文件中當前的位置,它可以在文件中移動,以便進行讀取或寫入操作。可以使用fseek
函數來移動文件指針的位置:
int fseek(FILE *stream, long offset, int origin);
其中,stream
是文件指針,offset
是偏移量,origin
表示起始位置,可以是SEEK_SET
(文件開頭)、SEEK_CUR
(當前位置)或SEEK_END
(文件末尾)。?
讀寫文件?
一旦文件被打開,就可以使用文件指針進行讀取和寫入操作。比如,可以使用fscanf
和fprintf
函數進行格式化的輸入和輸出,或者使用fread
和fwrite
函數進行二進制數據的讀寫操作。?
關閉文件
在文件操作完成后,應該使用fclose
函數關閉文件,釋放文件資源:
int fclose(FILE *stream);
示例
下面是一個示例,演示了如何使用文件指針來打開文件、寫入數據并關閉文件:
#include <stdio.h>int main()
{FILE *fp;fp = fopen("example.txt", "w"); // 以寫入模式打開文件if (fp != NULL) {fprintf(fp, "This is a file created using file pointers!"); // 寫入數據fclose(fp); // 關閉文件}return 0;
}
?
下一章節,講文件的讀寫順序,等各種順序讀寫函數。
?