15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1...

46
15 15 檔檔檔檔 檔檔檔檔 15.1 15.1 磁磁磁磁 磁磁磁磁 15-2 15-2 15.1.1 15.1.1 磁磁磁磁磁 磁磁磁磁磁 15-2 15-2 15.1.2 15.1.2 磁磁磁磁 磁磁磁磁 15-2 15-2 15.1.3 15.1.3 磁磁磁磁 磁磁磁磁 open open 15-3 15-3 15.1.4 15.1.4 磁磁磁磁磁磁磁磁 磁磁磁磁磁磁磁磁 15-6 15-6 15.1.5 15.1.5 磁磁磁磁 磁磁磁磁 close close 15-7 15-7 15.2 15.2 磁磁磁磁磁 磁磁磁磁磁 15-7 15-7 15.2.1 15.2.1 磁磁磁磁磁 磁磁磁磁磁 << << 15-8 15-8 15.2.2 15.2.2 磁磁磁磁磁磁磁磁 磁磁磁磁磁磁磁磁 << 1 << 1 5-9 5-9 15.2.3 15.2.3 磁磁磁磁磁 磁磁磁磁磁 >> >> 15-11 15-11 15.2.4 15.2.4 磁磁磁 磁磁 磁磁磁 磁磁 put 15- put 15- 12 12 15.2.5 15.2.5 磁磁磁 磁磁 磁磁磁 磁磁 get 15- get 15- 13 13 15.3 15.3 磁磁磁磁磁磁 磁磁磁磁磁磁 15-17 15-17 15.3.1 15.3.1 磁磁磁磁磁磁 磁磁磁磁磁磁 write 15- write 15- 17 17 15.3.2 15.3.2 磁磁磁磁磁磁磁磁磁 磁磁磁磁磁磁磁磁磁 write write 1 1 5-19 5-19 15.3.3 15.3.3 磁磁磁磁磁磁 磁磁磁磁磁磁 read 15-2 read 15-2 2 15.3.4 15.3.4 磁磁磁磁磁磁 磁磁磁磁磁磁 eof 15-24 eof 15-24 15.4 15.4 磁磁磁磁磁磁 磁磁磁磁磁磁 15-28 15-28 15.4.1 15.4.1 磁磁磁磁磁磁 磁磁磁磁磁磁 seekg 15-2 seekg 15-2 9 15.4.2 15.4.2 磁磁磁磁磁磁 磁磁磁磁磁磁 seekp 15-2 seekp 15-2 9 15.4.3 15.4.3 磁磁磁磁磁磁 磁磁磁磁磁磁 tellg 15- tellg 15- 32 32 15.4.4 15.4.4 磁磁磁磁磁磁 磁磁磁磁磁磁 tellp 15- tellp 15- 32 32

Post on 21-Dec-2015

268 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15 15 檔案管理檔案管理 15.115.1 磁碟檔案磁碟檔案 15-215-2 15.1.1 15.1.1 什麼是檔案什麼是檔案 15-215-2 15.1.2 15.1.2 檔案名稱檔案名稱 15-215-2 15.1.3 15.1.3 開啟檔案開啟檔案 openopen 15-315-3 15.1.4 15.1.4 檔案是否開啟成功 檔案是否開啟成功 15-15-

66 15.1.5 15.1.5 關閉檔案關閉檔案 closeclose 15-715-7 15.215.2 存取文字檔存取文字檔 15-715-7 15.2.1 15.2.1 寫入文字檔 寫入文字檔 <<<< 15-815-8 15.2.2 15.2.2 附加資料到文字檔 附加資料到文字檔 << <<

15-915-9 15.2.3 15.2.3 讀取文字檔 讀取文字檔 >>>> 15-1115-11 15.2.4 15.2.4 寫入單一字元寫入單一字元 put 15-put 15-

1212 15.2.5 15.2.5 讀取單一字元讀取單一字元 get 15-1get 15-1

33

15.315.3 存取二進位檔存取二進位檔 15-1715-17 15.3.1 15.3.1 寫入二進位檔寫入二進位檔 write 15-write 15-

1717 15.3.2 15.3.2 附加資料到二進位檔附加資料到二進位檔 wriwri

tete 15-1915-19 15.3.3 15.3.3 讀取二進位檔讀取二進位檔 read 15-2read 15-2

22 15.3.4 15.3.4 檔案結束位置檔案結束位置 eof 15-24eof 15-24 15.415.4 隨機存取資料隨機存取資料 15-2815-28 15.4.1 15.4.1 移動讀取指標移動讀取指標 seekg 15-seekg 15-

2929 15.4.2 15.4.2 移動寫入指標移動寫入指標 seekp 15-seekp 15-

2929 15.4.3 15.4.3 取得讀取指標取得讀取指標 tellg 15-3tellg 15-3

22 15.4.4 15.4.4 取得寫入指標取得寫入指標 tellp 15-3tellp 15-3

22

Page 2: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1 15.1 磁碟檔案磁碟檔案 因為結束程式或關閉電源都將使得存在記因為結束程式或關閉電源都將使得存在記

憶體中的資料消失,所以每次執行前幾章憶體中的資料消失,所以每次執行前幾章的學生資料程式或員工資料程式時,都必的學生資料程式或員工資料程式時,都必須重新輸入資料。須重新輸入資料。

如果經常要使用這些資料,則可以在結束如果經常要使用這些資料,則可以在結束程式或關閉電源以前將資料存入磁碟檔案程式或關閉電源以前將資料存入磁碟檔案中,下次要用時再從磁碟檔案中讀取。 中,下次要用時再從磁碟檔案中讀取。

Page 3: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1.1 15.1.1 什麼是檔案什麼是檔案 在許多程式中,檔案(在許多程式中,檔案( filefile )是基本的輸)是基本的輸

入與輸出物件。檔案物件(入與輸出物件。檔案物件( file objectfile object ))收集了磁碟檔案資訊,包括檔案是否存在收集了磁碟檔案資訊,包括檔案是否存在或開啟,以及存取檔案的路徑、大小、日或開啟,以及存取檔案的路徑、大小、日期、與時間等等,所以可以利用檔案物件期、與時間等等,所以可以利用檔案物件開啟、讀取、寫入、關閉、與取得磁碟檔開啟、讀取、寫入、關閉、與取得磁碟檔案的資料。案的資料。

Page 4: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1.2 15.1.2 檔案名稱檔案名稱 所有的檔案都有一個可讓作業系統與使用所有的檔案都有一個可讓作業系統與使用

者確認的獨一無二的檔名。每個作業系統者確認的獨一無二的檔名。每個作業系統都有它們自己的檔案命名方式,例如都有它們自己的檔案命名方式,例如 WindWindowsows 可以接受長檔名,而可以接受長檔名,而 MS-DOSMS-DOS 則只接則只接受短檔名(主檔名受短檔名(主檔名 88 個字元,副檔名個字元,副檔名 33 個個字元)。字元)。

基本上檔名分為主檔名與副檔名,而且主基本上檔名分為主檔名與副檔名,而且主檔名與副檔名中間以句點(檔名與副檔名中間以句點( .. )隔開。一般)隔開。一般而言,副檔名代表檔案的種類。而言,副檔名代表檔案的種類。

Page 5: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1.2 15.1.2 檔案名稱 檔案名稱 (( 續續 ))副檔名副檔名 說明說明.asm.asm 組合語言原始程式檔 組合語言原始程式檔 .bas.bas BASICBASIC 語言原始程式檔 語言原始程式檔 .bat.bat DOSDOS 批次檔 批次檔 .cpp.cpp C++ C++ 語言原始程式檔 語言原始程式檔 .doc.doc 文件檔 文件檔 .exe.exe 執行檔 執行檔 .html.html HTMLHTML 檔 檔 .java.java JavaJava 語言原始程式檔 語言原始程式檔 .obj.obj 物件檔 物件檔 .sys.sys 系統檔 系統檔 .txt.txt 純文字檔 純文字檔

Page 6: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1.3 15.1.3 開啟檔案開啟檔案 openopen #include <fstream.h>#include <fstream.h>

ifstream ifstream 輸入物件輸入物件 ;; //// 建立輸入檔案物件建立輸入檔案物件ofstream ofstream 輸出物件輸出物件 ;; //// 建立輸出檔案物件建立輸出檔案物件fstream fstream 輸出入物件輸出入物件 ;; //// 建立輸入輸出檔案物件建立輸入輸出檔案物件

檔案物件檔案物件 .open(“.open(“ 檔案名稱”檔案名稱” , ios::, ios:: 開啟模式開啟模式 ););

Page 7: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1.3 15.1.3 開啟檔案開啟檔案 open (open ( 續續 ))ios::ios:: 開啟模開啟模式式

說明說明

ios::appios::app 開啟附加模式的資料檔開啟附加模式的資料檔ios::ateios::ate 開啟資料檔並將指標移到檔案結束位置開啟資料檔並將指標移到檔案結束位置 ios::binaryios::binary 開啟二進位輸入輸出模式的資料檔 開啟二進位輸入輸出模式的資料檔 ios::inios::in 開啟輸入模式的資料檔 開啟輸入模式的資料檔 ios::outios::out 開啟輸出模式的資料檔 開啟輸出模式的資料檔 ios::truncios::trunc 刪除已經存在的檔案,再開啟資料檔 刪除已經存在的檔案,再開啟資料檔

Page 8: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1.3 15.1.3 開啟檔案開啟檔案 open (open ( 續續 )) 先建立檔案物件,再開啟資料檔先建立檔案物件,再開啟資料檔

ofstream out; ofstream out; //// 建立輸出檔案物件建立輸出檔案物件ifstream in; ifstream in; //// 建立輸入檔案物件建立輸入檔案物件fstream io;fstream io; //// 建立輸入輸出檔案物建立輸入輸出檔案物件件out.open("a:\\textOut.txt", ios::out);out.open("a:\\textOut.txt", ios::out); //// 開啟輸出開啟輸出檔案檔案in.open("a:\\textIn.txt", ios::in); in.open("a:\\textIn.txt", ios::in); //// 開啟輸入檔案開啟輸入檔案io.open("a:\\textIO.txt", ios::in|ios::out);io.open("a:\\textIO.txt", ios::in|ios::out);

//// 開啟輸入輸出檔案開啟輸入輸出檔案

Page 9: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1.3 15.1.3 開啟檔案開啟檔案 open (open ( 續續 )) 先建立檔案物件,再開啟二進位檔案先建立檔案物件,再開啟二進位檔案

ofstream out; ofstream out; //// 建立輸出檔案物件建立輸出檔案物件ifstream in; ifstream in; //// 建立輸入檔案物件建立輸入檔案物件fstream io;fstream io; //// 建立輸入輸出檔案物建立輸入輸出檔案物件件out.open("textOut.txt", ios::binary|ios::out); out.open("textOut.txt", ios::binary|ios::out);

//// 開啟二進位輸出檔案開啟二進位輸出檔案in.open("textIn.txt", ios::binary|ios::in); in.open("textIn.txt", ios::binary|ios::in);

//// 開啟二進位輸入檔案開啟二進位輸入檔案io.open("textIO.txt", ios::binary|ios::in|ios::out);io.open("textIO.txt", ios::binary|ios::in|ios::out);

// // 開啟二進位輸入輸出開啟二進位輸入輸出

Page 10: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1.3 15.1.3 開啟檔案開啟檔案 open (open ( 續續 )) 建立同時開啟資料檔案建立同時開啟資料檔案

//// 使用使用 ofstreamofstream 的建立者函數建立物件並開啟輸出檔案的建立者函數建立物件並開啟輸出檔案 ofstream out("a:\\textOut.dat", ios::out);ofstream out("a:\\textOut.dat", ios::out);

//// 使用使用 ifstreamifstream 的建立者函數建立物件並開啟輸入檔案的建立者函數建立物件並開啟輸入檔案 ifstream in("a:\\textIn.dat", ios::in);ifstream in("a:\\textIn.dat", ios::in);

//// 使用使用 fstreamfstream 的建立者函數建立物件並開啟輸入輸出檔的建立者函數建立物件並開啟輸入輸出檔案案

fstream io("a:\\textIO.dat", ios::in, ios::out);fstream io("a:\\textIO.dat", ios::in, ios::out);

Page 11: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1.3 15.1.3 開啟檔案開啟檔案 open (open ( 續續 )) 建立同時開啟二進位檔案建立同時開啟二進位檔案

//// 使用使用 ofstreamofstream 的建立者函數建立物件並開啟輸出檔案的建立者函數建立物件並開啟輸出檔案 ofstream out("a:\\textOut.dat", ios::binary|ios::out);ofstream out("a:\\textOut.dat", ios::binary|ios::out);

//// 使用使用 ifstreamifstream 的建立者函數建立物件並開啟輸入檔案的建立者函數建立物件並開啟輸入檔案 ifstream in("a:\\textIn.dat", ios::binary|ios::in);ifstream in("a:\\textIn.dat", ios::binary|ios::in);

//// 使用使用 fstreamfstream 的建立者函數建立物件並開啟輸入輸出檔的建立者函數建立物件並開啟輸入輸出檔案案

fstream io("a:\\textIO.dat", ios::binary|ios::in|ios::oufstream io("a:\\textIO.dat", ios::binary|ios::in|ios::out);t);

Page 12: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1.4 15.1.4 檔案是否開啟成功檔案是否開啟成功 在呼叫在呼叫 openopen 函數後,必須先測試檔案是否開啟函數後,必須先測試檔案是否開啟

成功,然後才可正確存取檔案資料。 成功,然後才可正確存取檔案資料。 ifstream myFile;ifstream myFile; //// 建立輸入檔建立輸入檔案物件案物件in.open("a:\\textIn.txt", ios::in); in.open("a:\\textIn.txt", ios::in); //// 開啟輸入檔開啟輸入檔案案if(!myFile)if(!myFile) // // 測試檔案是否開啟成測試檔案是否開啟成功功

cout << "cout << " 開啟檔案失敗!開啟檔案失敗! \n";\n"; //// 檔案檔案代號錯誤代號錯誤

Page 13: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1.4 15.1.4 檔案是否開啟成功 檔案是否開啟成功 (( 續續 ))

當使用建立者函數建立檔案物件並開啟檔案時,當使用建立者函數建立檔案物件並開啟檔案時,則可用則可用 is_open() is_open() 函數來判斷檔案開啟是否函數來判斷檔案開啟是否成功 成功 ifstream myFile("a:\\textIn.txt", ios::in);ifstream myFile("a:\\textIn.txt", ios::in);

//// 建立並開啟檔案建立並開啟檔案if(!myFile.is_open())//if(!myFile.is_open())// 測試檔案是否開啟成測試檔案是否開啟成功功

cout << "cout << " 開啟檔案失敗!開啟檔案失敗! \n";\n";//// 檔案代號錯誤檔案代號錯誤

Page 14: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.1.5 15.1.5 關閉檔案關閉檔案 closeclose #include <fstream>#include <fstream> 物件名稱物件名稱 .close();.close();

範例範例myFile.close();myFile.close(); //// 關閉關閉 myFilemyFile檔案物件檔案物件

Page 15: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.2 15.2 存取文字檔存取文字檔 一般文字編輯軟體都是將資料存入文字檔,一般文字編輯軟體都是將資料存入文字檔,

例如微軟的例如微軟的 NotePadNotePad 就是將文件存入 就是將文件存入 .txt.txt檔,而檔,而 WordPadWordPad 與與 WordWord 則是將文件存則是將文件存入 入 .doc.doc 檔。所以本節將要介紹如何寫入資檔。所以本節將要介紹如何寫入資料至文字檔、如何附加資料到文字檔、與料至文字檔、如何附加資料到文字檔、與讀取文字檔資料等等。讀取文字檔資料等等。

Page 16: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.2.1 15.2.1 寫入文字檔 寫入文字檔 <<<< 物件名稱物件名稱 .open(“.open(“ 檔案名稱”檔案名稱” , ios::out);, ios::out); //// 開啟檔案開啟檔案 物件名稱 物件名稱 << << 輸出字串輸出字串 ;; //// 寫入檔案寫入檔案

範例一範例一ofstream filePtr;ofstream filePtr; //// 建立檔案物件建立檔案物件 filePtrfilePtrfilePtr.open("a:\\textIO.txt", ios::out);//filePtr.open("a:\\textIO.txt", ios::out);// 開啟檔案開啟檔案 a:\texa:\textIO.txttIO.txtfilePtr << "Life is not easy, but in the long run \n"; filePtr << "Life is not easy, but in the long run \n"; filePtr << "it's easier than going to elaborate ends \n"; filePtr << "it's easier than going to elaborate ends \n"; filePtr << "to deny it.\n";filePtr << "to deny it.\n"; //// 寫入字串到檔案寫入字串到檔案filePtr.close();filePtr.close(); //// 關閉關閉 filePtrfilePtr 檔案物件檔案物件

Page 17: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.2.1 15.2.1 寫入文字檔 寫入文字檔 << (<< ( 續續 )) 範例二範例二

int id;int id; //// 宣告整數變數宣告整數變數char name[40];char name[40]; //// 宣告宣告 CC 型態字串變數型態字串變數ofstream outFile;ofstream outFile; //// 建立檔案物件建立檔案物件 outoutFileFileoutFile.open(“a:\\textIO.dat”, ios::out);outFile.open(“a:\\textIO.dat”, ios::out);

//// 開啟檔案開啟檔案 a:\textIO.data:\textIO.datcin >> id >> name;cin >> id >> name; //// 從鍵盤讀取整數與字串從鍵盤讀取整數與字串outFile << id << '\t' << name << '\n';outFile << id << '\t' << name << '\n';

//// 寫入整數與字串到檔案寫入整數與字串到檔案outFile.close();outFile.close(); //// 關閉關閉 outFileoutFile 檔案物件檔案物件

Page 18: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.2.2 15.2.2 附加資料到文字檔 附加資料到文字檔 <<<< 物件名稱物件名稱 .open(“.open(“ 檔案名稱”檔案名稱” , ios::app);, ios::app); //// 開啟檔案開啟檔案 物件名稱 物件名稱 << << 字串字串 1 << 1 << 字串字串 2;2; //// 附加資料附加資料 範例一範例一

ofstream filePtr;ofstream filePtr; //// 建立檔案物件建立檔案物件 filePtrfilePtrfilePtr.open("a:\\outFile.txt", ios::app); //filePtr.open("a:\\outFile.txt", ios::app); // 開啟開啟 a:\outFa:\outFile.txtile.txtfilePtr << "filePtr << " 人生的確不是簡單的,可是老老實實地活著,人生的確不是簡單的,可是老老實實地活著,

\n"; \n"; //// 附加字串到檔案附加字串到檔案filePtr << "filePtr << " 總要比想出千方百計的逃避人生來得簡單些。總要比想出千方百計的逃避人生來得簡單些。

\n";\n"; //// 附加字串到檔案附加字串到檔案filePtr.close();filePtr.close();

Page 19: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.2.2 15.2.2 附加資料到文字檔 附加資料到文字檔 << << (( 續續 ))

範例二範例二int id;int id; //// 宣告整數變數宣告整數變數char name[40];char name[40]; //// 宣告宣告 CC 型態字串變數型態字串變數ofstream outFile;ofstream outFile; //// 建立檔案物件建立檔案物件 outoutFileFileoutFile.open("a:\\textIO.dat", ios::app);outFile.open("a:\\textIO.dat", ios::app);

//// 開啟檔案開啟檔案 a:\textIO.data:\textIO.datcin >> id >> name;cin >> id >> name; //// 從鍵盤讀取整數與字串從鍵盤讀取整數與字串outFile << id << '\t' << name << '\n';outFile << id << '\t' << name << '\n';

//// 寫入整數與字串到檔案寫入整數與字串到檔案outFile.close();outFile.close(); //// 關閉關閉 outFileoutFile 檔案物件檔案物件

Page 20: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.2.3 15.2.3 讀取文字檔 讀取文字檔 >>>> 物件名稱物件名稱 .open(“.open(“ 檔案名稱”檔案名稱” , ios::in);//, ios::in);// 開啟檔案開啟檔案 物件名稱 物件名稱 >> >> 緩衝區緩衝區 1 >> 1 >> 緩衝區緩衝區 2; //2; // 讀取資料讀取資料

範例範例ifstream outFile;ifstream outFile; //// 建立檔案物件建立檔案物件 outFileoutFileint id; int id; //// 存放資料緩衝區存放資料緩衝區char name[40]; char name[40]; //// 存放資料緩衝區存放資料緩衝區

範例待續……範例待續……

Page 21: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.2.3 15.2.3 讀取文字檔 讀取文字檔 >> (>> ( 續續 ))outFile.open("a:textIO.dat", ios::in);outFile.open("a:textIO.dat", ios::in);

//// 開啟輸入檔開啟輸入檔 a:\textIO.data:\textIO.datoutFile >> id >> name; //outFile >> id >> name; // 讀取檔案存入緩衝區讀取檔案存入緩衝區while(!outFile.eof()) {while(!outFile.eof()) { //// 是否已到檔尾是否已到檔尾

cout << id << '\t' << name << endl;cout << id << '\t' << name << endl;//// 顯示緩衝區資料顯示緩衝區資料

outFile >> id >> name;outFile >> id >> name;//// 讀取檔案存入緩衝區讀取檔案存入緩衝區

}}outFile.close();outFile.close(); //// 關閉檔案物件關閉檔案物件 outFileoutFile

Page 22: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.2.4 15.2.4 寫入單一字元寫入單一字元 putput 物件名稱物件名稱 .open(“.open(“ 檔案名稱”檔案名稱” , ios::out);, ios::out); //// 開啟檔案開啟檔案 物件名稱物件名稱 .put(.put( 字元緩衝區字元緩衝區 );); //// 寫入資料寫入資料

範例範例ofstream filePtr;ofstream filePtr; //// 建立檔案物件建立檔案物件 filePtrfilePtrchar inData[] = "Life is not easy, but in the long run \char inData[] = "Life is not easy, but in the long run \n"n"

"it's easier than going to elaborate ends \"it's easier than going to elaborate ends \n"n"

"to deny it.\n";"to deny it.\n"; 範例待續……範例待續……

Page 23: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.2.4 15.2.4 寫入單一字元寫入單一字元 put (put ( 續續 )) 範例續範例續

filePtr.open("a:\\textIO.txt", ios::in);filePtr.open("a:\\textIO.txt", ios::in); //// 開啟輸入檔開啟輸入檔 a:\textIO.txta:\textIO.txt

int len = strlen(inData);int len = strlen(inData); // // 取得取得 inDatainData 陣列的陣列的長度長度for(int i=0; i<len; i++) { //for(int i=0; i<len; i++) { // 寫入字元迴圈寫入字元迴圈

filePtr.put(inData[i]); //filePtr.put(inData[i]); // 寫入字元到寫入字元到 textIO.textIO.txttxt}}filePtr.close();filePtr.close(); //// 關閉檔案物件關閉檔案物件 filePtrfilePtr

Page 24: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.2.5 15.2.5 讀取單一字元讀取單一字元 getget 物件名稱物件名稱 .open(“.open(“ 檔案名稱”檔案名稱” , ios::in);, ios::in); //// 開啟檔案開啟檔案 物件名稱物件名稱 .get(.get( 字元緩衝區字元緩衝區 );); //// 讀取資料讀取資料 範例範例

ifstream filePtr;ifstream filePtr; //// 建立檔案物件建立檔案物件 filePtrfilePtrchar inData;char inData; //// 存放資料緩衝區存放資料緩衝區filePtr.open("a:\\textIO.txt", ios::in);filePtr.open("a:\\textIO.txt", ios::in);

//// 開啟輸出檔開啟輸出檔 a:\textIO.txta:\textIO.txtwhile(filePtr.get(inData)) {while(filePtr.get(inData)) { //// 取得資料並存入緩取得資料並存入緩衝區衝區

cout << inData;cout << inData; //// 顯示資料顯示資料}}filePtr.close();filePtr.close(); //// 關閉檔案物件關閉檔案物件 filePtrfilePtr

Page 25: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

ExerciseExercise

用用 C++C++ 寫一個檔案複製的程式寫一個檔案複製的程式 下載下載 f1.txtf1.txt 寫一個程式,利用檔案讀取及檔案寫入的方式,寫一個程式,利用檔案讀取及檔案寫入的方式,

將將 f1.txtf1.txt 複製為複製為 f2.txtf2.txt

Page 26: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.3 15.3 存取二進位檔存取二進位檔 雖然讀寫格式化的文字檔非常簡單,也非雖然讀寫格式化的文字檔非常簡單,也非

常適用於文件檔案的存取,但它不是最有常適用於文件檔案的存取,但它不是最有效的檔案管理方式。所以現在要介紹另一效的檔案管理方式。所以現在要介紹另一種的檔案管理方式:非格式化的二進位檔。種的檔案管理方式:非格式化的二進位檔。

Page 27: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.3.1 15.3.1 寫入二進位檔寫入二進位檔 writewrite 物件名稱物件名稱 .open(“.open(“ 檔案名稱”檔案名稱” , ios::binary); //, ios::binary); // 開啟二進開啟二進

位檔位檔 物件名稱物件名稱 .write(const char *.write(const char * 緩衝區緩衝區 , , 寫入長度寫入長度 );//);// 寫入資寫入資

料料 範例範例

class Student { class Student { //// 自定自定 StudentStudent 資料資料int student_id;int student_id;char student_name[40];char student_name[40];

public:public:Student() {Student() {

Student_id = 10;Student_id = 10;Student_name = "Tom";Student_name = "Tom";

}}};};

Page 28: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.3.1 15.3.1 寫入二進位檔寫入二進位檔 write write (( 續續 ))

範例續範例續int main()int main(){{

Student stuData;Student stuData; //// 建立類別物件建立類別物件ofstream filePtr;ofstream filePtr; //// 建立輸出檔案物件建立輸出檔案物件filePtr.open("a:\\binIO.dat", ios::binary|ios::ofilePtr.open("a:\\binIO.dat", ios::binary|ios::o

ut);ut);//// 開啟二進位檔開啟二進位檔

filePtr.write((char*)&stuData, sizeof(stuData));filePtr.write((char*)&stuData, sizeof(stuData)); //// 緩衝區資料寫入檔案緩衝區資料寫入檔案

filePtr.close();filePtr.close();return 0;return 0; //// 正常結束程式正常結束程式

}}

Page 29: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.3.2 15.3.2 附加資料到二進位檔附加資料到二進位檔 wrwriteite

物件名稱物件名稱 .open(“.open(“ 檔案名稱”檔案名稱” , ios::binary | ios::app);, ios::binary | ios::app); 物件名稱物件名稱 .write(const char *.write(const char * 緩衝區緩衝區 , , 寫入長度寫入長度 ););

class Student {class Student { //// 自定自定 StudentStudent 資料資料int student_id;int student_id;char student_name[40];char student_name[40];

public:public:setData(id, name) {setData(id, name) {

student_id = id;student_id = id;student_name = name;student_name = name;

}}};};

Page 30: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.3.2 15.3.2 附加資料到二進位檔附加資料到二進位檔 write write (( 續續 ))

範例續範例續int main() {int main() {

Student stuData;Student stuData; //// 建立類別物件建立類別物件ofstream filePtr;ofstream filePtr; //// 建立輸出檔案物件建立輸出檔案物件filePtr.open("a:\\binIO.dat ", ios::binary|ios::app);filePtr.open("a:\\binIO.dat ", ios::binary|ios::app);

//// 開啟二進位附加檔開啟二進位附加檔stuData.setData(1, "Ken");stuData.setData(1, "Ken"); ////設定自定資料設定自定資料filePtr.write((char*)&stuData, filePtr.write((char*)&stuData,

sizeof(stuData));sizeof(stuData)); //// 緩衝區資料附加到檔案緩衝區資料附加到檔案filePtr.close();filePtr.close();return 0;return 0; //// 正常結束程式正常結束程式

}}

Page 31: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.3.3 15.3.3 讀取二進位檔讀取二進位檔 readread 物件名稱物件名稱 .open(“.open(“ 檔案名稱”檔案名稱” , ios::binary | ios::in);, ios::binary | ios::in); 物件名稱物件名稱 .read(const char *.read(const char * 緩衝區緩衝區 , , 讀取長度讀取長度 );); 範例範例

class Student {class Student { //// 自定自定 StudentStudent 資料資料int student_id;int student_id;char student_name[40];char student_name[40];

public:public:void showData() {void showData() { cout << student_id << '\t' << student_name <cout << student_id << '\t' << student_name <

< endl;< endl;}}

};};

Page 32: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.3.3 15.3.3 讀取二進位檔讀取二進位檔 read read (( 續續 ))

範例續範例續int main() {int main() {

Student stuData;Student stuData; //// 建立類別物件建立類別物件ifstream filePtr;ifstream filePtr; //// 建立輸出檔案物件建立輸出檔案物件filePtr.open("a:\\binIO.dat", ios::binary|ios::in);filePtr.open("a:\\binIO.dat", ios::binary|ios::in);filePtr.read((char*)&stuData,filePtr.read((char*)&stuData, //// 讀取資料到緩衝區讀取資料到緩衝區

sizeof(stuData));sizeof(stuData)); //// 讀取長度讀取長度 == 緩衝區大小緩衝區大小stuData.showdata();stuData.showdata(); //// 呼叫顯示資料函數呼叫顯示資料函數filePtr.close();filePtr.close();return 0;return 0; //// 正常結束程式正常結束程式

}}

Page 33: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.3.4 15.3.4 檔案結束位置檔案結束位置 eofeof 輸入檔案物件輸入檔案物件 .eof().eof()

範例範例class Student {class Student { // // 自定自定 StudentStudent 資料資料

int student_id;int student_id;char student_name[40];char student_name[40];

public:public:void showData() {void showData() { cout << student_id << '\t' << student_name << ecout << student_id << '\t' << student_name << e

ndl;ndl;}}

};};

Page 34: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.3.4 15.3.4 檔案結束位置檔案結束位置 eof (eof ( 續續 )) 範例續範例續

int main() {int main() {Student stuData;Student stuData; //// 建立類別物件建立類別物件ifstream filePtr;ifstream filePtr; //// 建立輸出檔案建立輸出檔案

物件物件filePtr.open("a:\\binIO.dat", ios::binary|ios::ifilePtr.open("a:\\binIO.dat", ios::binary|ios::i

n);n);//// 開啟二進位附加檔開啟二進位附加檔

filePtr.read((char*)&stuData,filePtr.read((char*)&stuData, //// 讀取資料到緩讀取資料到緩衝區衝區

sizeof(stuData));sizeof(stuData)); //// 讀取長度讀取長度 == 緩衝區大緩衝區大小小

Page 35: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.3.4 15.3.4 檔案結束位置檔案結束位置 eof (eof ( 續續 )) 範例續範例續

while(!filePtr.eof()) {while(!filePtr.eof()) { //// 讀取資料迴圈讀取資料迴圈 stuData.showdata();stuData.showdata(); //// 呼叫顯示資料函數呼叫顯示資料函數 filePtr.read((char*) &stuData, //filePtr.read((char*) &stuData, // 讀取資料讀取資料

到緩衝區到緩衝區sizeof(stuData));sizeof(stuData)); //// 讀取長度讀取長度 == 緩衝區大緩衝區大

小小}}filePtr.close();filePtr.close();return 0;return 0; //// 正常結束程式正常結束程式

}}

Page 36: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

ExerciseExercise

寫一個寫一個 C++C++ 程式處理影像檔程式處理影像檔 下載下載 lena1.rawlena1.raw 用用 photoshopphotoshop瀏覽瀏覽 lena1.rawlena1.raw 寫一個程式,利用檔案讀取及檔案寫入的方式,寫一個程式,利用檔案讀取及檔案寫入的方式,

將將 lena1.rawlena1.raw 複製為複製為 lena2.rawlena2.raw ,但請將每一,但請將每一個字元的值個字元的值 cc改為改為 (255-c)(255-c) ,再寫入,再寫入 lena2.ralena2.raww

注意注意 cc 的型態應改為的型態應改為 unsigned charunsigned char 用用 photoshopphotoshop瀏覽瀏覽 lena2.rawlena2.raw

Page 37: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.4 15.4 隨機存取資料隨機存取資料 文字檔是一個字元或一個字串為單位,而文字檔是一個字元或一個字串為單位,而

二進位檔則是以一筆資料為單位,所以二二進位檔則是以一筆資料為單位,所以二進位檔案的優點就是可以隨機存取檔案內進位檔案的優點就是可以隨機存取檔案內的資料,也就是說可以任意存取二進位檔的資料,也就是說可以任意存取二進位檔中的任何一筆資料。中的任何一筆資料。

Page 38: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.4.1 15.4.1 移動讀取指標移動讀取指標 seekgseekg 輸入檔案物件輸入檔案物件 .seekg(.seekg( 移動距離移動距離 , ios::, ios:: 起始位起始位

置置 ))

ios::beg

ios::end

ios::cur

+ 移動距離

+ 移動距離

- 移動距離

begin end

Page 39: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.4.2 15.4.2 移動寫入指標移動寫入指標 seekpseekp 輸出檔案物件輸出檔案物件 .seekp(.seekp( 移動距離移動距離 , ios::, ios:: 起始位起始位

置置 ))

ios::beg

ios::end

ios::cur

+ 移動距離

+ 移動距離

- 移動距離

begin end

Page 40: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.4.2 15.4.2 移動寫入指標移動寫入指標 seekp seekp (( 續續 ))

表表 15.3 15.3 起始位置起始位置

ios::ios:: 起始位起始位置置

說明說明

ios::begios::beg 從檔案起始位置開始向後移動指定的從檔案起始位置開始向後移動指定的距離 距離

ios::curios::cur 從目前指標位置開始向後移動指定的從目前指標位置開始向後移動指定的距離 距離

ios::endios::end 從檔案結束位置開始向前移動指定的從檔案結束位置開始向前移動指定的距離 距離

Page 41: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.4.2 15.4.2 移動寫入指標移動寫入指標 seekp seekp (( 續續 ))

class Student {class Student { //// 自定自定 StudentStudent 資料資料int student_id;int student_id;char student_name[40];char student_name[40];

public:public:void showData() {void showData() { cout << student_id << '\t' << student_name << cout << student_id << '\t' << student_name <<

endl;endl;}}

};};

第1筆

0*len

...

1*len 2*len 3*len (n-1)*len

第2筆 第3筆 第4筆 第n筆

Page 42: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.4.2 15.4.2 移動寫入指標移動寫入指標 seekp seekp (( 續續 ))

範例續範例續int main() {int main() {

Student stuData;Student stuData; //// 建立類別物件建立類別物件ifstream filePtr;ifstream filePtr; //// 建立輸出檔案物件建立輸出檔案物件filePtr.open("a:\\binIO.dat", ios::binary|ios::in);filePtr.open("a:\\binIO.dat", ios::binary|ios::in);int n;int n;cin >> n;cin >> n;int len = sizeof(stuData);int len = sizeof(stuData); //// 計算每筆資料長度計算每筆資料長度int pos = (n-1) * len;int pos = (n-1) * len; //// 計算第計算第 nn筆資料位置筆資料位置filePtr.seekg(pos, ios::beg);filePtr.seekg(pos, ios::beg); //// 移動移動 getget 指標指標filePtr.read((char*)&stuData, sizeof(stuData));//filePtr.read((char*)&stuData, sizeof(stuData));// 讀取資料讀取資料stuData.showdata();stuData.showdata(); //// 呼叫顯示資料函數呼叫顯示資料函數filePtr.close();filePtr.close();return 0;return 0; //// 正常結束程式正常結束程式

}}

Page 43: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.4.3 15.4.3 取得讀取指標取得讀取指標 tellgtellg 輸入檔案物件輸入檔案物件 .tellg().tellg()

15.4.4 15.4.4 取得寫入指標取得寫入指標 tellptellp 輸出檔案物件輸出檔案物件 .tellp().tellp()

Page 44: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.4.4 15.4.4 取得寫入指標取得寫入指標 tellp tellp (( 續續 ))

範例一範例一int main()int main(){{

ifstream filePtr;ifstream filePtr; //// 建立輸出檔案物件建立輸出檔案物件filePtr.open("a:\\binIO.dat", ios::binary|ios::in);filePtr.open("a:\\binIO.dat", ios::binary|ios::in);filePtr.seekg(0, ios::end);filePtr.seekg(0, ios::end); //// 移動指標到檔尾移動指標到檔尾int endpos = filePtr.tellg();int endpos = filePtr.tellg(); //// 取得指標位置取得指標位置cout << "a:\\binIO.dat cout << "a:\\binIO.dat 的大小 的大小 = "= " << endpos << " bytes" << endl;<< endpos << " bytes" << endl; //// 顯示檔案大顯示檔案大

小小filePtr.close();filePtr.close();return 0;return 0; //// 正常結束程式正常結束程式

}}

Page 45: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

15.4.4 15.4.4 取得寫入指標取得寫入指標 tellp tellp (( 續續 ))

範例二範例二class Student {class Student {

int student_id;int student_id;char student_name[40];char student_name[40];

};};int main() {int main() {

ifstream filePtr;ifstream filePtr; //// 建立輸出檔案物件建立輸出檔案物件filePtr.open("a:\\binIO.dat", ios::binary|ios::in); filePtr.open("a:\\binIO.dat", ios::binary|ios::in); //// 開啟二進位輸開啟二進位輸

入檔入檔filePtr.seekg(0, ios::end);filePtr.seekg(0, ios::end); //// 移動指標到檔移動指標到檔

尾尾int endpos = filePtr.tellg();int endpos = filePtr.tellg(); //// 取得檔案位元取得檔案位元

組數組數int n = endpos / sizeof(stuData);int n = endpos / sizeof(stuData); //// 除以緩衝器大小除以緩衝器大小cout << "a:\\binIO.dat cout << "a:\\binIO.dat 共有 共有 " << n << " " << n << " 筆資料筆資料 ";"; //// 顯示資料筆數顯示資料筆數filePtr.close();filePtr.close();return 0;return 0; //// 正常結束程式正常結束程式

}}

Page 46: 15 檔案管理 15.1 磁碟檔案 15-2 15.1 磁碟檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.1 什麼是檔案 15-2 15.1.2 檔案名稱 15-2 15.1.2 檔案名稱 15-2 15.1.3 開啟檔案

ExerciseExercise

下載下載 C1505.datC1505.dat 使用課本範例程式使用課本範例程式 15-0915-09 中的中的 class Studeclass Stude

ntnt 將將 C1505.datC1505.dat 中的學生資料依序逐筆印出中的學生資料依序逐筆印出

可參考課本範例程式可參考課本範例程式 15-09,10,1115-09,10,11 的程式內容的程式內容