文章目錄
- 前言
- 文件概念
- 文件名
- 數據文件&程序文件
- 文本文件&二進制文件
- 文件緩沖區
- 文件操作
- FILE結構體
- 文件指針
- 文件打開&關閉
- 文件輸入/輸出
- 文件指針控制
前言
主要需要看的是概念部分、以及FILE結構體、文件指針部分。其余函數使用,知道其功能存在即可,實際在使用到這些函數時去官方文檔查的話,不管是介紹還是示例都更齊全。
文件概念
文件名
完整文件名包含三部分:文件路徑+文件名主干+文件后綴
c:\md\test.txt
文件名在同一臺主機中是唯一的。
數據文件&程序文件
根據用途劃分:
-
程序文件
程序文件是包含計算機程序代碼的文件,它包含了一系列指令和命令,用于告訴計算機如何執行特定的任務。程序文件通常以可執行文件(如.exe、.app等)或源代碼文件(如.c、.py等)的形式存在。它們可以被計算機加載和執行,從而實現特定的功能或任務。 -
數據文件
數據文件是存儲實際數據的文件,它包含了計算機程序需要處理的信息。數據文件可以是文本文件(如.txt、.csv等)或二進制文件(如.jpg、.mp3等),其中包含了具體的數據內容。數據文件可以包含文本、數字、圖像、音頻、視頻等各種類型的數據,這些數據可以被程序文件讀取和處理。
文本文件&二進制文件
根據數據儲存形式劃分
- 內存中文件是二進制文件
- 文本文件以ASCII字符形式存儲
- 二進制文件以二進制形式存儲
文件緩沖區
ANSIC 標準采用“緩沖文件系統”處理的數據文件的,所謂緩沖文件系統是指系統自動地在內存中為程序中每一個正在使用的文件開辟一塊“文件緩沖區”。從內存向磁盤輸出數據會先送到內存中的緩沖區,裝滿緩沖區后才一起送到磁盤上。如果從磁盤向計算機讀入數據,則從磁盤文件中讀取數據輸入到內存緩沖區(充滿緩沖區),然后再從緩沖區逐個地將數據送到程序數據區(程序變量等)。緩沖區的大小根據C編譯系統決定的。 文件緩沖區存在的意義是同過減少IO次數提高文件操作整體的效率。
文件操作
FILE結構體
FILE 結構體的定義:
struct _iobuf {char *_ptr; // 文件指針int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE
當使用者打開一個文件的時候,OS就會自動創建該文件的FILE類型變量,通過FILE的定義,可以理解該FILE類型記錄了該文件的信息,故用戶可以使用FILE類型變量的指針對FILE變量進行操作,從而達到對打開的文件進行操作的目的。例:
FILE* fp = fopen ( const char * filename, const char * mode ); // 后續用fp指針操作即可
文件指針
文件指針是FILE結構體中的一個屬性。
文件指針在讀取一個字符后會向后移動一位,說明文件指針是可以指向文件信息區的各個部分的,可受使用者通過函數調整位置從而進行不同讀取/寫入策略的。(和數組的指針相比邏輯差不多,操作方法不一樣)
文件打開&關閉
文件打開后必須關閉,否則會造成系統資源浪費。
//打開文件函數
FILE * fopen ( const char * filename, const char * mode );
//關閉文件函數
int fclose ( FILE * stream )
FILE * fopen ( const char * filename, const char * mode ) mode參數 模式 :
“r” (只讀) 為了輸入數據,打開一個已經存在的文本文件
“w” (只寫) 為了輸出數據,打開一個文本文件 建立一個新的文件
“a” (追加) 向文本文件尾添加數據 建立一個新的文件
“rb” (只讀) 為了輸入數據,打開一個二進制文件 出錯
“wb” (只寫) 為了輸出數據,打開一個二進制文件 建立一個新的文件
“ab” (追加) 向一個二進制文件尾添加數據 出錯
“r+” (讀寫) 為了讀和寫,打開一個文本文件 出錯
“w+” (讀寫) 為了讀和寫,建議一個新的文件 建立一個新的文件
“a+” (讀寫) 打開一個文件,在文件尾進行讀寫 建立一個新的文件
“rb+”(讀寫) 為了讀和寫打開一個二進制文件 出錯
“wb+”(讀寫) 為了讀和寫,新建一個新的二進制文件 建立一個新的文件
“ab+”(讀寫) 打開一個二進制文件,在文件尾進行讀和寫 建立一個新的文件
文件輸入/輸出
字符輸入函數 fgetc 所有輸入流
字符輸出函數 fputc 所有輸出流
文本行輸入函數 fgets 所有輸入流
文本行輸出函數 fputs 所有輸出流
格式化輸入函數 fscanf 所有輸入流
格式化輸出函數 fprintf 所有輸出流
二進制輸入 fread 文件
二進制輸出 fwrite 文件`
例:
#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r"); // 打開文件if (file == NULL) {printf("無法打開文件\n");return 1;}int ch;while ((ch = fgetc(file)) != EOF) { // 逐個字符讀取文件內容printf("%c", ch);}fclose(file); // 關閉文件return 0;
}
文件指針控制
(文件隨機讀寫)
fseek
功能:根據文件指針的位置和偏移量來定位文件指針。
函數原型為:
int fseek(FILE *stream, long int offset, int origin);
參數說明:
stream:指定要設置位置的文件指針。
offset:設置的偏移量,即要移動的字節數。
origin:設置基準位置,可以取以下值:
SEEK_SET:從文件開頭開始計算偏移量。
SEEK_CUR:從當前位置開始計算偏移量。
SEEK_END:從文件末尾開始計算偏移量。
返回值:
如果成功設置文件指針的位置,則返回0;
如果發生錯誤,則返回非零值。
使用示例:
#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r"); // 打開文件if (file == NULL) {printf("無法打開文件\n");return 1;}fseek(file, 5, SEEK_SET); // 設置文件指針位置為從文件開頭偏移5個字節int ch;while ((ch = fgetc(file)) != EOF) { // 從當前位置開始讀取文件內容printf("%c", ch);}fclose(file); // 關閉文件return 0;
}
ftell
**功能:**返回文件指針相對于起始位置的偏移量
long int ftell(FILE *stream);
參數說明:
stream:指定要獲取位置的文件指針。
返回值:
如果成功獲取文件指針的當前位置,則返回當前位置相對于文件開頭的偏移量(以字節為單位);
如果發生錯誤,則返回-1。
rewind
功能:
讓文件指針的位置回到文件的起始位置
函數原型為:
void rewind(FILE *stream);
參數說明:
stream:指定要重新設置位置的文件指針。
返回值:無。