第6章 使用文件存取對(duì)象
文件可以用來(lái)存儲(chǔ)一張《清明上河圖》,一曲《春江花月夜》,當(dāng)然也可以存儲(chǔ)一部《紅樓夢(mèng)》,文件的內(nèi)容依賴于應(yīng)用程序來(lái)解釋。幾乎所有的操作系統(tǒng)都通過(guò)文件的界面允許用戶保存、管理數(shù)據(jù)。所以,我們理所當(dāng)然把文件當(dāng)做數(shù)據(jù)存取介質(zhì)的第一選擇。
6.1 文件操作的幾種方式
操作計(jì)算機(jī)的人都會(huì)接觸到文件,文件的操作通常包括文件的讀取、修改,有的時(shí)候我們還需要對(duì)文件進(jìn)行外部管理,包括文件復(fù)制、刪除及屬性設(shè)置等。
6.1.1 使用CRT函數(shù)std::fxxx()
文件操作可以采用C語(yǔ)言運(yùn)行時(shí)期庫(kù)來(lái)完成,CRT提供的fxxx()函數(shù)如表6-1所示。
表6-1 CRT文件操作函數(shù) | |
函數(shù) | 含義 |
fopen | 打開(kāi)指定文件名的文件 |
fread | 從文件中讀取指定長(zhǎng)度的數(shù)據(jù) |
fwrite | 向文件中寫入指定的數(shù)據(jù) |
fclose | 關(guān)閉文件 |
feof | 判斷是否達(dá)到文件結(jié)尾 |
fgetc | 從文本文件中讀取一個(gè)字符 |
fgets | 從文本文件中讀取一個(gè)字符串 |
fputc | 向文本文件中寫入一個(gè)字符 |
fputs | 向文本文件中寫入一個(gè)字符串 |
當(dāng)我們打開(kāi)、創(chuàng)建一個(gè)文件時(shí),常常需要調(diào)用fopen()函數(shù),該函數(shù)的原型為:
- FILE *fopen(
- const char *filename,
- const char *mode
- );
參數(shù)解釋
filename:指定文件的文件名,如test.out。
mode:指定文件的操作方式,如表6-2所示。
表6-2 fopen文件操作方式 | |
標(biāo)志 | 含義 |
r | 讀模式,如果文件不存在則會(huì)失敗 |
w | 寫模式,如果文件已存在則會(huì)清空其內(nèi)容 |
a | 追加模式,寫入的內(nèi)容追加在原有內(nèi)容之后, 如果文件不存在則會(huì)自動(dòng)創(chuàng)建 |
r+ | 讀寫模式(文件必須存在) |
w+ | 讀寫模式,如果文件已存在則會(huì)清空其內(nèi)容 |
a+ | 讀+追加模式 |
t | 文本方式 |
b | 二進(jìn)制方式 |
ccs=ENCODING | 文件編碼方式,可指定ENCODING 為 UTF-8、UTF-16LE、UNICODE |
文件的操作方式可以是如上標(biāo)志的組合,如:r+b。當(dāng)采用"ccs=ENCODING"時(shí),我們需要在前面添加一個(gè)","作為分隔。如我們以讀寫方式、UNICODE編碼打開(kāi)某個(gè)文件:
- fopen("newfile.txt", "rw, ccs=UNICODE");
如下羅列出使用CRT函數(shù)進(jìn)行文件操作的流程。
使用fopen()創(chuàng)建、打開(kāi)文件,返回一個(gè)文件指針FILE *;
以FILE *作為參數(shù),調(diào)用fread()、fwrite()等操作函數(shù)完成對(duì)文件的讀寫。fread()、fwrite()函數(shù)的原型為:
- 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
- );
調(diào)用fclose()關(guān)閉文件指針。
使用CRT操作文件流程如圖6-1所示。
![]() |
(點(diǎn)擊查看大圖)圖6-1 使用CRT操作文件的步驟 |
6.1.2 使用標(biāo)準(zhǔn)C++庫(kù)std::fstream
標(biāo)準(zhǔn)C++操作文件主要是通過(guò)文件流fstream來(lái)完成的。文件輸入/輸出流用以實(shí)現(xiàn)文件讀取和存儲(chǔ)的操作,這種基于流的文件操作如圖6-2所示。
![]() |
(點(diǎn)擊查看大圖)圖6-2 文件輸入/輸出流 |
和文件有關(guān)系的輸入/輸出類主要在頭文件<fstream>中被定義。在這個(gè)頭文件中主要定義了3個(gè)類。由這3個(gè)類控制對(duì)文件的各種輸入/輸出操作,它們分別是ifstream、ofstream、fstream。其中fstream類是由iostream類派生而來(lái)的,它們之間的繼承關(guān)系如圖6-3所示。
如果需要使用fstream,則需要包含<fstream>頭文件,與iostream不同的是,fstream需要和指定的文件名相關(guān)聯(lián),如:
- ofstream out("test.out");
- out << "hello, world!";
![]() |
(點(diǎn)擊查看大圖)圖6-3 fstream與iostream |
除流操作符之外,fstream提供的文件操作函數(shù)如表6-3所示。
表6-3 fstream文件操作函數(shù) | |
函數(shù) | 含義 |
open | 打開(kāi)文件 |
close | 關(guān)閉文件 |
is_open | 判斷當(dāng)前文件是否已打開(kāi) |
其中,open()函數(shù)具有多個(gè)原型:
- 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
- );
參數(shù)ios_base::openmode用以指定文件的打開(kāi)方式,可以是如表6-4所示的標(biāo)志的組合。
表6-4 ios_base::openmode標(biāo)志 | |
標(biāo)志 | 含義 |
ios::app | 追加模式(append),新輸出的內(nèi)容追加在原文件內(nèi)容的后面 |
ios::ate | 文件打開(kāi)后定位到文件尾,ios:app就包含此屬性 |
ios::binary | 以二進(jìn)制方式打開(kāi)文件,默認(rèn)的方式是文本方式 |
ios::in | 文件以輸入方式打開(kāi) |
ios::out | 文件以輸出方式打開(kāi) |
ios::trunc | 截?cái)嗄J剑?/span>truncate),如果文件存在,則把文件長(zhǎng)度設(shè)為0 |
ios::nocreate | 如果文件不存在則不創(chuàng)建 |
ios::noreplace | 如果文件已存在則不替換 |
如下羅列出使用fstream類進(jìn)行文件操作的流程。
調(diào)用fstream::fopen()創(chuàng)建、打開(kāi)文件。
通過(guò)流操作,使用fstream完成輸入/輸出,如:out << "hello, world!"。
調(diào)用fstream::close()關(guān)閉文件。
====未完待續(xù)====
聯(lián)系客服