第 10 章  檔案說明與處理 檔案存取的基本觀念 文字檔處理 上機實習課程
檔案結構  <ul><li>通常在作業系統的檔案管理中,是採用「樹狀結構」( Tree Structure )的方式來儲存各種資料檔案。 </li></ul><ul><li>單一磁碟機可視為一棵倒立樹木,樹根的位置就如同磁碟機的根目錄。 </l...
<ul><li>在「樹節」中可能還會有「子樹節」來包含其它的「樹葉」,這也相對於「資料夾」中可能包含了「子資料夾」及「檔案」。 </li></ul><ul><li>整個檔案結構會依照上述的方式逐漸往下發展,而形成一個完整的結構。 </li></...
<ul><li>清楚了檔案結構後,當要表示某一個檔案的儲存路徑或位置時,通常會採用下面的表示方法: </li></ul><ul><li>例如: C:WINDOWSSYSTEMCONTROL.TXT ,表示「 CONTROL.TXT 」檔案位於 ...
資料流與緩衝區簡介 <ul><li>資料流 (stream) 主要是作為程式與周邊的資料傳輸管道,本章所談的都是指檔案資料流而言。 </li></ul><ul><li>在進行 C 語言的檔案存取時,都會先進行「開啟檔案」的動作,這個動作即是在開...
<ul><li>緩衝區 (buffer) 是記憶體中的一塊空間,當進行檔案輸入輸出時,其實並不會直接對磁碟進行存取,而是先開啟資料流,將磁碟上的檔案資訊放置到緩衝區中,而程式則從緩衝區中存取所需的資料。 </li></ul><ul><li>緩衝...
文字檔與二進位檔案 (1) <ul><li>文字檔 </li></ul><ul><ul><li>文字檔案會以字元編碼的方式進行儲存,在 Windows 作業系統中副檔名為 txt 的檔案,就是屬於文字檔案。 </li></ul></ul><ul...
文字檔與二進位檔案 (2) <ul><li>二進位檔案 </li></ul><ul><ul><li>是將記憶體中的資料原封不動的儲存至檔案之中,適用於非字元為主的資料。 </li></ul></ul><ul><ul><li>舉個例子來說,如果在...
檔案存取方式 <ul><li>存取檔案的時候,可能是循序式( sequential access )的存取,也就是由上往下讀取檔案的內容,如果要儲存資料時,通常將資料附加在檔案的尾端,這種存取方式通常使用於文字檔案,而被存取的檔案則稱之為循序存...
檔案的開啟與關閉 (1) <ul><li>要進行檔案的處理動作時,除了必須含括 stdio.h 標頭檔,還必須宣告一個指向檔案的 FILE 型態指標。 </li></ul><ul><li>FILE 是 stdio.h 中所定義的結構,下面所列出...
<ul><li>要進行檔案的存取,必先開啟資料流,也就是進行開啟檔案的動作,在標準 I/O 中要進行檔案的開啟,則是使用 fopen() 這個函數。 </li></ul><ul><li>fopen() 函數會傳回一個結構指標位址,您只要將這個位...
<ul><li>此處的檔案名稱,可以包括檔案路徑,如果沒有指定則預設為目前的工作目錄。 </li></ul><ul><li>而存取模式字串則如下所示: </li></ul>10-2  文字檔處理       開啟一個已存在的檔案,所寫入的檔案會...
<ul><li>檔案處理完畢後,最好要記得關閉檔案。 </li></ul><ul><li>關閉檔案的指令宣告如下: </li></ul>10-2  文字檔處理   fclose( 檔案指標變數 );
檔案的開啟與關閉 (2) <ul><li>程式範例:檔案開啟與關閉的基本範例: CH10_01.c </li></ul>10-2  文字檔處理
<ul><li>執行結果  </li></ul>10-2  文字檔處理
<ul><li>程式解說  </li></ul>10-2  文字檔處理   第 6 行中建立檔案變數指標。第 10 行輸入準備開啟的檔案名稱。 第 11 行宣告以唯讀方式開啟檔案。 第 13 行如果檔案開啟成功,則不會傳回一個 NULL ,並且...
<ul><li>如果想要逐一將字元寫入檔案中,則可以使用 fputc() 函數,使用格式如下: </li></ul><ul><li>例如: </li></ul><ul><li>ch 為所要寫入的字元,而 fptr 為所開啟檔案的結構指標, fp...
<ul><li>fgetc() 函數的定義如下: </li></ul><ul><li>例如: </li></ul><ul><li>如果字元讀取成功,則傳回所讀取的字元值,否則就傳回 EOF ( End of File )。  </li></ul...
fputc() 函數與 fgetc() 函數 (2) <ul><li>程式範例: fputc() 函數與 fgetc() 函數的基本範例: CH10_02.c  </li></ul>10-2  文字檔處理
10-2  文字檔處理
<ul><li>執行結果 </li></ul><ul><li>程式解說  </li></ul>10-2  文字檔處理   第 11 行檢查檔案是否開啟成功。第 15 行如果輸入不為 Enter 鍵,則繼續迴圈。 第 16 行將字元寫入檔案。第 ...
<ul><li>程式範例: fputc() 函數與 fgetc() 函數的拷貝檔案範例: CH10_03.c  </li></ul>10-2  文字檔處理
10-2  文字檔處理
<ul><li>執行結果 </li></ul><ul><li>程式解說  </li></ul>10-2  文字檔處理   第 11 行以寫入方式開啟“油漆式記憶法拷貝版 .txt” ,並將 fptr1 指標指向此檔案。 第 18 行從 fptr...
<ul><li>使用 fputs() 函數將一個字串寫入至檔案中,使用格式如下: </li></ul><ul><li>例如:  </li></ul>fpus() 函數與 fgets() 函數 (1) 10-2  文字檔處理   fputs(&q...
<ul><li>如果要讀取檔案中的一個字串,可使用 fgets() 函數,使用格式如下: </li></ul><ul><li>例如:  </li></ul>10-2  文字檔處理   fgets(&quot; 讀出字串 &quot;,  字串長...
fpus() 函數與 fgets() 函數 (2) <ul><li>程式範例: fputs() 函數與 fgets() 函數的基本範例: CH10_04.c </li></ul>10-2  文字檔處理
10-2  文字檔處理
<ul><li>執行結果  </li></ul>10-2  文字檔處理
<ul><li>程式解說  </li></ul>10-2  文字檔處理   第 18 行以 fgets() 函數寫入檔案,第 19 行則以 fgetc() 函數來每筆資料的尾端加上換行字元。 第 24 行檢查檔案是否開啟成功 , 並宣告以新增模...
fpus() 函數與 fgets() 函數 (3) <ul><li>程式範例: fputs() 函數與 fgets() 函數的拷貝檔案範例: CH10_05.c  </li></ul>10-2  文字檔處理
10-2  文字檔處理
<ul><li>執行結果  </li></ul><ul><li>程式解說  </li></ul>10-2  文字檔處理   第 14 行如果檔案未結束 , 則執行迴圈。 第 17 行將 str 字串存入 fptr1 所指向的檔案。 第 25 行...
fprintf() 函數與 fscanf() 函數 (1)  <ul><li>fprintf() 函數的使用格式如下: </li></ul><ul><li>例如 :  </li></ul>10-2  文字檔處理   fprintf( 檔案指標變...
<ul><li>fscanff() 函數的使用格式如下: </li></ul><ul><li>例如 :  </li></ul>10-2  文字檔處理   fscanff( 檔案指標變數 , 格式化字串 , 變數 1 位址 , 變數 2 位址… ...
fprintf() 函數與 fscanf() 函數 (2) <ul><li>程式範例: fprintf() 函數與 fscanf() 函數的宣告與應用範例: CH10_06.c </li></ul>10-2  文字檔處理
10-2  文字檔處理
<ul><li>執行結果  </li></ul>10-2  文字檔處理
<ul><li>程式解說  </li></ul>10-2  文字檔處理   第 4~10 行定義結構  , 這個 student 結構為全域性的結構型態。 第 16~17 行宣告並初始化這 5 個學生的各種成績資料。 第 20 行檢查檔案是否開...
fwrite() 函數與 fread() 函數 (1) <ul><li>fwrite() 函數使用格式如下: </li></ul><ul><li>例如:  </li></ul>10-2  文字檔處理   fwrite(&quot; 寫入資料位址...
<ul><li>如果想要 fwrite() 函數所寫入的資料內容,就必須採取 fread() 函數來讀取檔案,才可以正確讀出有意義的資訊。使用格式如下:  </li></ul>10-2  文字檔處理   fread(&quot; 寫入資料位址 ...
fwrite() 函數與 fread() 函數 (2) <ul><li>程式範例: fwite() 函數與 fread() 函數的宣告與應用範例: CH10_07.c  </li></ul>10-2  文字檔處理
10-2  文字檔處理
<ul><li>執行結果  </li></ul><ul><li>程式解說  </li></ul>10-2  文字檔處理   第 15~16 行如果輸入不為 Enter 鍵,則繼續迴圈,並將字元寫入字元陣列。 第 18 行必須加上空字元。 第 1...
<ul><li>我們可以直接製作個簡單的範例,看看如何使用 fwrite() 函數寫入二進位資料至檔案中,第 10 行是以 wb 模式,表示開啟二進位檔案進行讀取動作,不寫入任何內容開啟,“ b” 表示為二進位模式。 </li></ul><ul...
fwrite() 函數與 fread() 函數 (3) <ul><li>程式範例: fwrite() 函數寫入二進位資料檔的應用範例: CH10_08.c  </li></ul>10-2  文字檔處理
<ul><li>執行結果  </li></ul>10-2  文字檔處理
<ul><li>程式解說  </li></ul>10-2  文字檔處理   第 15 行由於 fwrite() 的緩衝區位址預設為 char 資料型態,所以在第 15 行中必須先經過型態轉換,並且每次讀取一個位元組。 第 16 行以 fwrit...
fwrite() 函數與 fread() 函數 (4) <ul><li>程式範例: fread() 函數與二進位檢視器的應用範例: CH10_09.c  </li></ul>10-2  文字檔處理
10-2  文字檔處理
<ul><li>執行結果 </li></ul><ul><li>程式解說  </li></ul>10-2  文字檔處理   第 16 行每次讀取一個位元組。 第 17 行如果小於 0xF ,於顯示上補 0 。 第 22 行中每顯示 16 位元組換...
fwrite() 函數與 fread() 函數 (5) <ul><li>程式範例: fread() 函數讀取二進位檔的應用範例: CH10_10.c </li></ul>10-2  文字檔處理
<ul><li>執行結果  </li></ul>10-2  文字檔處理
<ul><li>程式解說  </li></ul>10-2  文字檔處理   第 16~18 行讀取字元、整數與整數陣列。 第 20~22 行輸出字元、整數與整數陣列。
<ul><li>每次使用檔案存取函數一次,檔案讀取游標都會往下一個位置移動,例如 rewind() 這個函數,它可以將檔案讀取游標返回檔案的開頭。使用格式如下:  </li></ul><ul><li>像 fgetc() 函數讀取完畢後會移動一個...
<ul><li>檔案中也可以藉由 fseek() 函數來操作讀取游標,使用格式如下: </li></ul><ul><li>所謂位移量,單位是位元組,由游標起始點向前或向後的位移量。 </li></ul><ul><li>而起點參數則是游標起始點設...
隨機存取檔案 (2) <ul><li>程式範例: fseek() 函數與移動讀取游標的應用範例: CH10_11.c </li></ul>10-2  文字檔處理
10-2  文字檔處理
<ul><li>執行結果 </li></ul><ul><li>程式解說  </li></ul>10-2  文字檔處理   第 16 行 SEEK_SET 常數的應用,第 18 行 SEEK_CUR 常數的應用。 第 21 行 SEEK_END ...
隨機存取檔案 (3) <ul><li>程式範例: fseek() 函數與移動讀取游標來修正檔案中字串的範例: CH10_12.c  </li></ul>10-2  文字檔處理
10-2  文字檔處理
<ul><li>執行結果 </li></ul><ul><li>程式解說  </li></ul>10-2  文字檔處理   第 10 行為了要能保留原有的字串,我們在檔案存取模式上設定為“ r+” ,表示可讀取檔案,並可修改檔案內容。 第 17 ...
隨機存取檔案 (4) <ul><li>程式範例: fwrite() 函數與寫入一個結構的應用範例: CH10_13.c  </li></ul>10-2  文字檔處理
10-2  文字檔處理
<ul><li>執行結果 </li></ul><ul><li>程式解說  </li></ul>10-2  文字檔處理   第 16~20 行讀入三筆學生資料。 第 22 行以寫入方式開啟二進位檔。 第 26~27 行以 fwrite() 函數寫...
隨機存取檔案 (5) <ul><li>程式範例: fread() 函數與讀出一個結構的應用範例: CH10_14.c  </li></ul>10-2  文字檔處理
10-2  文字檔處理
10-2  文字檔處理
<ul><li>執行結果  </li></ul><ul><li>程式解說  </li></ul>10-2  文字檔處理   第 16 行開啟一個已經存在的二進位檔案,以進行讀取或修改,也可以寫作 r+b 。 第 28 行以 fseek() 函數...
無緩衝區檔案處理函數 (1)  <ul><li>無緩衝區檔案處理函數定義於 io.h 與 fcntl.h 中,其中 io.h 是無緩衝區檔案存取函數所定義的標頭檔, fcntl.h 是開啟模式常數所定義的標頭檔。 </li></ul><ul><...
<ul><li>關閉檔案時,則將檔案處理代碼傳遞給 close() 函數即可,如果 close() 函數執行成功,則傳回檔案處理代碼,若執行失敗則傳回 -1 。 </li></ul><ul><li>使用格式如下: </li></ul><ul><...
<ul><li>無緩衝區檔案處理函數函數的寫入與讀取函數分別為 write() 與 read() 函數,其定義上與 fread() 與 fwrite() 函數是類似的,都可一次處理整個區塊的資料。使用格式如下: </li></ul><ul><l...
無緩衝區檔案處理函數 (2) <ul><li>程式範例:無緩衝區檔案處理的 write() 與 read() 函數範例: CH10_15.c  </li></ul>10-2  文字檔處理
10-2  文字檔處理
10-2  文字檔處理
<ul><li>執行結果 </li></ul><ul><li>程式解說  </li></ul>10-2  文字檔處理   第 3 行 O_CREAT 常數所定義的標頭檔。 第 4 行無緩衝區檔案存取函數所定義的標頭檔。 第 9 行自行設置緩衝區...
上機實習課程 (1)  <ul><li>上機實習範例: CH10_16.c </li></ul><ul><ul><li>請設計一程式來逐字讀取 test.txt 的檔案內容,並將所有英文字元以大寫及每行 20 個字元輸出。  </li></ul...
10-3  上機實習課程
<ul><li>執行結果  </li></ul>10-3  上機實習課程
上機實習課程 (2) <ul><li>上機實習範例: CH10_17.c </li></ul><ul><ul><li>以下程式範例中,將檢視 fgetc() 讀取完畢後會移動一個位元組,而由於指定了 fgets() 的 lentgh 長度為 1...
10-3  上機實習課程
<ul><li>執行結果  </li></ul>10-3  上機實習課程
上機實習課程 (3) <ul><li>上機實習範例: CH10_18.c </li></ul><ul><ul><li>現在有一「學生成績檔 .txt 」,分別存放學號、姓名與成績,其中學號 (10001~10005) 與成績是以整數格式。 </...
10-3  上機實習課程
10-3  上機實習課程
<ul><li>執行結果  </li></ul>10-3  上機實習課程
上機實習課程 (4) <ul><li>上機實習範例: CH10_19.c </li></ul><ul><ul><li>以下這個程式範例使用命令列引數來任意指定所要的檔案名稱,並實作所有的錯誤檢查動作,包括開啟檔案、讀取與寫入、關閉檔案等。 </...
10-3  上機實習課程
<ul><li>執行結果  </li></ul>10-3  上機實習課程
上機實習課程 (5) <ul><li>上機實習範例: CH10_20.c </li></ul><ul><ul><li>延續上題,以下這個程式範例也是使用命令列引數來任意指定所要的檔案名稱,並使用它來計算指定檔案的容量。 </li></ul></...
10-3  上機實習課程
<ul><li>執行結果  </li></ul>10-3  上機實習課程
上機實習課程 (6) <ul><li>上機實習範例: CH10_21.c </li></ul><ul><ul><li>延續上題,以下這個程式範例是利用 fgetc() 函式一次讀取一個位元的特性,製作一個檔案複製程式,這個程式可以複製文字檔或是...
10-3  上機實習課程
<ul><li>執行結果  </li></ul>10-3  上機實習課程
上機實習課程 (7) <ul><li>上機實習範例: CH10_22.c </li></ul><ul><ul><li>延續上題,我們知道在網路上有一些看圖程式,多半具有可以直接比較兩個圖片的內容是否相同的功能。 </li></ul></ul><...
10-3  上機實習課程
<ul><li>執行結果  </li></ul>10-3  上機實習課程
上機實習課程 (8) <ul><li>上機實習範例: CH10_23.c </li></ul><ul><ul><li>以下這個程式片段是利用無緩衝區檔案處理函式寫入字串至檔案中,然後再開啟相同的檔案讀出所寫入的字串,我們設定了 buffer 緩...
10-3  上機實習課程
<ul><li>執行結果  </li></ul>10-3  上機實習課程
Upcoming SlideShare
Loading in …5
×

10 檔案說明與處理

3,008 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
3,008
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
44
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

10 檔案說明與處理

  1. 1. 第 10 章 檔案說明與處理 檔案存取的基本觀念 文字檔處理 上機實習課程
  2. 2. 檔案結構 <ul><li>通常在作業系統的檔案管理中,是採用「樹狀結構」( Tree Structure )的方式來儲存各種資料檔案。 </li></ul><ul><li>單一磁碟機可視為一棵倒立樹木,樹根的位置就如同磁碟機的根目錄。 </li></ul><ul><li>在樹根底下可能會有「樹節」或「樹葉」,其中「樹節」可比喻為「資料夾」,而「樹葉」則視為「檔案」。 </li></ul>10-1 檔案存取的基本觀念
  3. 3. <ul><li>在「樹節」中可能還會有「子樹節」來包含其它的「樹葉」,這也相對於「資料夾」中可能包含了「子資料夾」及「檔案」。 </li></ul><ul><li>整個檔案結構會依照上述的方式逐漸往下發展,而形成一個完整的結構。 </li></ul><ul><li>磁碟機中檔案結構如下圖所示: </li></ul>10-1 檔案存取的基本觀念
  4. 4. <ul><li>清楚了檔案結構後,當要表示某一個檔案的儲存路徑或位置時,通常會採用下面的表示方法: </li></ul><ul><li>例如: C:WINDOWSSYSTEMCONTROL.TXT ,表示「 CONTROL.TXT 」檔案位於 C 磁碟下的「 WINDOWS 」資料夾,的「 SYSTEM 」子資料夾內。 </li></ul>10-1 檔案存取的基本觀念 磁碟代號 : 資料夾名稱 資料夾名稱… 檔案名稱 . 副檔名
  5. 5. 資料流與緩衝區簡介 <ul><li>資料流 (stream) 主要是作為程式與周邊的資料傳輸管道,本章所談的都是指檔案資料流而言。 </li></ul><ul><li>在進行 C 語言的檔案存取時,都會先進行「開啟檔案」的動作,這個動作即是在開啟資料流,而「關閉檔案」這個動作,就是在關閉資料流。 </li></ul><ul><li>在 C 中主要是利用檔案處理函數來處理包括開啟檔案、讀取檔案、更新檔案與關閉檔案等動作。 </li></ul><ul><li>這些檔案處理函數通常以是否利用到緩衝區來區隔。 </li></ul>10-1 檔案存取的基本觀念
  6. 6. <ul><li>緩衝區 (buffer) 是記憶體中的一塊空間,當進行檔案輸入輸出時,其實並不會直接對磁碟進行存取,而是先開啟資料流,將磁碟上的檔案資訊放置到緩衝區中,而程式則從緩衝區中存取所需的資料。 </li></ul><ul><li>緩衝區的設置是為了存取效率上的考量,因為記憶體的存取速度會比磁碟機來得快速。 </li></ul>10-1 檔案存取的基本觀念
  7. 7. 文字檔與二進位檔案 (1) <ul><li>文字檔 </li></ul><ul><ul><li>文字檔案會以字元編碼的方式進行儲存,在 Windows 作業系統中副檔名為 txt 的檔案,就是屬於文字檔案。 </li></ul></ul><ul><ul><li>也是以二進位的方式儲存在磁碟中,只不過當您使用純文字編輯器開啟時,預設會進行字元比對的動作,並以相對應的編碼顯示文字檔案的內容。 </li></ul></ul>10-1 檔案存取的基本觀念
  8. 8. 文字檔與二進位檔案 (2) <ul><li>二進位檔案 </li></ul><ul><ul><li>是將記憶體中的資料原封不動的儲存至檔案之中,適用於非字元為主的資料。 </li></ul></ul><ul><ul><li>舉個例子來說,如果在記憶體中有兩個整數數值 511 與 255 要依序儲存至檔案中,則其儲存至檔案後的內容會如下所示(假設整數佔有兩個位元組的空間): </li></ul></ul>10-1 檔案存取的基本觀念
  9. 9. 檔案存取方式 <ul><li>存取檔案的時候,可能是循序式( sequential access )的存取,也就是由上往下讀取檔案的內容,如果要儲存資料時,通常將資料附加在檔案的尾端,這種存取方式通常使用於文字檔案,而被存取的檔案則稱之為循序存取檔案。 </li></ul><ul><li>另一種為隨機存取( random access ),您可以指定檔案讀取指標的位置,從檔案中的任一位置讀出或寫入資料,此時我們稱被存取的檔案為隨機存取檔案。 </li></ul>10-1 檔案存取的基本觀念
  10. 10. 檔案的開啟與關閉 (1) <ul><li>要進行檔案的處理動作時,除了必須含括 stdio.h 標頭檔,還必須宣告一個指向檔案的 FILE 型態指標。 </li></ul><ul><li>FILE 是 stdio.h 中所定義的結構,下面所列出的是 stdio.h 所定義的 FILE 結構: </li></ul>10-2 文字檔處理
  11. 11. <ul><li>要進行檔案的存取,必先開啟資料流,也就是進行開啟檔案的動作,在標準 I/O 中要進行檔案的開啟,則是使用 fopen() 這個函數。 </li></ul><ul><li>fopen() 函數會傳回一個結構指標位址,您只要將這個位址當作參數傳遞給其它函數就可以了,如果檔案開啟失敗,則會傳回一個 NULL 。 </li></ul><ul><li>在呼叫 fopen() 函數時,必須將所宣告 FILE 結構指標變數用來接收 fopen() 函數的傳回值。 </li></ul><ul><li>格式如下所示: </li></ul>10-2 文字檔處理 檔案指標變數 =fopen(&quot; 檔案名稱 &quot;,&quot; 存取模式字串 &quot;);
  12. 12. <ul><li>此處的檔案名稱,可以包括檔案路徑,如果沒有指定則預設為目前的工作目錄。 </li></ul><ul><li>而存取模式字串則如下所示: </li></ul>10-2 文字檔處理     開啟一個已存在的檔案,所寫入的檔案會附加在原檔案的尾端;如果指定的檔案不存在,則產生一個新的檔案,作用與 a 相同 a+ 產生一個新的檔案,以進行讀取或寫入,如果有同名檔案存在,則該檔案會被丟棄 w+ 開啟一個已經存在的檔案,以進行讀取或修改 r+ 開啟一個已存在的檔案,所寫入的檔案會附加在原檔案的尾端;如果指定的檔案不存在,則產生一個新的檔案 a 產生一個新的檔案,如果有同名檔案存在,則該檔案會被丟棄 w 開啟檔案進行讀取動作,不寫入任何內容 r 說明 存取模式
  13. 13. <ul><li>檔案處理完畢後,最好要記得關閉檔案。 </li></ul><ul><li>關閉檔案的指令宣告如下: </li></ul>10-2 文字檔處理 fclose( 檔案指標變數 );
  14. 14. 檔案的開啟與關閉 (2) <ul><li>程式範例:檔案開啟與關閉的基本範例: CH10_01.c </li></ul>10-2 文字檔處理
  15. 15. <ul><li>執行結果 </li></ul>10-2 文字檔處理
  16. 16. <ul><li>程式解說 </li></ul>10-2 文字檔處理 第 6 行中建立檔案變數指標。第 10 行輸入準備開啟的檔案名稱。 第 11 行宣告以唯讀方式開啟檔案。 第 13 行如果檔案開啟成功,則不會傳回一個 NULL ,並且輸出「這個檔案開啟成功 ! 」,否則「找不到檔案 , 開啟失敗」。
  17. 17. <ul><li>如果想要逐一將字元寫入檔案中,則可以使用 fputc() 函數,使用格式如下: </li></ul><ul><li>例如: </li></ul><ul><li>ch 為所要寫入的字元,而 fptr 為所開啟檔案的結構指標, fputc() 若寫入字元失敗,則傳回 EOF 值,否則就傳回寫入的字元值。 </li></ul><ul><li>在 C 中, EOF(End Of File) 是表示資料結尾的常數,其值為 -1 ,定義在 stdio.h 標頭檔中。 </li></ul>fputc() 函數與 fgetc() 函數 (1) 10-2 文字檔處理 fputc( 字元變數 , 檔案指標變數 ); fputc(ch,fptr);
  18. 18. <ul><li>fgetc() 函數的定義如下: </li></ul><ul><li>例如: </li></ul><ul><li>如果字元讀取成功,則傳回所讀取的字元值,否則就傳回 EOF ( End of File )。 </li></ul>10-2 文字檔處理 fgetc( 字元變數 , 檔案指標變數 ); fgetc(ch,fptr);
  19. 19. fputc() 函數與 fgetc() 函數 (2) <ul><li>程式範例: fputc() 函數與 fgetc() 函數的基本範例: CH10_02.c </li></ul>10-2 文字檔處理
  20. 20. 10-2 文字檔處理
  21. 21. <ul><li>執行結果 </li></ul><ul><li>程式解說 </li></ul>10-2 文字檔處理 第 11 行檢查檔案是否開啟成功。第 15 行如果輸入不為 Enter 鍵,則繼續迴圈。 第 16 行將字元寫入檔案。第 23~27 行逐字讀出字元。
  22. 22. <ul><li>程式範例: fputc() 函數與 fgetc() 函數的拷貝檔案範例: CH10_03.c </li></ul>10-2 文字檔處理
  23. 23. 10-2 文字檔處理
  24. 24. <ul><li>執行結果 </li></ul><ul><li>程式解說 </li></ul>10-2 文字檔處理 第 11 行以寫入方式開啟“油漆式記憶法拷貝版 .txt” ,並將 fptr1 指標指向此檔案。 第 18 行從 fptr 所指向檔案逐一讀出字元 ch ,並在第 19 行將 ch 字元寫入 fptr1 所指向檔案。 第 27 行以 feof() 函數來判斷檔案是否結束,第 31 行以 count 來控制每 30 個字元為一行輸出。
  25. 25. <ul><li>使用 fputs() 函數將一個字串寫入至檔案中,使用格式如下: </li></ul><ul><li>例如: </li></ul>fpus() 函數與 fgets() 函數 (1) 10-2 文字檔處理 fputs(&quot; 寫入字串 &quot;, 檔案指標變數 ); File *fptr; char str[20]; … .. fputs(str,fptr);
  26. 26. <ul><li>如果要讀取檔案中的一個字串,可使用 fgets() 函數,使用格式如下: </li></ul><ul><li>例如: </li></ul>10-2 文字檔處理 fgets(&quot; 讀出字串 &quot;, 字串長度 , 檔案指標變數 ); File *fptr; char str[20]; int length; … .. fgets(str,length,fptr);
  27. 27. fpus() 函數與 fgets() 函數 (2) <ul><li>程式範例: fputs() 函數與 fgets() 函數的基本範例: CH10_04.c </li></ul>10-2 文字檔處理
  28. 28. 10-2 文字檔處理
  29. 29. <ul><li>執行結果 </li></ul>10-2 文字檔處理
  30. 30. <ul><li>程式解說 </li></ul>10-2 文字檔處理 第 18 行以 fgets() 函數寫入檔案,第 19 行則以 fgetc() 函數來每筆資料的尾端加上換行字元。 第 24 行檢查檔案是否開啟成功 , 並宣告以新增模式寫入檔案。 第 29 行以新增模式寫入檔案 , 會加在原檔案後方。 第 37 行我們設定的讀取長度是 11 而不是 10 ,這是因為 fgets() 只會讀取 l1-1 的字串,並於最後一個位置加上‘ ’ 字元,並且如果不是 NULL 則執行 while 迴圈。 第 40 行以 count 值來計算此檔案的資料筆數。
  31. 31. fpus() 函數與 fgets() 函數 (3) <ul><li>程式範例: fputs() 函數與 fgets() 函數的拷貝檔案範例: CH10_05.c </li></ul>10-2 文字檔處理
  32. 32. 10-2 文字檔處理
  33. 33. <ul><li>執行結果 </li></ul><ul><li>程式解說 </li></ul>10-2 文字檔處理 第 14 行如果檔案未結束 , 則執行迴圈。 第 17 行將 str 字串存入 fptr1 所指向的檔案。 第 25 行以 fgets() 函數讀取 11 字元的字串,如果不是 NULL 則執行 while 迴圈。 第 27 行關閉檔案。
  34. 34. fprintf() 函數與 fscanf() 函數 (1) <ul><li>fprintf() 函數的使用格式如下: </li></ul><ul><li>例如 : </li></ul>10-2 文字檔處理 fprintf( 檔案指標變數 , 格式化字串 , 變數 1, 變數 2…); File *fptr; int math,eng; float average; fprintf(fptr, &quot;%d %d %f &quot;,math,enf,average);
  35. 35. <ul><li>fscanff() 函數的使用格式如下: </li></ul><ul><li>例如 : </li></ul>10-2 文字檔處理 fscanff( 檔案指標變數 , 格式化字串 , 變數 1 位址 , 變數 2 位址… ); File *fptr; int math,eng; float average; fprintf(fptr, &quot;%d %d %f &quot;,&math,&enf,&average);
  36. 36. fprintf() 函數與 fscanf() 函數 (2) <ul><li>程式範例: fprintf() 函數與 fscanf() 函數的宣告與應用範例: CH10_06.c </li></ul>10-2 文字檔處理
  37. 37. 10-2 文字檔處理
  38. 38. <ul><li>執行結果 </li></ul>10-2 文字檔處理
  39. 39. <ul><li>程式解說 </li></ul>10-2 文字檔處理 第 4~10 行定義結構 , 這個 student 結構為全域性的結構型態。 第 16~17 行宣告並初始化這 5 個學生的各種成績資料。 第 20 行檢查檔案是否開啟成功來寫入。 第 25 行以 fscanf() 函數寫入檔案。 第 29 行檢查檔案是否開啟成功來讀取。 第 35 行以 fscanf() 函數讀取檔案。
  40. 40. fwrite() 函數與 fread() 函數 (1) <ul><li>fwrite() 函數使用格式如下: </li></ul><ul><li>例如: </li></ul>10-2 文字檔處理 fwrite(&quot; 寫入資料位址 &quot;,&quot; 寫入資料單位大小 &quot;,&quot; 寫入資料的筆數 &quot;, 檔案指標變數 ); File *fptr; char str[20]; int count; fwrite(str,sizeof(char),count,fptr);
  41. 41. <ul><li>如果想要 fwrite() 函數所寫入的資料內容,就必須採取 fread() 函數來讀取檔案,才可以正確讀出有意義的資訊。使用格式如下: </li></ul>10-2 文字檔處理 fread(&quot; 寫入資料位址 &quot;,&quot; 寫入資料單位大小 &quot;,&quot; 寫入資料的筆數 &quot;, 檔案指標變數 );
  42. 42. fwrite() 函數與 fread() 函數 (2) <ul><li>程式範例: fwite() 函數與 fread() 函數的宣告與應用範例: CH10_07.c </li></ul>10-2 文字檔處理
  43. 43. 10-2 文字檔處理
  44. 44. <ul><li>執行結果 </li></ul><ul><li>程式解說 </li></ul>10-2 文字檔處理 第 15~16 行如果輸入不為 Enter 鍵,則繼續迴圈,並將字元寫入字元陣列。 第 18 行必須加上空字元。 第 19 行以 fwrite() 函數寫入 str 字串。 第 20 行 d 為一陣列名稱,可代表該陣列的位址。 第 27 行以 fread() 函數讀出字串內容。 第 31~32 行輸出所讀取陣列 d1 陣列內容。
  45. 45. <ul><li>我們可以直接製作個簡單的範例,看看如何使用 fwrite() 函數寫入二進位資料至檔案中,第 10 行是以 wb 模式,表示開啟二進位檔案進行讀取動作,不寫入任何內容開啟,“ b” 表示為二進位模式。 </li></ul><ul><li>以下是二進位檔的存取模式: </li></ul>10-2 文字檔處理 開啟一個已存在的二進位檔案,所寫入的檔案會附加在原檔案的尾端;如果指定的檔案不存在,則產生一個新的檔案 ab 產生一個新的二進位檔案,如果有同名檔案存在,則該原檔案會被丟棄,另開啟新檔案 wb 開啟二進位檔案進行讀取動作,不寫入任何內容 rb 說明 存取模式
  46. 46. fwrite() 函數與 fread() 函數 (3) <ul><li>程式範例: fwrite() 函數寫入二進位資料檔的應用範例: CH10_08.c </li></ul>10-2 文字檔處理
  47. 47. <ul><li>執行結果 </li></ul>10-2 文字檔處理
  48. 48. <ul><li>程式解說 </li></ul>10-2 文字檔處理 第 15 行由於 fwrite() 的緩衝區位址預設為 char 資料型態,所以在第 15 行中必須先經過型態轉換,並且每次讀取一個位元組。 第 16 行以 fwrite() 函數寫入字串,第 17 行以 fwrite() 函數寫入陣列。
  49. 49. fwrite() 函數與 fread() 函數 (4) <ul><li>程式範例: fread() 函數與二進位檢視器的應用範例: CH10_09.c </li></ul>10-2 文字檔處理
  50. 50. 10-2 文字檔處理
  51. 51. <ul><li>執行結果 </li></ul><ul><li>程式解說 </li></ul>10-2 文字檔處理 第 16 行每次讀取一個位元組。 第 17 行如果小於 0xF ,於顯示上補 0 。 第 22 行中每顯示 16 位元組換行。
  52. 52. fwrite() 函數與 fread() 函數 (5) <ul><li>程式範例: fread() 函數讀取二進位檔的應用範例: CH10_10.c </li></ul>10-2 文字檔處理
  53. 53. <ul><li>執行結果 </li></ul>10-2 文字檔處理
  54. 54. <ul><li>程式解說 </li></ul>10-2 文字檔處理 第 16~18 行讀取字元、整數與整數陣列。 第 20~22 行輸出字元、整數與整數陣列。
  55. 55. <ul><li>每次使用檔案存取函數一次,檔案讀取游標都會往下一個位置移動,例如 rewind() 這個函數,它可以將檔案讀取游標返回檔案的開頭。使用格式如下: </li></ul><ul><li>像 fgetc() 函數讀取完畢後會移動一個位元組,而在 fgets() 函數中,由於我們的 length 長度為 10 ,所以它一次會讀取 9 個位元組的長度(因為最後一個位元組必須填入 '' ),像這種讀取方式,可稱之為循序式讀取。 </li></ul>隨機存取檔案 (1) 10-2 文字檔處理 rewind( 檔案指標變數 );
  56. 56. <ul><li>檔案中也可以藉由 fseek() 函數來操作讀取游標,使用格式如下: </li></ul><ul><li>所謂位移量,單位是位元組,由游標起始點向前或向後的位移量。 </li></ul><ul><li>而起點參數則是游標起始點設定位移量的計算起點。共有 3 種巨集常數,說明如下: </li></ul>10-2 文字檔處理 fseek( 檔案指標變數 , 位移量 , 起點參數 ); 檔案尾端向前計算。 2 SEEK_END 目前的游標位置向後計算。 1 SEEK_CUR 檔案開頭向後計算。 0 SEEK_SET 說明 常數值 巨集常數
  57. 57. 隨機存取檔案 (2) <ul><li>程式範例: fseek() 函數與移動讀取游標的應用範例: CH10_11.c </li></ul>10-2 文字檔處理
  58. 58. 10-2 文字檔處理
  59. 59. <ul><li>執行結果 </li></ul><ul><li>程式解說 </li></ul>10-2 文字檔處理 第 16 行 SEEK_SET 常數的應用,第 18 行 SEEK_CUR 常數的應用。 第 21 行 SEEK_END 常數的應用。
  60. 60. 隨機存取檔案 (3) <ul><li>程式範例: fseek() 函數與移動讀取游標來修正檔案中字串的範例: CH10_12.c </li></ul>10-2 文字檔處理
  61. 61. 10-2 文字檔處理
  62. 62. <ul><li>執行結果 </li></ul><ul><li>程式解說 </li></ul>10-2 文字檔處理 第 10 行為了要能保留原有的字串,我們在檔案存取模式上設定為“ r+” ,表示可讀取檔案,並可修改檔案內容。 第 17 行以 fseek() 函數來從檔案後端移動。 第 20 行移到檔案最前端,也可以使用 fseek(fptr, 0, SEEK_SET) 指令來達到同樣效果。
  63. 63. 隨機存取檔案 (4) <ul><li>程式範例: fwrite() 函數與寫入一個結構的應用範例: CH10_13.c </li></ul>10-2 文字檔處理
  64. 64. 10-2 文字檔處理
  65. 65. <ul><li>執行結果 </li></ul><ul><li>程式解說 </li></ul>10-2 文字檔處理 第 16~20 行讀入三筆學生資料。 第 22 行以寫入方式開啟二進位檔。 第 26~27 行以 fwrite() 函數寫入結構資料。
  66. 66. 隨機存取檔案 (5) <ul><li>程式範例: fread() 函數與讀出一個結構的應用範例: CH10_14.c </li></ul>10-2 文字檔處理
  67. 67. 10-2 文字檔處理
  68. 68. 10-2 文字檔處理
  69. 69. <ul><li>執行結果 </li></ul><ul><li>程式解說 </li></ul>10-2 文字檔處理 第 16 行開啟一個已經存在的二進位檔案,以進行讀取或修改,也可以寫作 r+b 。 第 28 行以 fseek() 函數移動從檔案開頭向後計算 (number-1)*sizeof(struct student) 位元組。 第 40~42 行以 fwrite() 函數寫入檔案。
  70. 70. 無緩衝區檔案處理函數 (1) <ul><li>無緩衝區檔案處理函數定義於 io.h 與 fcntl.h 中,其中 io.h 是無緩衝區檔案存取函數所定義的標頭檔, fcntl.h 是開啟模式常數所定義的標頭檔。 </li></ul><ul><li>提醒大家如果要使用無緩衝區檔案處理函數,必須加入 io.h 、 fcntl.h 與 sys/stat.h 三個檔案含括進來。 </li></ul><ul><li>其中要開啟與關閉檔案,分別是使用 open() 函數與 close() 函數,首先我們來介紹 open() 函數的使用格式如下: </li></ul>10-2 文字檔處理 open(&quot; 檔案名稱 &quot;, 開啟模式 , 存取屬性 );
  71. 71. <ul><li>關閉檔案時,則將檔案處理代碼傳遞給 close() 函數即可,如果 close() 函數執行成功,則傳回檔案處理代碼,若執行失敗則傳回 -1 。 </li></ul><ul><li>使用格式如下: </li></ul><ul><li>例如: </li></ul>10-2 文字檔處理 close( 檔案處理代碼 ); close(fpt1);
  72. 72. <ul><li>無緩衝區檔案處理函數函數的寫入與讀取函數分別為 write() 與 read() 函數,其定義上與 fread() 與 fwrite() 函數是類似的,都可一次處理整個區塊的資料。使用格式如下: </li></ul><ul><li>例如: </li></ul>10-2 文字檔處理 write( 檔案處理代碼 , 緩衝區變數 , 緩衝區變數大小位元組 ); read( 檔案處理代碼 , 緩衝區變數 , 緩衝區變數大小位元組 ); write(fpt1, buffer, sizeof(buffer)); /* 在 fpt1 檔案 , 每次寫入 256 個位元組 */ bytes=read(fptl, buffer, sizeof(buffer));/* 從 fpt1 檔案 , 每次讀取 256 個位元組, bytes 為實際的傳回讀取位元組 */
  73. 73. 無緩衝區檔案處理函數 (2) <ul><li>程式範例:無緩衝區檔案處理的 write() 與 read() 函數範例: CH10_15.c </li></ul>10-2 文字檔處理
  74. 74. 10-2 文字檔處理
  75. 75. 10-2 文字檔處理
  76. 76. <ul><li>執行結果 </li></ul><ul><li>程式解說 </li></ul>10-2 文字檔處理 第 3 行 O_CREAT 常數所定義的標頭檔。 第 4 行無緩衝區檔案存取函數所定義的標頭檔。 第 9 行自行設置緩衝區 , 一次可讀取 512 個位元組。 第 10 行宣告兩個檔案處理代碼 , 與可處理的位元組數。 第 21 行從 fpt1 檔案 , 每次讀取 256 個位元組。 第 28 行以附加的方式開啟檔案。第 33 行新加一筆檔案內容。 第 44 行從 fpt2 檔案 , 每次讀取 512 個位元組。
  77. 77. 上機實習課程 (1) <ul><li>上機實習範例: CH10_16.c </li></ul><ul><ul><li>請設計一程式來逐字讀取 test.txt 的檔案內容,並將所有英文字元以大寫及每行 20 個字元輸出。 </li></ul></ul>10-3 上機實習課程
  78. 78. 10-3 上機實習課程
  79. 79. <ul><li>執行結果 </li></ul>10-3 上機實習課程
  80. 80. 上機實習課程 (2) <ul><li>上機實習範例: CH10_17.c </li></ul><ul><ul><li>以下程式範例中,將檢視 fgetc() 讀取完畢後會移動一個位元組,而由於指定了 fgets() 的 lentgh 長度為 10 ,所以它一次會讀取 9 個位元組的長度(因為最後一個位元組必須填入 '' )。 </li></ul></ul>10-3 上機實習課程
  81. 81. 10-3 上機實習課程
  82. 82. <ul><li>執行結果 </li></ul>10-3 上機實習課程
  83. 83. 上機實習課程 (3) <ul><li>上機實習範例: CH10_18.c </li></ul><ul><ul><li>現在有一「學生成績檔 .txt 」,分別存放學號、姓名與成績,其中學號 (10001~10005) 與成績是以整數格式。 </li></ul></ul><ul><ul><li>而姓名則宣告為可存放 20 字元,請利設計一程式,利用 fscanf() 函數由檔案中取得指定的資料,並可針對學號進行成績查詢的動作,或是列出大於某個成績的紀錄,在此使用了 rewind() 函數,它可以將檔案讀取游標返回檔案的開頭。 </li></ul></ul>10-3 上機實習課程
  84. 84. 10-3 上機實習課程
  85. 85. 10-3 上機實習課程
  86. 86. <ul><li>執行結果 </li></ul>10-3 上機實習課程
  87. 87. 上機實習課程 (4) <ul><li>上機實習範例: CH10_19.c </li></ul><ul><ul><li>以下這個程式範例使用命令列引數來任意指定所要的檔案名稱,並實作所有的錯誤檢查動作,包括開啟檔案、讀取與寫入、關閉檔案等。 </li></ul></ul><ul><ul><li>請進入 Windows 作業系統下的命令提示字元視窗。 </li></ul></ul><ul><ul><li>再利用 Dos 指令 ( 如 cd 指令 ) 切換到此程式執行檔所在目錄。 </li></ul></ul><ul><ul><li>當執行時,建議輸入以下指令: </li></ul></ul>10-3 上機實習課程 C:>CH10_19 報導內容 .txt
  88. 88. 10-3 上機實習課程
  89. 89. <ul><li>執行結果 </li></ul>10-3 上機實習課程
  90. 90. 上機實習課程 (5) <ul><li>上機實習範例: CH10_20.c </li></ul><ul><ul><li>延續上題,以下這個程式範例也是使用命令列引數來任意指定所要的檔案名稱,並使用它來計算指定檔案的容量。 </li></ul></ul><ul><ul><li>由於是 fgetc() 函式一次可以讀取一個字元,也就是一個位元組的大小,所以只要每讀出一個位元組計數一次即可。建議輸入以下指令: </li></ul></ul>10-3 上機實習課程 C:>CH10_20 報導內容 .txt
  91. 91. 10-3 上機實習課程
  92. 92. <ul><li>執行結果 </li></ul>10-3 上機實習課程
  93. 93. 上機實習課程 (6) <ul><li>上機實習範例: CH10_21.c </li></ul><ul><ul><li>延續上題,以下這個程式範例是利用 fgetc() 函式一次讀取一個位元的特性,製作一個檔案複製程式,這個程式可以複製文字檔或是二進位檔。 </li></ul></ul><ul><ul><li>請注意!在開啟檔案時,必須以二進位的方式開啟,也就是在存取模式上加上“ b” 表示二進位模式,否則的話在複製二進位檔案時,檔案資訊將會不完全。 </li></ul></ul><ul><ul><li>建議輸入以下指令: </li></ul></ul>10-3 上機實習課程 C:>CH10_21 報導內容 .txt 報導內容拷貝 .txt
  94. 94. 10-3 上機實習課程
  95. 95. <ul><li>執行結果 </li></ul>10-3 上機實習課程
  96. 96. 上機實習課程 (7) <ul><li>上機實習範例: CH10_22.c </li></ul><ul><ul><li>延續上題,我們知道在網路上有一些看圖程式,多半具有可以直接比較兩個圖片的內容是否相同的功能。 </li></ul></ul><ul><ul><li>其實就是直接比較兩個圖片檔案中每一個位元組,如果每個位元組的值都相同,當然表示兩張圖片內容一樣。 </li></ul></ul><ul><ul><li>以下這個程式範例是使用命令列引數來讓您進行檔案的比對,看看兩個檔案內容是否一樣。 </li></ul></ul><ul><ul><li>建議輸入以下指令: </li></ul></ul>10-3 上機實習課程 C:>CH10_22 score.bin scorecopy.bin
  97. 97. 10-3 上機實習課程
  98. 98. <ul><li>執行結果 </li></ul>10-3 上機實習課程
  99. 99. 上機實習課程 (8) <ul><li>上機實習範例: CH10_23.c </li></ul><ul><ul><li>以下這個程式片段是利用無緩衝區檔案處理函式寫入字串至檔案中,然後再開啟相同的檔案讀出所寫入的字串,我們設定了 buffer 緩衝區以暫存寫入或讀出的字串。 </li></ul></ul>10-3 上機實習課程
  100. 100. 10-3 上機實習課程
  101. 101. <ul><li>執行結果 </li></ul>10-3 上機實習課程

×