? ? ? ? 經過前面的學習,我們已經基本掌握了如何去寫一個C語言的代碼了。但是在實際的項目中,我們不可能不需要文件去操作。因為如果沒有文件,我們寫的程序是存儲在電腦的內存中的。如果程序推出,內存回收數據就隨之丟失了。如果我們要對數據進行永久性的保存,我們就需要使用文件。
? ? ? ? 接下來我們就文件的操作進行學習
目錄
什么是文件
? ? ? 程序文件
? ? ? 數據文件???
? ? ? ? 文件名
二進制文件和文本文件
科普:絕對路徑和相對路徑:
1. 絕對路徑
2. 相對路徑
3. 關鍵區別對比
4. 實際編程注意事項
5. 示例場景
文件的打開與關閉
? ? ? ? 流和標準流
? ? ? ? 流
? ? ? ? 標準流
? ? ? ? 文件指針
? ? ? ? 文件的打開與關閉?
? ? ? ? 文件的順序讀寫
對比兩組函數scanf/fscanf/sscanf和printf/fprintf/sprintf
對比表格
1. 功能與數據流方向
3. 安全性問題
2. 參數差異
4. 典型應用場景
5.典型應用場景
文件的隨機讀寫
? ? ? ? fseek函數
? ? ? ? ftell函數
? ? ? ? rewind函數
? ?文件讀取結束的判定
? ? ? ? 錯誤使用的feof? ? ?
? ? ? ? 文件緩沖區
什么是文件
? ? ? ? 文件是磁盤(磁盤)的文件
? ? ? ? 但是在程序設計上,我們一般談及的文件分為兩種:程序文件、數據文件(文件功能角度來區分)。
? ? ? 程序文件
? ? ? ? 程序文件包括程序文件(后綴為.c),目標文件(Windows環境下后綴為.obj),可執行程序(Windows環境下后綴為.exe)
? ? ? 數據文件???
? ? ? ? 文件內容不一定是程序,而是程序運行時讀寫的數據,如程序運行時需要從中讀取數據的文件,或者輸出內容的文件
????????本篇中討論的是數據?件。
????????在之前的學習中所處理數據的輸?輸出都是以終端為對象的,即從終端的鍵盤輸?數據,運?結果顯?到顯?器上。其實有時候我們會把信息輸出到磁盤上,當需要的時候再從磁盤上把數據讀取到內存中使?,這?處理的就是磁盤上?件。
? ? ? ? 文件名
? ? ? ? 一個文件要有唯一的標識,以便于用戶識別和引用
? ? ? ? 文件名包含三部分:文件路徑+文件名主干+文件后綴
? ? ? ? 如:D:\VS2022\c-language-practice\test.c
? ? ? ? 為了方便起見,文件標識就是文件名
二進制文件和文本文件
????????根據數據的組織形式,數據?件被稱為?本?件和?進制?件。
????????數據在內存中以?進制的形式存儲,如果不加轉換的輸出到外存的?件中,就是?進制?件。
????????如果要求在外存上以ASCII碼的形式存儲,則需要在存儲前轉換。以ASCII字符的形式存儲的?件就是?本?件。
?????????個數據在?件中是怎么存儲的呢?
????????字符?律以ASCII形式存儲,數值型數據既可以?ASCII形式存儲,也可以使??進制形式存儲。如有整數10000,如果以ASCII碼的形式輸出到磁盤,則磁盤中占?5個字節(每個字符?個字節),??進制形式輸出,則在磁盤上只占4個字節。
? ? ? ? 測試代碼:
#include<stdio.h>
int main()
{int a = 100;FILE* fp = fopen("test.txt", "wb");fwrite(&a,4,1,fp);//二進制寫入文件中fclose(fp);fp = NULL;return 0;
}
運行之后是這個樣子,也就是什么都沒有
通過這里打開可以發現
? ? ? ??
生成了一個txt的文本文件
?這個文件在VS內是無法打開的
? ? ? ? 但是我們可以在VS中打開它(雖然實際意義不是很大)
顯示結果為:
科普:絕對路徑和相對路徑:
1. 絕對路徑
定義
從根目錄開始的完整路徑,明確指向文件或目錄的位置。
-
Windows示例:
C:\\Users\\Name\\Documents\\file.txt
-
Linux/macOS示例:
/home/name/Documents/file.txt
特點
FILE* fp = fopen("data/input.csv", "r"); // 當前目錄下的data子目錄
// 或
FILE* fp = fopen("../logs/error.log", "w"); // 上級目錄的logs子目錄
2. 相對路徑
定義
相對于程序當前工作目錄的路徑,不包含根目錄。
-
示例:
-
data/file.txt
:當前目錄下的data
子目錄中的文件。 -
../config/settings.ini
:上級目錄的config
子目錄中的文件。
-
特點
-
靈活性:路徑隨程序的工作目錄變化而變化。
-
簡潔性:路徑較短,便于維護。
-
符號說明:
-
.
:當前目錄(可省略)。 -
..
:上級目錄。
-
C語言中的使用
FILE* fp = fopen("data/input.csv", "r"); // 當前目錄下的data子目錄
// 或
FILE* fp = fopen("../logs/error.log", "w"); // 上級目錄的logs子目錄
適用場景
-
項目內部資源文件(如配置文件、數據文件)。
-
需要跨平臺移植的代碼。
缺點
-
依賴工作目錄:若程序運行時工作目錄改變,路徑可能失效。
-
調試困難:路徑錯誤可能導致文件找不到,需檢查當前目錄。
3. 關鍵區別對比
對比項 | 絕對路徑 | 相對路徑 |
---|---|---|
路徑起點 | 根目錄(如?C:\\ ?或?/ ) | 程序當前工作目錄 |
唯一性 | 唯一確定文件位置 | 隨工作目錄變化 |
可移植性 | 低(依賴系統目錄結構) | 高(路徑與項目結構相關) |
典型使用場景 | 系統級文件訪問(如日志、全局配置) | 項目內部資源訪問(如數據文件、模塊配置) |
路徑長度 | 長 | 短 |
安全性 | 可能暴露敏感路徑 | 更安全(隱藏具體系統路徑) |
4. 實際編程注意事項
(1) 路徑分隔符
-
Windows:默認使用反斜杠?
\
,但在C字符串中需轉義為?\\
,或統一使用正斜杠?/
(兼容)。 -
Linux/macOS:使用正斜杠?
/
。 -
跨平臺寫法:
// 統一使用正斜杠 FILE* fp = fopen("data/files/image.png", "rb");
(2) 獲取當前工作目錄
-
C標準庫函數:
getcwd
(需包含?<unistd.h>
?或?<direct.h>
)。#include <unistd.h> char cwd[256]; getcwd(cwd, sizeof(cwd)); // 獲取當前工作目錄 printf("當前目錄:%s\n", cwd);
(3) 路徑拼接
-
手動拼接(不推薦):
char path[256]; snprintf(path, sizeof(path), "%s/%s", base_dir, filename);
-
使用庫函數(推薦):
-
C17引入的?
std::filesystem
(C++),但C語言需依賴平臺API(如Windows的?PathCombine
)。
-
(4) 錯誤處理
-
檢查文件是否成功打開:
FILE* fp = fopen("data.txt", "r");
if (fp == NULL) {perror("文件打開失敗"); // 輸出:文件打開失敗: No such file or directoryreturn 1;
}
5. 示例場景
場景1:讀取項目內的配置文件
-
相對路徑:
config/settings.ini
FILE* fp = fopen("config/settings.ini", "r");
場景2:寫入系統日志文件
-
絕對路徑(Linux):
FILE* fp = fopen("/var/log/myapp/error.log", "a");
總結
-
絕對路徑:精準但不可移植,適合訪問系統級固定文件。
-
相對路徑:靈活且可移植,適合項目內部資源管理。
-
編程建議:優先使用相對路徑,結合環境變量或配置文件動態設置路徑,提升代碼可維護性和跨平臺能力。
文件的打開與關閉
? ? ? ? 流和標準流
? ? ? ? 流
????????我們程序的數據需要輸出到各種外部設備,也需要從外部設備獲取數據,不同的外部設備的輸?輸出操作各不相同,為了?便程序員對各種設備進??便的操作,我們抽象出了流的概念,我們可以把流想象成流淌著字符的河。
????????C程序針對?件、畫?、鍵盤等的數據輸?輸出操作都是通過流操作的。
?????????般情況下,我們要想向流?寫數據,或者從流中讀取數據,都是要打開流,然后操作。
? ? ? ? 標準流
????????那為什么我們從鍵盤輸?數據,向屏幕上輸出數據,并沒有打開流呢?那是因為C語?程序在啟動的時候,默認打開了3個流:
? stdin - 標準輸?流,在?多數的環境中從鍵盤輸?,scanf函數就是從標準輸?流中讀取數據。
? stdout - 標準輸出流,?多數的環境中輸出?顯?器界?,printf函數就是將信息輸出到標準輸出流中。
? stderr - 標準錯誤流,?多數環境中輸出到顯?器界?。
????????這是默認打開了這三個流,我們使?scanf、printf等函數就可以直接進?輸?輸出操作的。stdin、stdout、stderr 三個流的類型是: FILE * ,通常稱為?件指針。
????????C語?中,就是通過 FILE* 的?件指針來維護流的各種操作的。
? ? ? ? 那么什么是文件指針呢,接下來我們來學習以下
? ? ? ? 文件指針
????????緩沖?件系統中,關鍵的概念是“?件類型指針”,簡稱“?件指針”。
????????每個被使?的?件都在內存中開辟了?個相應的?件信息區,?來存放?件的相關信息(如?件的名字,?件狀態及?件當前的位置等)。這些信息是保存在?個結構體變量中的。該結構體類型是由系統聲明的,取名 FILE.
? ? ? ? 不同C編譯器的FILE類型包含的內容不完全相同,但是大同小異
? ? ? ??每當打開?個?件的時候,系統會根據?件的情況?動創建?個FILE結構的變量,并填充其中的信息,使?者不必關?細節。
?????????般都是通過?個FILE的指針來維護這個FILE結構的變量,這樣使?起來更加?便。
????????下?我們可以創建?個FILE*的指針變量
FILE *pf;//文件指針變量
????????定義pf是?個指向FILE類型數據的指針變量。可以使pf指向某個?件的?件信息區(是?個結構體變量)。通過該?件信息區中的信息就能夠訪問該?件。也就是說,通過?件指針變量能夠間接找到與它關聯的?件。
?????????如:
? ? ? ? 文件的打開與關閉?
?????????件在讀寫之前應該先打開?件,在使?結束之后應該關閉?件。
????????在編寫程序的時候,在打開?件的同時,都會返回?個FILE*的指針變量指向該?件,也相當于建?了指針和?件的關系。
????????ANSI C 規定使? fopen 函數來打開?件, fclose函數 來關閉?件。
//打開文件
FILE*fopen(const char *filename,const char*mode);
//關閉文件
FILE*fclose(FILE*stream);
? ? ? ? mode表示文件打開模式,下面的是所有的文件打開模式
文件打開模式 | 含義 | 文件不存在時的行為 |
---|---|---|
"r" | 只讀模式打開文本文件 | 返回NULL ,打開失敗 |
"rb" | 只讀模式打開二進制文件 | 返回NULL ,打開失敗 |
"w" | 寫入模式打開文本文件,清空文件內容(若存在) | 創建新文件 |
"wb" | 寫入模式打開二進制文件,清空文件內容(若存在) | 創建新文件 |
"a" | 追加模式打開文本文件,寫入從文件末尾開始 | 創建新文件 |
"ab" | 追加模式打開二進制文件,寫入從文件末尾開始 | 創建新文件 |
"r+" | 讀寫模式打開文本文件(文件必須存在) | 返回NULL ,打開失敗 |
"rb+" ?/?"r+b" | 讀寫模式打開二進制文件(文件必須存在) | 返回NULL ,打開失敗 |
"w+" | 讀寫模式打開文本文件,清空文件內容(若存在) | 創建新文件 |
"wb+" ?/?"w+b" | 讀寫模式打開二進制文件,清空文件內容(若存在) | 創建新文件 |
"a+" | 讀寫模式打開文本文件,寫入從文件末尾開始,讀取從頭開始 | 創建新文件 |
"ab+" ?/?"a+b" | 讀寫模式打開二進制文件,寫入從文件末尾開始,讀取從頭開始 | 創建新文件 |
"wx" ?(C11) | 獨占寫入模式打開文本文件(若文件存在則失敗) | 創建新文件(若存在則失敗,返回NULL ) |
"wbx" ?(C11) | 獨占寫入模式打開二進制文件(若文件存在則失敗) | 創建新文件(若存在則失敗,返回NULL ) |
? ? ? ? 舉例說明:
#include<stdio.h>
int main()
{//fopen()函數用于打開文件,返回一個FILE*指針// 如果成功打開文件,則返回文件信息區的指針// 如果打開失敗,則返回NULL。FILE* fp=fopen("D:\\VS2022\\c-language-practice\\文件操作學習\\test.txt","r");if(fp==NULL){perror("fopen");return 1;}else{printf("文件打開成功\n");}return 0;
}
? ? ? ? 文件的順序讀寫
? ? ? ? 順序讀寫函數的介紹
函數名 | 功能 | 適用場景 |
---|---|---|
fgetc | 從文件流中讀取一個字符 | 逐個字符讀取文本文件(如解析配置文件、簡單文本處理) |
fputc | 向文件流中寫入一個字符 | 逐個字符寫入文本文件(如生成日志、構建文本內容) |
fgets | 從文件流中讀取一行或指定長度的字符串(包含換行符,自動添加\0 ) | 按行讀取文本文件(如讀取CSV、配置文件) |
fputs | 向文件流中寫入一個字符串(不自動添加換行符) | 寫入字符串到文本文件(如保存用戶輸入、導出數據) |
fscanf | 從文件流中按格式讀取數據(類比?scanf ) | 讀取結構化文本數據(如讀取"Name: %s, Age: %d" ?格式的記錄) |
fprintf | 向文件流中按格式寫入數據(類比?printf ) | 寫入結構化文本數據(如生成格式化日志、保存表格數據) |
fread | 從文件流中讀取二進制數據塊(按字節數和項數) | 讀取二進制結構體或數組(如加載圖片、音視頻文件或程序狀態快照) |
fwrite | 向文件流中寫入二進制數據塊(按字節數和項數) | 寫入二進制結構體或數組(如保存游戲進度、序列化數據) |
getc | 與?fgetc ?功能相同,但可能通過宏實現(性能略高) | 同?fgetc ,常用于高頻字符讀取場景 |
putc | 與?fputc ?功能相同,但可能通過宏實現(性能略高) | 同?fputc ,常用于高頻字符寫入場景 |
ungetc | 將字符退回輸入流,使下次讀取可重新獲取該字符 | 解析需要“向前看”的場景(如詞法分析器中回退字符) |
????????上?說的適?于所有輸?流?般指適?于標準輸?流和其他輸?流(如?件輸?流);所有輸出流?般指適?于標準輸出流和其他輸出流(如?件輸出流)。
關鍵說明
-
文本模式 vs 二進制模式:
-
文本模式函數(
fgetc
、fputs
等)會自動處理換行符轉換(如Windows的\r\n
???\n
)。 -
二進制模式函數(
fread
、fwrite
)直接操作原始字節,無格式轉換。
-
-
順序讀寫特性:
-
所有函數按文件指針順序操作,每次讀寫后指針自動后移。
-
與隨機訪問函數(
fseek
、ftell
)互補,不可混用。
-
-
典型應用場景:
-
文本處理:
fgets
?+?fputs
(逐行讀寫),fscanf
?+?fprintf
(格式化數據)。 -
二進制處理:
fread
?+?fwrite
(結構體/數組持久化)。 -
低層操作:
fgetc
?+?fputc
(自定義解析或生成。
-
舉例說明:寫入一個字符
fputc函數的結構:
#include<stdio.h>
int main()
{FILE* fp=fopen("test.txt","w");if(fp==NULL){perror("fopen");return 1;}//寫文件fputc('a', fp);fputc('b', fp);fputc('c', fp);fputc('d', fp);fputc('e', fp);fputc('f', fp);fputc('g', fp);fputc('h', fp);fputc('i', fp);fputc('j', fp);fputc('k', fp);//關閉文件fclose(fp);fp = NULL;return 0;
}
?代碼為0 ,代表運行成功
成果展示:
讀字符
#include<stdio.h>
int main()
{FILE* fp=fopen("test.txt","r");if(fp==NULL){perror("fopen");return 1;}//寫文件fputc('a', fp);fputc('b', fp);fputc('c', fp);fputc('d', fp);fputc('e', fp);fputc('f', fp);fputc('g', fp);fputc('h', fp);fputc('i', fp);fputc('j', fp);fputc('k', fp);//讀文件int ch;while((ch=fgetc(fp))!=EOF){printf("%c ", ch);}//關閉文件fclose(fp);fp = NULL;return 0;
}
對比兩組函數scanf/fscanf/sscanf和printf/fprintf/sprintf
對比表格
對比項 | scanf ?系列 (scanf /fscanf /sscanf ) | printf ?系列 (printf /fprintf /sprintf ) |
---|---|---|
核心功能 | 從輸入源按格式解析數據并存儲到變量。 | 將數據按格式格式化輸出到目標輸出源。 |
函數分類 | scanf :標準輸入(鍵盤)fscanf :文件流sscanf :字符串 | printf :標準輸出(屏幕)fprintf :文件流sprintf :字符串 |
參數順序 | scanf(format, &var1, &var2...) fscanf(stream, format, &var...) | printf(format, val1, val2...) fprintf(stream, format, val...) |
輸入/輸出源 | 輸入源:鍵盤(stdin )、文件、字符串 | 輸出目標:屏幕(stdout )、文件、字符串 |
返回值 | 返回成功解析的項數(失敗返回EOF ) | 返回成功輸出的字符數(失敗返回負值) |
安全性風險 | 緩沖區溢出(如%s 無長度限制) | sprintf 存在緩沖區溢出風險,建議用snprintf |
典型應用場景 | 讀取用戶輸入、解析文件數據、提取字符串中的結構化信息 | 打印日志、生成格式化字符串、寫入文件數據 |
詳細對比說明
1. 功能與數據流方向
3. 安全性問題
-
scanf
系列:-
從輸入源(鍵盤、文件、字符串)讀取數據,按格式解析后存入變量。
-
-
示例:
int age; char name[32]; sscanf("Name: Alice, Age: 25", "Name: %s, Age: %d", name, &age);
printf
系列: -
將數據按格式轉換為字符串,輸出到目標(屏幕、文件、字符串)。
-
示例:
char buffer[100]; sprintf(buffer, "Result: %d", 42); // 輸出到字符串
2. 參數差異
-
scanf
系列:-
scanf
:直接從?stdin
?讀取,無需指定輸入源。 -
fscanf
:需傳入文件指針(如?FILE* fp
)。 -
sscanf
:需傳入源字符串。 -
變量參數:必須傳遞變量的地址(如?
&num
)。
-
-
printf
系列:-
printf
:直接輸出到?stdout
。 -
fprintf
:需傳入文件指針。 -
sprintf
:需傳入目標字符數組。 -
變量參數:直接傳遞變量值(非指針)。
-
-
scanf
系列:-
%s
?和?%[
?格式符可能導致緩沖區溢出。 -
改進方法:指定最大寬度(如?
%31s
?限制長度為31字符)。
-
-
printf
系列:-
sprintf
?可能因目標緩沖區過小導致溢出。 -
改進方法:使用?
snprintf
?限制寫入長度。
-
char buf[10];
snprintf(buf, sizeof(buf), "%s", "Too long string"); // 安全截斷
4. 典型應用場景
函數 | 應用場景 |
---|---|
scanf | 交互式程序讀取用戶輸入(需配合輸入驗證) |
fscanf | 讀取配置文件、日志文件等結構化文本文件 |
sscanf | 解析字符串中的數字或字段(如解析HTTP響應頭) |
printf | 輸出調試信息、程序運行結果到控制臺 |
fprintf | 寫入日志文件、生成報告文件 |
sprintf | 動態生成格式化字符串(需注意緩沖區大小,優先用?snprintf ) |
5.典型應用場景
?輸入函數組
// 從鍵盤讀取輸入
int num;
scanf("%d", &num); // 從文件讀取
FILE* fp = fopen("data.txt", "r");
fscanf(fp, "Value: %d", &num);// 從字符串解析
char str[] = "2023-10-01";
int year, month, day;
sscanf(str, "%d-%d-%d", &year, &month, &day);
輸出字符組
// 輸出到屏幕
printf("Result: %d\n", 42);// 輸出到文件
FILE* fp = fopen("log.txt", "w");
fprintf(fp, "Error: %s\n", "File not found");// 輸出到字符串
char buffer[64];
sprintf(buffer, "Date: %04d-%02d-%02d", year, month, day);
文件的隨機讀寫
? ? ? ? fseek函數
? ? ? ? 根據文件指針的位置和偏移量來定位文件的指針(文件內容的光標)
int fseek(FILE*stream,long int offset,int origin);
? ? ? ? 例子:
#include<stdio.h>
int main()
{FILE* pfile;pfile = fopen("test.txt", "wb");fputs("Hello, world!", pfile);fseek(pfile,9,SEEK_SET);fputs(" IM THE WORLD", pfile);fclose(pfile);return 0;
}
? ? ? ? 結果:
? ? ? ? ftell函數
? ? ? ? 返回文件指針相對起始位置的偏移量
#include<stdio.h>
int main()
{FILE* pfile;long size;pfile = fopen("test.txt", "rb");if (pfile == NULL){perror("打開失敗");return 1;}else{fseek(pfile, 0, SEEK_END);size=ftell(pfile);fclose(pfile);printf("文件大小為:%ld\n", size);}return 0;
}
? ? ? ? rewind函數
? ? ? ? 讓文件指針回到文件的起始位置
void rewind (FILE*stream);
#include<stdio.h>
int main()
{int n;FILE* pfile;char str[27];pfile = fopen("test.txt", "w+");for (n='A';n<= 'Z';n++){fputc(n,pfile);}rewind(pfile);fread(str, 1, 26, pfile);fclose(pfile);str[26] = '\0';printf("%s\n", str);return 0;
}
結果為:?
? ?文件讀取結束的判定
? ? ? ? 錯誤使用的feof? ? ?
????????牢記:在?件讀取過程中,不能? feof 函數的返回值直接來判斷?件的是否結束。feof 的作?是:當?件讀取結束的時候,判斷讀取結束的原因是否是:遇到?件尾結束。
????????1. ?本?件讀取是否結束,判斷返回值是否為 EOF ( fgetc ),或者 NULL ( fgets )例如:? fgetc 判斷是否為 EOF .? fgets 判斷返回值是否為 NULL .
????????2. ?進制?件的讀取結束判斷,判斷返回值是否?于實際要讀的個數。例如:? fread判斷返回值是否?于實際要讀的個數。
? ? ? ? 文本文件的例子:
#include<stdio.h>
#include<stdlib.h>
int main()
{int c;//要處理EOF,必須為int型變量FILE* pfile=fopen("test.txt", "r");if (!pfile){perror("打開失敗");return 1;}//輸入失敗的時候會返回EOFwhile ((c = fgetc(pfile)) != EOF){putchar(c);}//判斷原因if (ferror(pfile)){puts("讀取失敗");}else if(feof(pfile)){puts("文件結束");}fclose(pfile);return 0;
}
? ? ? ? 二進制文件的例子:
#include<stdio.h>
enum {SIZE=5};
int main()
{double a[SIZE] = {1.1, 2.2, 3.3, 4.4, 5.5};FILE* pfile = fopen("test.txt", "wb");//以二進制方式打開文件fwrite(a, sizeof(double), SIZE, pfile);//將數組a寫入文件fclose(pfile);//關閉文件double b[SIZE];pfile =fopen("test.txt", "rb");//以二進制方式打開文件size_t ret_code = fread(b, sizeof(double), SIZE, pfile);//從文件中讀取數組bif (ret_code==SIZE){puts("數組讀取內容為:");for (int n = 0;n < SIZE;n++){printf("%.2f ",b[n]);}putchar('\n');}else{if (feof(pfile)){puts("文件讀取結束");}else if (ferror(pfile)){puts("文件讀取失敗");}}fclose(pfile);//關閉文件return 0;
}
? ? ? ? 文件緩沖區
????????ANSI C 標準采?“緩沖?件系統” 處理數據?件的,所謂緩沖?件系統是指系統?動地在內存中為程序中每?個正在使?的?件開辟?塊“?件緩沖區”。從內存向磁盤輸出數據會先送到內存中的緩沖區,裝滿緩沖區后才?起送到磁盤上。如果從磁盤向計算機讀?數據,則從磁盤?件中讀取數據輸?到內存緩沖區(充滿緩沖區),然后再從緩沖區逐個地將數據送到程序數據區(程序變量等)。緩沖區的??根據C編譯系統決定的。
????????
????????這?可以得出?個結論:因為有緩沖區的存在,C語?在操作?件的時候,需要做刷新緩沖區或者在?件操作結束的時候關閉?件。如果不做,可能導致讀寫?件的問題。?
? ? ? ? 以上就是本期C語言的內容了,希望各位讀者朋友點個贊,謝謝