發現很多人對檔案操作有不了解的,自己又回過頭看了看,總結提公升了一下,也小有收穫。
常見的注意事項就不說了,只列舉了幾個個人認為有用的。
1. 常有人說:
eof可以作為文字檔案的結束 標誌,但不能作為二進位制檔案的結束符.
feof函式既可以判斷二進位制檔案,又可以判斷文字檔案.
這是為什麼? 例:
當用文字形式讀取檔案(如"r"),由於讀入的是字元,而ascii碼值是不可能出現-1的,因此,eof用來處理文字檔案結束是合適的。
但,當用二進位制讀取(如"rb"),某個位元組的二進位制就有可能是-1,而-1=eof,但是,此時並不是檔案的結尾,所以,為了解決此問題,feof函式誕生了。
2.二進位制形式的檔案,可以節省外存空間和轉換時間(二進位制與ascii的轉換)。但乙個位元組並不對應乙個字
符,不能直接輸出字元形式。一般中間結果需要儲存
在外存上,以後需要輸入到記憶體的,常用二進位制檔案儲存。
3.緩衝檔案系統:「系統」在記憶體中為正在使用的檔案開闢乙個快取區
非緩衝檔案系統:「程式」在記憶體中為正在使用的檔案開闢乙個快取區
unix下:用緩衝檔案系統處理文字檔案,用非緩衝檔案系統處理二進位制檔案。
ansi c標準:用緩衝檔案系統處理文字和二進位制檔案。
4.注意:對於回車換行符的處理,文字檔案和二進位制檔案是不一樣的
文字檔案:存入檔案時,將回車換行符轉換成乙個換行符,在從檔案讀取時,執行反向操作
二進位制:存入和讀取都不進行轉換,在記憶體中的資料形式與輸出到外部檔案中的資料形式完全一致。
5.發現很多人說什麼二進位制檔案開啟的時候是亂碼,那是因為檔案編輯器的讀取規範問題所致,其實你的二進位制檔案還是二進位制。
用ue檢視二進位制檔案和文字檔案就能看出實質的區別。當然,類似此類的,qedit等等,只要能讀二進位制檔案的軟體就可以
6. fclose的原因:應該養成良好的習慣,在寫fopen的時候,就順帶的把fclose寫上,免得出錯。那麼,為什麼檔案要關閉?fclose到底幹了什麼?
如前所述,ansi c規定是先將資料輸出到緩衝區,待緩衝區充滿後才正式輸出給檔案。如果,當資料未充滿緩衝去而程式結束執行,就會造成緩衝區中有用的資料因為未寫入到檔案而丟失。
用fclose關閉檔案,先是把緩衝區資料輸出到檔案中,然後釋放檔案指標(使該指標不再與當前檔案相關聯)
7. fprintf和fsanf函式,在對檔案寫入時,要經過將ascii碼轉換成二進位制,讀取檔案時,又要將二進位制轉
換陳ascii碼,所以,花費的時間較多。因此,在記憶體與磁碟頻繁交換資料的情況下,最好不要用fprintf
和fscanf,而用fwrite和fread。
8. 為了便於讀入,在用fputs類似的文字格式向檔案中寫入字串,應當人為的加諸如"/n"這樣的字串.
9. fseek函式一般用於二進位制檔案,因為文字格式的檔案要進行字元轉換,對應的位元組數可能就有錯誤。
例如:將255以文字形式或者二進位制形式存入檔案中:
對應的ascii碼:00110010 00110101 00110101 (2對應ascii碼50,5對應53)
對應的二進位製碼:11111111
執行下面語句:
fseek(fp, 1l, seek_set ); //檔案位置指標從檔案頭一動乙個位元組位置
char bye; //儲存乙個位元組的變數
fread(&bye, 1, 1, fp); //讀取乙個位元組
對於以文字檔案寫入("w"),此時,bye中的資料就是 00110101 (也就是5)
對於二進位制檔案寫入("wb"),此時,bye中資料也就不太清楚了……呵呵……
所以,在當你用fseek移動檔案位置指標時,就有可能造成「意想不到」的結果。
所以:常有人說,檔案的開啟只用二進位制, 對檔案的讀取只用fwrite,fread。是有道理的……
持續更新。。。
C 重難點知識總結
c 提供了兩種指標運算子,一種是取位址運算子 一種是間接定址運算子 指標是乙個包含了另乙個變數位址的變數,可以把乙個包含了另乙個變數位址的變數說成是 指向 另乙個變數。變數可以是任意的資料型別,包括物件 結構或者指標。取位址運算子 是一元運算子,返回運算元的記憶體位址。例如,如果 var 是乙個整型...
C語言的難點
c語言中static的作用 1 修飾變數,變數分為區域性變數和全域性變數,它們在記憶體的靜態區。靜態全域性變數,作用域僅限於變數定義的檔案中,其他檔案即使用extern宣告也無法使用。作用域從定義之處開始,到檔案結尾處。靜態區域性變數,在函式體中定義,就只能在這個函式中使用,同一文件的其他函式也使用...
C語言難點總結
1,與 結合 char str 20 123456789 char p str char c1 p c1為字元 1 p 解析 與 運算子 優先順序同級,此優先順序 結合方向 從右到左 所以先 後 後自增,先用乙個副本取出p的值,再自增,然後 作用到副本上,取出值為1。p 編譯是沒有錯誤的 加 與 結...