來源:C語言文件操做徹底攻略 (biancheng.net)數據庫
數據的輸入和輸出幾乎伴隨着每一個 C 語言程序,所謂輸入就是從「源端」獲取數據,所謂輸出能夠理解爲向「終端」寫入數據。這裏的源端能夠是鍵盤、鼠標、硬盤、光盤、掃描儀等輸入設備,終端能夠是顯示器、硬盤、打印機等輸出設備。在 C 語言中,把這些輸入和輸出設備也看做「文件」工具
計算機上的各類資源都是由操做系統管理和控制的,操做系統中的文件系統,是專門負責將外部存儲設備中的信息組織方式進行統一管理規劃,以便爲程序訪問數據提供統一的方式。
文件是操做系統管理數據的基本單位,文件通常是指存儲在外部存儲介質上的有名字的一系列相關數據的有序集合。它是程序對數據進行讀寫操做的基本對象。在 C 語言中,把輸入和輸出設備都看做文件。
文件通常包括三要素:文件路徑、文件名、後綴。大數據
文件名:標識文件名字的合法標識符,如 ch十、file_1 等都是合法的文件名。spa
後綴:通常用於標明文件的類型,使用方式爲:文件名.後綴,即文件名與後綴之間用 '.' 隔開。常見的後綴類型有:doc、txt、dat、c、cpp、obj、exe、bmp、jpg 等。操作系統
流是邏輯的抽象的.net
I/O 設備的多樣性及複雜性,給程序設計者訪問這些設備帶來了很大的難度和不便。爲此,ANSIC 的 I/O 系統即標準 I/O 系統,把任意輸入的源端或任意輸出的終端,都抽象轉換成了概念上的「標準 I/O 設備」或稱「標準邏輯設備」。程序繞過具體設備,直接與該「標準邏輯設備」進行交互,這樣就爲程序設計者提供了一個不依賴於任何具體 I/O 設備的統一操做接口,一般把抽象出來的「標準邏輯設備」或「標準文件」稱做「流」。設計
把任意 I/O 設備,轉換成邏輯意義上的「標準 I/O 設備」或「標準文件」的過程,並不須要程序設計者感知和處理,是由標準 I/O 系統自動轉換完成的。故從這個意義上,能夠認爲任意輸入的源端和任意輸出的終端均對應一個「流」。對象
文件按其邏輯結構可分爲:記錄文件和流式文件。而記錄文件又可分爲:順序文件、索引文件、索引順序文件及散列文件等。索引
流式文件是以字節爲單位,對流式文件的訪問通常採用窮舉搜索的方式,效率不高,故通常需頻繁訪問的較大數據不適宜採用流式文件邏輯結構。但因爲流式文件管理簡單,用戶能夠較方便地對文件進行相關操做。接口
流按方向分爲:輸入流和輸出流。從文件獲取數據的流稱爲輸入流,向文件輸出數據稱爲輸出流。
流按數據形式分爲:文本流和二進制流。文本流是 ASCII 碼字符序列,而二進制流是字節序列。
對於計算機來講,一切皆數據,能存放數據的方式有不少種,如內存,文件,數據庫等,文件是極其重要的一種。
1. 文本數據和二進制數據
1. 1 文本數據
把要存儲的數據當成一系列字符組成,把每一個字符的 ASCII 碼值存入文件中。每一個 ASCII 碼值佔一個字節,每一個字節表示一個字符。故文本文件也稱做字符文件或 ASCII 文件,是字符序列文件(文本數據,能用文本工具打開看懂得文字)
1.2 二進制數據
把數據對應的二進制形式存儲到文件中,是字節序列文件(二進制數據,文本工具打開,不能識別的文字,顯示亂碼)
字符 | '1' | '2' | '3' |
---|---|---|---|
ASCII(十進制) | 49 | 50 | 51 |
ASCII(二進制) | 0011 0001 | 0011 0010 | 0011 0011 |
2.緩衝和非緩衝文件系統
C語言中文件系統可分爲兩大類,一種是緩衝文件系統也稱爲標準文件系統,另外一種是非緩衝文件系統。ANSI C 標準中只採用緩衝文件系統。
2.1 緩衝文件系統
緩衝文件系統:系統自動爲每一個打開的文件在內存開闢一塊緩衝區,緩衝區的大小通常由系統決定。當程序向文件中輸出(寫入)數據時,程序先把數據輸出到緩衝區,待緩衝區滿或數據輸出完成後,再把數據從緩衝區輸出到文件;當程序從文件輸入(讀取)數據時,先把數據輸入到緩衝區,待緩衝區滿或數據輸入完成後,再把數據從緩衝區逐個輸入到程序。
2.2 非緩衝文件系統
非緩衝文件系統:系統不自動爲打開的文件開闢內存緩衝區,由程序設計者自行設置緩衝區及大小。
程序每一次訪問磁盤等外存文件都須要移動磁頭來定位磁頭扇區,若是程序頻繁地訪問磁盤文件,會縮短磁盤的壽命,何況速度較慢,與快速的計算機內存處理速度不匹配。
帶緩衝區文件系統的好處是減小對磁盤等外存文件的操做次數,先把數據讀取(寫入)到緩衝區中,至關於把緩衝區中的數據一次性與內存交互,提髙了訪問速度和設備利用率。
通常把帶緩衝文件系統的輸入輸出稱做標準輸入輸出(標準 I/O),而非緩衝文件系統的輸入輸出稱爲系統輸入輸出(系統 I/O)。
ANSI C 爲正在使用的每一個文件分配一個文件信息區,該信息區中包含文件描述信息、 該文件所使用的緩衝區大小及緩衝區位置、該文件當前讀寫到的位置等基本信息。這些信息保存在一個結構體類型變量中,該結構體類型爲 FILE 在 stdio.h 頭文件中定義,不容許用戶改變。每一個 C 編譯系統 stdio.h 文件中的 FILE 定義可能會稍有差異,但均包含文件讀寫的基本信息。