十、檔案處理
檔案是眾多的字元所組成的集合體,部分語言會將它視為一種資料串流(Stream)。 與資料串流有關的資訊,是記錄在一個資料型態為資料串流列別的資料串流物件變數,作用為資料串流與檔案的溝通橋樑。
所以檔案處理也能稱作是資料串流處理。資料串流類別分成三種【資料輸入串流類別(ifsteam)】、【資料輸出串流類別(ofsteam)】、【資料輸入/輸出串流類別(fsteam)】。
檔案類型
一、文字檔
文字檔以列為單位,列與列之間為 '\n' 字元;資料中每一個字元,以對應的ASCII碼來儲存。
二、二進位檔
二進位 檔裡面沒有額外的 '\n' 字元 ; 資料中每一個字元都直接以二進制的格式存取。例如執行檔、圖片、影片等,但二進制是無法使用在文字編輯軟體處理,若強制開啟會遇到亂碼。

檔案依存取權限,可分為一般檔案與唯讀檔 (read-only),檢視方式對文件按下右鍵,是否有勾起屬性中的唯獨。

檔案存取
存取方式分為兩種,循序存取、隨機存取。
一、循序存取(sequential access)
意指一組序列(例如存於記憶數組、磁盤軟體或是磁帶中的資料)是以預先安排,有秩序的方式被人存取。循序存取有時只是唯一的存取數據方式,磁帶即屬一例。循序存取亦有可能成為有選擇性的方式,就如我們純粹有意順序處理一組資料元件。
資料寫入檔案時,附加檔案尾端,讀取時,由檔案的開端由前往後一個字元一個字元讀出。常見於文字檔方式。
二、隨機存取(random access)
又稱直接存取(direct access),代表同一時間存取一組序列中的一個隨意元件。反之則稱循序存取,即是需要更多時間去存取一個遠端元件。介分兩者的傳統圖解就似比較一軸古代畫卷(循序︰所有在元件之前的物料必須事先捲開)及一本圖書(隨機︰可以隨時翻至任何一頁)。而更近現代的例子就如比較卡式磁帶。
資料是以一筆紀錄(結構型態)作為單位寫入檔案,用每一筆紀錄長度相同,可利用目前資料紀錄所在位置,算出實際資料位置並取得資料。常見於二進制檔。
有緩衝區與無緩衝區的檔案處理

C語言
檔案處理函數 fopen()

開啟檔案的範例
stdio.h 標頭檔中的檔案處理函數


寫入檔案(1) - 範例
使用輸出轉向來把printf的結果轉到一個檔案中, 其實就算是最簡單的寫檔案方式了. 輸出轉向的工作, 可以由程式碼來完成.
寫入檔案(2) - 範例
此方法執行完,可以自動打開test.txt檔案。
FILE *的指標
C函式庫中已經宣告好3個FILE *的指標, 分別是stdin, stdout, stderr. 1.printf("...")事實上是呼叫fprintf( stdout, "...."). 2.scanf("...")事實上是呼叫fsanf( stdin, "..." ). 3.fprintf( stderr, "....")所印在螢幕上的東西不會被輸出轉向所影響.
文字檔 input/output - 範例
使用文字檔時的兩個主要函式就是fprintf/fscanf. 它們的用法和printf/scanf幾乎完全一樣, 只差在需要指定它們input/output的來源/目標.
文字檔 迴圈(1)- 範例
文字檔 迴圈(2)- 範例
每執行一個fflush就會更新一次檔案的內容.
除了fprintf/fscanf, 文字檔還有fputc/fgetc可以用, 用法和putc/getc幾乎一樣
二進位檔 寫入檔案(1)-範例
二進位檔 寫入檔案(2) fread/fwrite-範例
二進位檔 寫入檔案(3) -範例
二進位檔可以很快的讀/寫入一組數列
二進位檔 struct -範例
struct經當會使用在檔案讀寫中. 舉例, 假如現在訂好一個檔案結構用來記錄全班同學的基本資料, 每個同學需要記錄的資料有姓名, 身高, 體重, 年齡. 姓名在20字母以下, 身高體重都用float來記, 年齡用整數來記錄.
二進位檔 不使用 struct -範例
C++ 語言
檔案的輸出入
負責檔案輸出入的類別有 ifstream (檔案輸入)、ofstream (檔案輸出) 以及 fstream (檔案輸出入)。請注意所謂檔案的 IO (輸入 \ 輸出),是以程 式的角度而言,因此,檔案開啟為輸入狀態時,表示程式將由檔案讀入資(in),而 不是指將資料輸入檔案。檔案開啟為輸出狀態時,表示程式將輸出資料到檔案。為了避免混淆,我們將資料由檔案輸入到程式稱之為讀取,將資料由檔案輸出到程式稱之為寫入。

fstream類別的使用
fstream是一個由C++提供的類別,可以用 於將資料寫入檔案,或讀取檔案資料。欲使用fstream類別執行檔案的 IO時,必須先 宣告一個 fstream類別物件。
然後利用fstream所提供的open成員函數,開啟一個檔案。傳入open函數的參 數有兩個,分別為 :欲開啟檔案名稱 、開啟該檔案的模式參數
若傳入的參數超過兩個可用 | 分開

常用的檔案處理函數:
函數
說明
open(str,mode)
以mode模式開啟名為str的檔案
close( )
關閉檔案
is_open( )
檢查檔案是否為開啟狀態, 若是則傳回true,否則傳回flase
write(str,size)
將str陣列中size個字元寫入到檔案中
read(str,size)
從檔案中讀取資料至檔案結 尾為止設定給str陣列,但至多不超過size個 字元
寫入檔案(1)- 範例
寫入檔案 將資料輸岀至檔案(2)- 範例
寫入檔案 由檔案讀取資料(3)- 範例
循序檔的使用
類似DOS-範例
寫作一個類似dos指令type的讀檔程式
隨機讀取檔的使用
類似copy
寫作一個類似copy的程式
fseek是隨機讀取用的函式。
fseek( FILE *, location, from_where ); from_where可以代入
SEEK_SET把讀寫位置設定成從檔案開頭開始向後算的第location個位置.(所以location要>=0才有意義)
SEEK_END把讀寫位置設定成從檔案結尾開始向後算的第location個位置.(所以location要<=0才有意義)
SEEK_CUR把讀寫位置設定成從檔案目前讀取位置開始向後算的第location個位置.(所以location0向後移)
ftell會傳回目前檔案的讀寫位置. 所以, 下面的動作可以得知檔案的長度.
寫一程式讓使用者查尋學生成績
最后更新于
这有帮助吗?