文件處理,首先要區分文本文件還是二進制文件,因此C函數庫中給出"t"和"b"的打開模式選項,你先查看這個問題的相關資料。其次,既然要用戶手寫數據,那麽數據文件往往就是文本文件(與敲鍵盤在屏幕上呈現一樣),在記事本裏輸入,就是文本文件(其實你寫的C程序源代碼,也是文本文件)。程序用"t"模式打開文本文件之後,讀取的數據本質上全部是字符串,整個文件就是一個大字符串,所有數據,都要你在程序中把字符串轉換為需要的真實數據類型。因此,用scanf("%d", &i)處理字符串"12",就是把字符串"12"轉換為整數再賦給i,這個轉換過程scanf()函數替你做了;若用scanf("%s", s)處理同樣的數據"12",則scanf()知曉只要字符串而不會做數據轉換(受%s控制,因此%d、%s之類其實是scanf()和printf()函數的動作指示提示符)。也就是說,你只要用"rt"打開文本文件,想象裏面是用戶在屏幕敲好的一大堆數據(把文件看成屏幕即可),不斷按程序設定的數據格式用fscanf()函數讀入就是了。這種文本文件,用程序輸出時,是用fprintf()打印出去的(仍然是把文件看成屏幕)。
二進制模式不同,必須用fread()來讀,用fwrite()寫出去,每個數據都嚴格對應。也就是說,如果你用fread()來讀文本文件的數據,一定是得到錯誤數據(文件能打開,但得不到你想要的)。
從上面所說的,你可以看到,scanf()多了一個數據轉換過程,而且數據全部是以字符串形式儲存的,佔文件空間大,讀寫都慢。但它的優勢是直接可以用人眼看到數據,方便輸入和排版處理,修改也方便,是用戶離綫輸入數據的最佳形式。不過缺點除了慢之外,還在於這種數據是明文的,沒有加密措施,敏感數據不能這樣儲存。然而,字符串格式儲存數據,有另外一個二進制文件無法替代的優勢,它的數值格式是絕對精確的,不會被二進制編碼改爲近似數,當你對數值的精度非常在意時,就必須採取這個辦法。
一個文件,是客觀實在,但它在你的程序中呈現的形態,與你打開它的模式有關。用"t"打開.exe、.jpg之類文件,程序把每一個字節都當作char,而且,在遇到0時終結字符串,而我們知道,這類文件中的0非常多。對用"b"打開的任何文件,都簡單地逐個byte讀取而已,不存在終結符,它視數據為内存映像。
[
本帖最后由 TonyDeng 于 2011-12-25 20:19 编辑 ]