CH16 檔案處理

Download Report

Transcript CH16 檔案處理

第十六章
檔案處理
課前指引
在 C++ 語言,定義一個抽象的概念,稱為串流 ( 或資料流)提供系統
對 I/O 讀取和寫入具有一致的介面。所謂串流就是一連串的資料,它
分為輸入串流和輸出串流兩種。C++ 語言將許多的裝置如螢幕、鍵盤、
記憶體和磁碟的存取,均以串流的方式來存取,因此其存取的語法都
非常類似。C++ 提供 fstream 類別,可以用來讀取檔案資料,也可將
資料寫入檔案儲存fstream 類別可存取文字檔和二進位檔案。
章節大綱
16-1 檔案處理
16-2 檔案讀取與寫入
16-3 二進位檔案的處理
16-4 資訊學科能力競賽範例
備註:可依進度點選小節
16.1 檔案處理
在真實世界裡,資料會儲存在記憶體和磁碟
中,然後讀取這些資料並加以修改、統計和
分析,再將這些資料列印、顯示在螢幕或是
儲存起來。
這些資料存取的動作,通常透過資料輸入
(input)、輸出 (output) 的機制來完成。
3
16.1 檔案處理
何謂串流?(stream)
在 C++ 語言,定義一個抽象的概念,稱為串流 (
或資料流),提供系統對 I/O 讀取和寫入具有一
致的介面。
所謂串流就是一連串的資料,它分為輸入串流和
輸出串流兩種。
C++ 語言將許多的裝置如螢幕、鍵盤、記憶體和
磁碟的存取,均以串流的方式來存取,因此其存
取的語法都非常類似。
4
16.1 檔案處理
串流類別
C++ 提供 ios 類別 (input/output stream),再
透過 ios 類別衍生子類別 istream和 ostream,
istream 又衍生 ifstream 類別可以用來讀取檔
案資料、ostream 則衍生ofstream 類別可將資料
寫入檔案儲存,而 fstream 類別則是由 istream
和 ostream共同衍生,可以用來讀取檔案資料,
也可將資料寫入檔案儲存。
5
16.1 檔案處理
串流類別
可以建立物件,讀取檔案或寫入檔案的類別整理
如下。
ifstream 類別可以用來讀取檔案資料。
ofstream 類別可將資料寫入檔案儲存。
fstream 類別可以讀取檔案資料,也可將資料寫入檔案
儲存。
由於 fstream 類別是由 istream 和 ostream 共
同衍生,既可以讀取檔案資料,也可將資料寫入
檔案,也就是說 fstream 可完全取代 ifstream
和 ofstream 類別,因此本書將重點放在
fstream 類別,省略探討 ifstream 和 ofstream
類別。
6
16.1 檔案處理
如何建立 fstream 物件
要使用 fstream 類別來存取檔案資料,必須先建
立一個 fstream 物件,建立fstream 物件必須引
用 <fstream> 標頭檔。
例如:以 fstream 類別建立 file 物件。
#include <fstream> //引用 <fstream> 標頭檔
fstream file; //宣告一個 fstream 物件
然後利用 fstream 物件的 open 成員函數,開啟
一個檔案。open() 函數的參數有兩個,第一個為
檔名,第二個為開啟檔案的模式。
7
16.1 檔案處理
開啟檔案的語法
檔案物件.open(“檔案名稱”,ios::開啟模式);
例如:以 fstream 類別的 file 物件讀取
<Readme.txt> 檔
8
16.1 檔案處理
fstream 物件的成員函數
fstream 物件的 open 函數中,其參數有兩個,
第一個為檔名,第二個為開啟檔案的模式參數,
常用的模式參數如下:
open() 函數的模式參數
9
16.1 檔案處理
fstream 物件的成員函數
例如:以讀取模式開啟 <Reader.txt> 檔。
fstream file; //宣告一個fstream物件
file.open(“Reader.txt”,ios::in) ; //以讀取模式
開啟Reader.txt檔
若傳入的模式參數超過兩個可用「|」符號分開,
例如:以寫入模式開啟<Reader.txt> 檔並將資料
加至檔案結尾。
fstream file; //宣告一個fstream物件
file.open("Reader.txt",ios::out | ios:: app);
10
16.1 檔案處理
常用的檔案處理函數
fstream 物件除了 open 函數,其它常用函式如
下:
11
16.1 檔案處理
常用的檔案處理函數
例如:is_open() 檢查檔案是否能成功開啟,並
以 close() 關閉檔案。
12
16.1 檔案處理
常用的檔案處理函數
「if (file.is_open())」中的 is_open() 也可
以省略,即要檢查檔案是能否成功開啟也可以使
用省略的語法「if (file」,如下:
13
16.2 檔案讀取與寫入
檔案讀取
以 fstream file 宣告一個 fstream 物件 file
後即可以「file.open("Readme.txt",ios::in)」
讀取<Readme.txt>,並使用 file 物件讀取檔案
讀取檔案的語法:
檔案物件.讀取函式();
例如:讀取 n 個字元至 buffer 陣列。
file.read(buffer,sizeof(buffer));
常用的讀取方式有:
read(buffer,n) 讀⿎ 取 n 個字元至 buffer 陣列。
get(ch) 讀取一個字元至 ch 字元變數。
getline(buffer,sizeof(buffer)) 讀取一行至buffer
陣列。
14
16.2 檔案讀取與寫入
範例時間:由檔案讀取 n 個字元
詳細步驟,請翻閱課本16-6至16-7頁說明。
執行結果與sample.txt 文字檔
15
16.2 檔案讀取與寫入
本例係一次讀取全部的檔案資料,有些時候
,必須對檔案中的每一個字元加以分析,這
時候就必須使用「file.get(ch))」將字元逐
一讀取,get() 函式一次讀取一個字元,將
字元存至 ch 字元變數中,並將檔案的指標
移至下一個字元,直至檔案結尾 (eof) 則結
束讀取。
利用 file.get(ch) 是否為 flase,可以得
知檔案是否已讀取結束,配合 while 可以讀
取檔案全部字元。
16
16.2 檔案讀取與寫入
語法如下:
範例時間:依字元一個一個讀取檔案資料
詳細步驟,請翻閱課本16-7至16-8頁說明。
執行結果
17
16.2 檔案讀取與寫入
範例時間:一行一行讀取檔案資料
詳細步驟,請翻閱課本16-9頁說明。
執行結果
18
16.2 檔案讀取與寫入
讀取的資料,經常會再作進一步的處理,例如:
資料分析、統計、計算、排序等。
在作資料處理之前,有時必須使用「strtok()」
函式先將資料拆解為字語(片語),例如將字串“
One Two Three” 分解為“ One”、“Two”、
“Three” 三個字語。
19
16.2 檔案讀取與寫入
範例時間:一行一行讀取並將文字分解為字語
詳細步驟,請翻閱課本16-10至16-12頁說明
。
執行結果與 in_a.txt 文字檔
20
16.2 檔案讀取與寫入
資料輸出至檔案
以 fstream file 宣告一個 fstream 物件 file
後即可以「
file.open("sample01.txt",ios::out)」建立
<sample01.txt> 檔案為寫入模式。
例如:
fstream file; //宣告一個fstream物件
file.open(“Reader.txt”,ios::out) ; //以寫入模
式開啟Reader.txt檔
21
16.2 檔案讀取與寫入
資料輸出至檔案
若傳入的模式參數超過兩個可用「|」符號分開,
例如:以寫入模式開啟<Reader.txt> 檔並將資料
加至檔案結尾
fstream file; //宣告一個fstream物件
file.open(“Reader.txt”,ios::out |ios:: app);
22
16.2 檔案讀取與寫入
資料輸出至檔案
建立 fstream 物件 file 後,即可以 file 執行
檔案寫入的動作,檔案寫入的方法有兩種:
方法一:以串流語法將資料寫入檔案。
檔案物件 << 資料
例如:
file << “文字寫入”;
以「file << 資料」的語法執行檔案寫入的動作
,語法和 cout 相同,都是串流資料的寫入動作
,只是 file 則將資料寫入檔案中,而 cout 是
將資料顯示在螢幕上。
23
16.2 檔案讀取與寫入
資料輸出至檔案
方法二:也可以 fstream 類別的 write() 函式
寫入檔案。
檔案物件.write(buffer,n)
例如:將 buffer 陣列中的 n 個字元寫入檔案。
file.write(buffer,n);
24
16.2 檔案讀取與寫入
範例時間:將資料輸出至檔案(一)
詳細步驟,請翻閱課本16-13至16-14頁說明
執行結果與 sample01.txt 文字檔
25
16.2 檔案讀取與寫入
範例時間:將資料輸出至檔案(二)
詳細步驟,請翻閱課本16-15至16-16頁說明
執行結果
26
16.3 二進位檔案的處理
除了上面提到的文字檔外,還有另一種檔案稱為二
進位檔案,二進位檔案是以資料的原始格式儲存,
對於原本是字元型別的資料,資料並不需要轉型,
即可以存取,但是對於其他型別的資料,則必須轉
換為字元指標,然後以 write()、read() 函式存取
。
27
16.3 二進位檔案的處理
二進位檔案的寫入
要寫入二進位檔案,首先必須將開啟檔案的模式
參數設為 ios::out,並以ios::binary 設為二進
位的模式開啟檔案。
檔案物件.open(“檔案名稱
”,ios::out|ios::binary);
例如:建立 fstream 物件 file 寫入二進位檔案
<tempfile.txt> 中。
fstream file; // 建立檔案輸出物件
file.open("tempfile.txt",ios::out|ios::binary)
// 二進位檔案
28
16.3 二進位檔案的處理
二進位檔案的寫入
開啟檔案後,即可使用 write() 函式將資料寫入
檔案中,如果是字元型別的資料,資料可以不需
要轉型 ( 但轉型也可以),即可以 write() 函式
直接寫入,其語法如下。
檔案物件.write(buffer,sizeof(buffer));
write() 用以將 buffer 字串內容寫入二進檔,
第一個參數是寫入資料內容,第二個參數是寫入
的字串長度。例如:
char buffer[12]=”I like C++!”;
file.write(buffer,sizeof(buffer));
29
16.3 二進位檔案的處理
二進位檔案的寫入
如果是其他型別的資料,則必須將寫入資料轉換
為字元指標,再以 write()函式寫入,其語法如
下。
檔案物件.write((char *) &buffer,sizeof(buffer));
write() 用以將 buffer 變數內容寫入二進檔,
第一個參數是 buffer 變數的位址,buffer 的型
態可以是一般變數、字串、結構或類別變數等,
buffer 位址必須強制轉換為 char 指標型別,第
二個參數是變數 buffer 的記憶體大小
30
16.3 二進位檔案的處理
二進位檔案的寫入
例如:將 int 型別 buffer 的陣列元素寫入二進
位檔。
int buffer[3]={1000,2000,3000};
for (int i=0;i<3;i++)
file.write((char *) &buffer[i],sizeof(int));
31
16.3 二進位檔案的處理
範例時間:將資料以二進位輸出至檔案
詳細步驟,請翻閱課本16-18至16-19頁說明
執行結果與 temple.txt 二進位檔案非文字
字元出現亂碼
32
16.3 二進位檔案的處理
二進位檔案的讀取
要讀取二進位檔案,首先必須將開啟檔案的模式
參數設為 ios::in,並以ios::binary 設為二進
位的模式開啟檔案。
檔案物件.open(“檔案名稱”,ios::in|ios::binary);
開啟檔案後,即可使用 read() 函式讀取二進位
檔,如果是字元型別的資料,資料可以不需要轉
型 ( 但轉型也可以),即可以 read() 函式直接
讀取,其語法如下:
檔案物件.read(buffer,sizeof(buffer));
33
16.3 二進位檔案的處理
二進位檔案的讀取
read() 用以由二進位檔讀取sizeof(buffer) 長
度的資料並放入 buffer 中。
例如:建立 fstream 物件 file 將二進位檔
<tempfile.txt> 讀取至 buffer 陣列中。
fstream file; // 建立檔案輸出物件
file.open("tempfile.txt",ios::in|ios::binary) //
以二進位檔案
char buffer[12];
file.read(buffer,sizeof(buffer));
34
16.3 二進位檔案的處理
二進位檔案的讀取
如果是其他型別的資料,則必須將讀取資料轉換
為字元指標。其語法如下:
檔案物件.read((char *) &buffer,sizeof(buffer));
例如:建立 fstream 物件 file 將二進位檔
<tempfile.txt> 讀取至 stuid[] 陣列中。
35
16.3 二進位檔案的處理
範例時間:二進位檔案的讀取
詳細步驟,請翻閱課本16-21至16-22頁說明
執行結果
36
16.4 資訊學科能力競賽範例
資訊學科能力競賽是許多高中生展現資訊能
力的舞台,競賽的題目中,經常會將數據放
在文字檔案中,因此必須將檔案讀取至變數
或陣列中。
有時這些數據必須再加以處理,例如文字轉
數值、大寫轉小寫、濾除指定文字或拆解為
字語等等⋯。
37
16.4 資訊學科能力競賽範例
範例時間:資訊學科能力競賽範例:數字和(
一)
詳細步驟,請翻閱課本16-23至16-25頁說明
執行結果
38
16.4 資訊學科能力競賽範例
範例時間:資訊學科能力競賽範例:數字和(
二).
詳細步驟,請翻閱課本16-26至16-27頁說明
執行時間
39
本章結束
Q&A討論時間
40