操作檔案時需要用到緩衝區以及 file 型別變數,這就出現了乙個問題:結構體 變數和緩衝區如何分配?結構體變數怎樣儲存緩衝區及檔案的資訊?這些工作需要 程式設計師自己程式設計來完成?
這些顯然不需要程式設計師自己程式設計來完成的。根據經驗,凡是常用的操作,系統 都已經給我們編好程式或者準備好函式了,這個函式就是 fopen()。
(1) 在記憶體中給被操作檔案分配緩衝區並且開闢乙個 file 型別變數;開啟檔案實際上就是呼叫 fopen()函式完成上面所說的工作。而接下來的讀寫操 作,則可由一些讀寫函式去完成。(2) 把檔案資訊及緩衝區資訊存入 file 型變數中;
(3) 返回 file 型變數的首位址。
該函式有返回值,返回的是記憶體中所分配的 file 變數的首位址(若開啟檔案不 成功,則返回 null(null是0,是stdlib.h中定義的巨集))所以要在開啟檔案前先定義乙個file *型的變數
mode指的是檔案的開啟方式。
使用追加方式開啟檔案時,讀寫的當前位置指標指向檔案尾,而其他開啟方式 都是指向檔案頭,這意味著如果用非追加方式開啟檔案寫資料將把檔案原有的內容 覆蓋。
上面的 12 種開啟方式,其中有 6 種後面帶字母 b 的,6 種帶 t 的。帶 b 的打 開方式,通常用於二進位制檔案,所以叫做二進位制方式開啟;帶 t 的通常用於文字檔案, 所以叫做文字方式開啟。
實際上,用二進位制方式既可以開啟二進位制檔案,也可以開啟文字檔案,同樣,文字方式既可以開啟文字檔案,也可以開啟二進位制檔案,一般不這樣做。
用帶"+"的開啟方式開啟檔案後可以又讀又寫,但在讀寫操作轉換時要呼叫fseek(),rewind(),fflush()函式,否則轉換後的操作無效。
插播:回車和換行的起源
計算機還沒有出現之前,有乙個東西叫做「電傳打字機」(teletype model 33),每秒鐘可以打十個字元(每個字元0.1s),但是它有乙個問題,就是打完一行換行的時候,要用0.2s的時間。
如果在這0.2s中有字元傳來,那麼這兩個字元將丟失(沒有快取,也沒辦法先存起來。)
於是想出了乙個辦法:字元傳送方在傳送資訊時,在每行後面加兩個表示結束的字元(正好可以填補0.2s的空隙)。這兩個字元乙個稱為「回車」,告訴打字機把列印頭定位在左邊界,另乙個稱為「換行」,告訴打字機把紙向上移動一行。
後來,計算機發明了,這兩個概念被搬到了計算機上。
那時儲存器很貴,有些人認為,在每行結尾加兩個字元太浪費了,加乙個就可以。
也有些人覺得無所謂,於是,就出現了不同的規定。
不同作業系統對換行有著不同的規定。
unix規定,每行結尾只存乙個字元'',就可以實現換行的功能。
windows規定,每行結尾需要存'',''兩個字元,才可以實現換行的功能。
mac os規定,每行結尾只存乙個'',就可以實現換行的功能。
上述3種不同的規定所導致的直接後果是unix/mac os下的檔案若在windows中開啟,所有文字會變成一行;
而windows中的檔案在unix/mac os下開啟的話,在每行的結尾可能會多出乙個不可識別的符號。
c程式中,若要實現換行,只輸出乙個''即可。
c 以二進位制方式讀檔案
using system using system.io console.writeline 以文字方式讀檔案結束 以二進位制方式讀檔案 建立乙個二進位制資料流讀入器,和開啟的檔案關聯 binaryreader brmyfile new binaryreader fsmyfile 把檔案指標重新定位...
以二進位制和文字的方式讀寫檔案
文字方式開啟的檔案具有一定的格式,說明讀取時是要按照一定的編碼規範來讀取的,而二進位制方式讀取是直接從檔案中讀取包含0,1的二進位製流,沒有任何格式。因此,fread讀取以文字方式開啟的檔案時,等於是讀取了包含格式的二進位製流,因此會出錯。字元是乙個二進位制資料的特殊表現形式,它仍是資料 字元 a ...
c 開啟檔案方式(二進位制和文字)
c語言檔案操作的乙個問題 c語言中開啟檔案有兩種方式,一種是二進位制方式,另一種是文字方式 ascii碼方式 這兩種方式有什麼區別?對於linux這種只有一種檔案型別的作業系統來說是沒有區別的 我們就以windows為例說說區別 a.以文字方式開啟檔案,若將資料寫入檔案,如果遇到換行符 n asii...