第6章 使用文件存取對象
文件可以用來存儲一張《清明上河圖》,一曲《春江花月夜》,當然也可以存儲一部《紅樓夢》,文件的內容依賴於應用程序來解釋。幾乎所有的操作系統都通過文件的界面允許用戶保存、管理數據。所以,我們理所當然把文件當做數據存取介質的第一選擇。
6.1 文件操作的幾種方式
操作計算機的人都會接觸到文件,文件的操作通常包括文件的讀取、修改,有的時候我們還需要對文件進行外部管理,包括文件複製、刪除及屬性設置等。
6.1.1 使用CRT函數std::fxxx()
文件操作可以採用C語言運行時期庫來完成,CRT提供的fxxx()函數如表6-1所示。
表6-1 CRT文件操作函數 | |
函數 |
含義 |
fopen |
打開指定文件名的文件 |
fread |
從文件中讀取指定長度的數據 |
fwrite |
向文件中寫入指定的數據 |
fclose |
關閉文件 |
feof |
判斷是否達到文件結尾 |
fgetc |
從文本文件中讀取一個字符 |
fgets |
從文本文件中讀取一個字符串 |
fputc |
向文本文件中寫入一個字符 |
fputs |
向文本文件中寫入一個字符串 |
當我們打開、創建一個文件時,常常需要調用fopen()函數,該函數的原型爲:
- FILE *fopen(
- const char *filename,
- const char *mode
- );
參數解釋
filename:指定文件的文件名,如test.out。
mode:指定文件的操作方式,如表6-2所示。
表6-2 fopen文件操作方式 | |
標誌 |
含義 |
r |
讀模式,如果文件不存在則會失敗 |
w |
寫模式,如果文件已存在則會清空其內容 |
a |
追加模式,寫入的內容追加在原有內容之後,
如果文件不存在則會自動創建 |
r+ |
讀寫模式(文件必須存在) |
w+ |
讀寫模式,如果文件已存在則會清空其內容 |
a+ |
讀+追加模式 |
t |
文本方式 |
b |
二進制方式 |
ccs=ENCODING |
文件編碼方式,可指定ENCODING 爲
UTF-8、UTF-16LE、UNICODE |
文件的操作方式可以是如上標誌的組合,如:r+b。當採用"ccs=ENCODING"時,我們需要在前面添加一個","作爲分隔。如我們以讀寫方式、UNICODE編碼打開某個文件:
- fopen("newfile.txt", "rw, ccs=UNICODE");
如下羅列出使用CRT函數進行文件操作的流程。
使用fopen()創建、打開文件,返回一個文件指針FILE *;
以FILE *作爲參數,調用fread()、fwrite()等操作函數完成對文件的讀寫。fread()、fwrite()函數的原型爲:
- size_t fread(
- void *buffer,
- size_t size,
- size_t count,
- FILE *stream
- );
- size_t fwrite(
- const void *buffer,
- size_t size,
- size_t count,
- FILE *stream
- );
調用fclose()關閉文件指針。
使用CRT操作文件流程如圖6-1所示。
6.1.2 使用標準C++庫std::fstream
標準C++操作文件主要是通過文件流fstream來完成的。文件輸入/輸出流用以實現文件讀取和存儲的操作,這種基於流的文件操作如圖6-2所示。
(點擊查看大圖)圖6-2 文件輸入/輸出流 |
和文件有關係的輸入/輸出類主要在頭文件<fstream>中被定義。在這個頭文件中主要定義了3個類。由這3個類控制對文件的各種輸入/輸出操作,它們分別是ifstream、ofstream、fstream。其中fstream類是由iostream類派生而來的,它們之間的繼承關係如圖6-3所示。
如果需要使用fstream,則需要包含<fstream>頭文件,與iostream不同的是,fstream需要和指定的文件名相關聯,如:
- ofstream out("test.out");
- out << "hello, world!";
(點擊查看大圖)圖6-3 fstream與iostream |
除流操作符之外,fstream提供的文件操作函數如表6-3所示。
表6-3 fstream文件操作函數 | |
函數 |
含義 |
open |
打開文件 |
close |
關閉文件 |
is_open |
判斷當前文件是否已打開 |
其中,open()函數具有多個原型:
- void open(
- const char *_Filename,
- ios_base::openmode _Mode = ios_base::in | ios_base::out,
- int _Prot = (int)ios_base::_Openprot
- );
- void open(
- const char *_Filename,
- ios_base::openmode _Mode
- );
- void open(
- const wchar_t *_Filename,
- ios_base::openmode _Mode = ios_base::in | ios_base::out,
- int _Prot = (int)ios_base::_Openprot
- );
- void open(
- const wchar_t *_Filename,
- ios_base::openmode _Mode
- );
參數ios_base::openmode用以指定文件的打開方式,可以是如表6-4所示的標誌的組合。
表6-4 ios_base::openmode標誌 | |
標誌 |
含義 |
ios::app |
追加模式(append),新輸出的內容追加在原文件內容的後面 |
ios::ate |
文件打開後定位到文件尾,ios:app就包含此屬性 |
ios::binary |
以二進制方式打開文件,默認的方式是文本方式 |
ios::in |
文件以輸入方式打開 |
ios::out |
文件以輸出方式打開 |
ios::trunc |
截斷模式(truncate),如果文件存在,則把文件長度設爲0 |
ios::nocreate |
如果文件不存在則不創建 |
ios::noreplace |
如果文件已存在則不替換 |
如下羅列出使用fstream類進行文件操作的流程。
調用fstream::fopen()創建、打開文件。
通過流操作,使用fstream完成輸入/輸出,如:out << "hello, world!"。
調用fstream::close()關閉文件。
====未完待續====
以上摘自《把脈VC++》第4.6.2小節的內容 ,轉載請註明出處。