ANSIC標準采用“緩沖文件系統”處理的數據文件的,所謂緩沖文件系統是指系統自動地在內存中為程序中每一個正在使用的文件開辟一塊“文件緩沖區”。
從內存向磁盤輸出數據會先送到內存中的緩沖區,裝滿緩沖區后才一起送到磁盤上。
如果從磁盤向計算機讀入數據,則從磁盤文件中讀取數據輸入到內存緩沖區(充滿緩沖區),然后再從緩沖區逐個地將數據送到程序數據區(程序變量等)。緩沖區的大小根據C編譯系統決定的。
代碼示例:
#include <stdio.h>
#include <windows.h>
int main()
{
? ? FILE* pf = fopen("test.txt", "w");
? ? fputs("abcdef", pf);//先將代碼放在輸出緩沖區
? ? printf("睡眠10秒-已經寫數據了,打開test.txt文件,發現文件沒有內容\n");
? ? Sleep(10000);
? ? printf("刷新緩沖區\n");
? ? fflush(pf);//刷新緩沖區時,才將輸出緩沖區的數據寫到文件(磁盤)
? ? //注:fflush 在高版本的VS上不能使用了
? ? printf("再睡眠10秒-此時,再次打開test.txt文件,文件有內容了\n");
? ? Sleep(10000);
? ? fclose(pf);
? ? //注:fclose在關閉文件的時候,也會刷新緩沖區
? ? pf = NULL;
? ? return 0;
}
在這里要著重了解fflush的作用;
在剛開始運行還未到10s時,打開文件其中沒有任何數據:
文件指針(重點)
緩沖文件系統中,關鍵的概念是“文件類型指針”,簡稱“文件指針”。
每個被使用的文件都在內存中開辟了一個相應的文件信息區,用來存放文件的相關信息(如文件的名字,文件狀態及文件當前的位置等)。
這些信息是保存在一個結構體變量中的。該結構體類型是有系統聲明的,取名FILE.
例如,VS2013編譯環境提供的 stdio.h 頭文件中有以下的文件類型申明:
struct _iobuf {
? ? ? ? char *_ptr;
? ? ? ? int ? _cnt;
? ? ? ? char *_base;
? ? ? ? int ? _flag;
? ? ? ? int ? _file;
? ? ? ? int ? _charbuf;
? ? ? ? int ? _bufsiz;
? ? ? ? char *_tmpfname;
? ? ? ?}; typedef struct _iobuf FILE;
不同的C編譯器的FILE類型包含的內容不完全相同,但是大同小異。
每當打開一個文件的時候,系統會根據文件的情況自動創建一個FILE結構的變量,并填充其中的信息,使用者不必關
心細節。
一般都是通過一個FILE的指針來維護這個FILE結構的變量,這樣使用起來更加方便。
下面我們可以創建一個FILE*的指針變量:
FILE* pf;//文件指針變量