檔案操作和鍊錶綜合應用
我們都知道我們原來鍊錶的那些資料都是存與棧區的,當程式結束後,這些資料全部都會消失,那麼我要是想把這些檔案儲存下來,就是儲存到我們的磁碟中,應該如何用處理呢?這時候我們就需要對檔案進行操作了,不過我們首先要注意到的就是,磁碟的讀取速度太慢了,遠遠小於我們記憶體執行的速度,所以我們都是將磁碟的檔案一次性的讀取到鍊錶中,等程式結束後,把鍊錶的資料在寫回到檔案中。
ascii檔案便於對字元進行逐個處理,也便於輸出字元。但一般佔儲存空間較多,而且要花費轉換時間。
二進位制檔案可以節省外存空間和轉換時間,但乙個位元組並不對應乙個字元,不能直接輸出字元形式。
緩衝檔案系統:系統自動地在記憶體區為每乙個正在使用的檔案開闢乙個緩衝區。用緩衝檔案系統進行的輸入輸出又稱為高階磁碟輸入輸出。
非緩衝檔案系統:系統不自動開闢確定大小的緩衝區,而由程式為每個檔案設定緩衝區。用非緩衝檔案系統進行的輸入輸出又稱為低階輸入輸出系統。
在c語言中有乙個特殊的指標,這個指標是已經幫我定義好了的,在stdio的標頭檔案中,定義了乙個file的檔案指標。在緩衝檔案系統中,每個被使用的檔案都要在記憶體中開闢一file型別的區,存放檔案的有關資訊。
file指標的宣告:file *fp;這是乙個檔案指標。變數名是fp,型別是file。檔案指標指向乙個結構,該結構包含以下資訊:檔名、檔案的當前位置、檔案是否正在讀或寫、是否出錯或是否到達檔案末尾。
使用檔案的方式
指令的作用
「r」(唯讀)為輸入,開啟乙個文字檔案
「w」(只寫)為輸出,開啟乙個文字檔案
「a」(追加)向文字,檔案尾增加資料
「rb」
(唯讀)為輸入,開啟乙個二進位制檔案
「wb」
(只寫)為輸出,開啟乙個二進位制檔案
「ab」
(追加)向二進位制檔案尾增加資料
"r+「
(讀寫)為讀/寫開啟乙個文字檔案
"w+」
(讀寫)為讀/寫建立乙個新的文字檔案
"w+」
(讀寫)為讀/寫建立乙個新的文字檔案
「a+」
(讀寫)為讀/寫開啟乙個文字檔案(追加)
"rb+「
(讀寫)為讀/寫開啟乙個二進位制檔案
「wb+「
(讀寫)為讀/寫建立乙個新的二進位制檔案
「ab+」
(讀寫)為讀/寫開啟乙個二進位制檔案
這裡我們主要來分析一下「r+」和「w+」(或者「rb+」和「wb+」)的區別:
「r+」(「rb+」):他只能開啟存在的檔案,存在則開啟成功,不存在就會開啟失敗。
「w+」(「wb+」):這個命令如果檔案不存在就會新建乙個檔案並開啟,如果存在那麼它會建立乙個新的檔案同時覆蓋之前的檔案。
這個函式的函式功能是開啟指定的檔案。
我們來看看如何呼叫這個函式:
file *fp;
fp=fopen(檔名,使用檔案方式);
檔名:就是你要操作的檔案,如果直接寫檔名的話,那麼就是預設在當前目錄下開啟,如果加路徑那麼就是在你選擇的路徑下開啟。
使用檔案方式,有很多的命令,上面已經介紹。
這個函式是有返回值的,一般開啟成功就是返回這個檔案指標,如果開啟失敗會返回null。
含有就是檔名和使用檔案方式都是字串。
函式呼叫:
fclose(檔案指標);
函式功能:
使檔案指標變數不指向該檔案,也就是檔案指標變數與檔案「脫鉤」,此後不能再通過該指針對原來與其相聯絡的檔案進行讀寫操作
返回值:
關閉成功返回值為0;否則返回eof(-1)
函式原型:size_t fwrite(const void *buffer,size_t bytes, sizeo_t n,file *fp);
函式引數:buffer-要寫入資料的首位址,bytes-每份資料的大小,n-要寫入幾份資料,fp-要輸入的檔案指標。
函式返回值:成功時返回寫入的單元數,否則返回0
函式功能:fwrite是無格式寫函式,用於向檔案寫入整塊的資料。
例如我們把乙個使用者結構體的資料寫入檔案
user user=
int pf=0;
pf =
fwrite
(&user,
sizeof
(user),1
, fp)
;//fp是已經開啟的檔案
if(pf==0)
else
//這裡有乙個要注意的地方就是,我們寫入成功後,其實這個資料還並沒有真正寫入到檔案
//裡面,而是先存在了快取區,所以我們要重新整理一下快取區使用fflush函式
fflush
(pf)
;
函式原型:size_t fread(void *buffer, size_t bytes, sizeo_t n, file *fp);
函式引數:buffer-接收資料的首位址,bytes-每份資料的大小,n-要接收幾份資料,fp-要操作的檔案指標。
函式名返回值:成功時返回讀出的單元數,否則返回0
函式功能:fread是無格式讀函式,用於向檔案讀出整塊的資料。
例如我們把剛剛的使用者讀取出來
pf = fread (
&user,
sizeof
(user),1
, fp)
;//fp是已經開啟的檔案
if(pf==0)
else
我們使用讀取函式的時候要注意游標的位置,如果游標的位置在末尾那麼久讀取不到東西,所以為了我們能夠讀取到資料我們需要乙個可以定位游標的函式,下面就有介紹。
函式原型:void rewind(file * fp) ;
函式引數:fp-要操作的檔案指標
函式返回值:無
函式功能:將檔案的游標定位到檔案的頭部
例子:rewind(pf);
函式原型:int fseek (file *fp, long int offset, int origin);
函式引數:fp-要操作的檔案指標,offset-偏移量,origin-搜尋起始位置
函式返回值:無
函式功能:通過指定相對於開始位置、當前位置或流的末尾位置的偏移量來定位游標位置。
這個函式的第三個引數,只有三個變數,這三個變數是庫裡面有對應的巨集定義,seek_set 或 0(檔案開始),seek_cur 或 1(當前檔案指標位置),seek_end 或 2(檔案末尾)。這個偏移量是可正可負的(正向後偏移,負向前偏移),一般如果在檔案頭那麼這個偏移量為正,在尾部則為負,中間就隨便了。
函式原型:long int ftell(file *pf);
函式引數:pf-要操作的檔案
函式返回值:返回位元組數
函式功能:獲取當前檔案指標離檔案開頭的位元組數
例子:
long
int nlength=0;
fseek
(fp,
sizeof
(user)
,seek_end);
//偏移到檔案尾部
nlength =
ftell
(fp)
;//獲取當前檔案指標離檔案開頭的位元組數
printf
(「the file length is %d\n」, nlength)
;
思路分析:我們一般都把資料儲存於檔案中,那在程式執行的時候我們就需要把這個資料都儲存進來,那麼我們就需要先定義乙個鍊錶(通用鍊錶)的頭,然後就是開空間儲存資料,在就是從檔案中讀取資料(讀取的資料也需要開空間來儲存它,開的空間多大?需要你自己定,所以需要乙個引數傳進來。),因為我們每次只能儲存乙個資料,所以我們需要乙個迴圈,來重複這個操作,知道檔案被讀取完畢。
例程:
list *
file_read
(file *fp,
int size)
//初始化
memset
(data,
'\0'
, size)
;//開始讀取資料
//移動到檔案頭
rewind
(fp)
;//然後迴圈讀取資料並開空間儲存資料
while
(fread
(data, size,
1, fp)
)//初始化
memset
(data,
'\0'
, size);}
return head;
}//list是乙個定義好的結構體
思路分析:我們先將檔案的游標移動到檔案末尾,檔案移動到末尾用fseek函式,然後在寫入資料,寫入資料用fwrite函式,最後記得重新整理一下。
例程:
void
file_add
(file *fp,
void
*data,
int size)
思路分析:我們要檔案的游標移動到頭或者末尾都行(建議從頭),然後通過偏移找到要修改資料的位置,然後就是重新寫入相應大小的資料,最後記得重新整理資料區。這裡的偏移量要注意記得減一。
void
file_update
(file *fp,
void
*data,
int size,
int index)
}
了解C 檔案操作
using system using system.collections.generic using system.io using system.linq using system.text namespace fileoperate 要寫入的資訊 write方法只能寫入byte陣列 關閉檔案流...
C語言檔案操作基本常識
由於程式中經常有大量對檔案的輸入輸出操作,它經常構成了程式的主要部分,因而c語言提供了很多輸入輸出的函式,它們分別用於兩種型別檔案輸入輸出系統 即由ansi標準定義的緩衝檔案 也稱標準檔案 流 輸入輸出 i o 系統 另一類是ansi標準中沒有定義的非緩衝檔案 也稱非標準檔案 流 輸入輸出 i o ...
C 檔案的基本操作
c 檔案的基本操作 c 語言將檔案看成無結構的位元組流,根據檔案資料的編碼方式不同,分為文字檔案和二進位制檔案。根據訪問方式不同,分為順序訪問和隨機訪問方式。流庫的ifstream,ofstream,fstream類用於記憶體和檔案之間的資料交換。檔案的基本操作一般分為三個步驟 開啟檔案,讀寫檔案,...