1. 簡(jiǎn)單的文件I/O
寫(xiě)入文件 :
讓程序?qū)懭胛募?,其步驟大致為如下:
- 創(chuàng)建一個(gè)
ofstream
對(duì)象來(lái)管理輸入流; - 將該對(duì)象與特定的文件關(guān)聯(lián)起來(lái);
- 用使用
cout
的方式使用該對(duì)象,唯一的區(qū)別是輸出將進(jìn)入文件,而不是屏幕。
例子:
//需要包含頭文件fstream
ofstream fout; //#1
fout.open("a.txt");//#2 若a.txt不存在,則會(huì)新建一個(gè),若存在,則會(huì)清空源文件內(nèi)容
fout < < "hello"; //#3 將hello寫(xiě)入a.txt中
【 注 :以默認(rèn)模式打開(kāi)文件(即上述方式)進(jìn)行輸出將自動(dòng)把文件的長(zhǎng)度截短為零,這相當(dāng)于刪除已有的內(nèi)容。具體原因見(jiàn)本文第三節(jié)文件模式中的注】
讀取文件
讀取文件的要求與寫(xiě)入文件相似:
- 創(chuàng)建一個(gè)
ifstream
對(duì)象來(lái)管理輸入流; - 將該對(duì)象與特定的文件關(guān)聯(lián)起來(lái);
- 以使用
cin
的方式使用該對(duì)象。
例子:
//需要包含頭文件fstream
ifstream fin; //#1
fin.open("a.txt");//#2
char ch;
fin > > ch; //#3 讀取一個(gè)字符放入ch
【 注 :當(dāng)輸入和輸出流對(duì)象過(guò)期(如程序終止)時(shí),到文件的連接將自動(dòng)關(guān)閉。另外,也可以使用close()
方法來(lái)顯式地關(guān)閉到文件的連接。關(guān)閉這樣的連接并不會(huì)刪除流,而只是斷開(kāi)流到文件的連接。然而,流管理裝置仍被保留?!?/p>
流狀態(tài)檢查
C++文件流類(lèi)從ios_base
類(lèi)那里繼承了一個(gè)流狀態(tài)成員。檢查文件是否成功打開(kāi)的常見(jiàn)方式如下:
ifstream fin;
fin.open(argv[file]);
if (fin.fail()){...} //判斷文件打開(kāi)是否成功
if (!fin.good()){...} //判斷文件打開(kāi)是否成功
if (!fin){...} //判斷文件打開(kāi)是否成功
//is_open()能夠檢測(cè)到這種錯(cuò)誤以及good()能夠檢測(cè)到的錯(cuò)誤。然而,老式C++實(shí)現(xiàn)沒(méi)有is_open( )。
if (!fin.is_open()){...} //判斷文件打開(kāi)是否成功
2. 命令行處理技術(shù)
文件處理程序通常使用命令行參數(shù)來(lái)指定文件。例如:
exc a.txt b.txt
exc
為程序可執(zhí)行文件名,a.txt
和b.txt
為程序exc
執(zhí)行過(guò)程中要使用到的文件。要實(shí)現(xiàn)上述功能,則程序的主函數(shù)應(yīng)該寫(xiě)為:
int main(int argc, char* argv[])
argc
為命令行中的參數(shù)個(gè)數(shù),其中包括命令名本身。argv
變量為一個(gè)指針,它指向一個(gè)指向char的指針。這過(guò)于抽象,但可以將argv
看作一個(gè)指針數(shù)組,其中的指針指向命令行參數(shù),argv[0]
是一個(gè)指針,指向存儲(chǔ)第一個(gè)命令行參數(shù)的字符串的第一個(gè)字符,依此類(lèi)推。也就是說(shuō),argv[0]
是命令行中的第一個(gè)字符串,依此類(lèi)推。因此上面的例子中:argc
為3,argv[0]
為exc
,argv[1]
為a.txt
,argv[2]
為b.txt
。
3. 文件模式
文件模式描述的是文件將被如何使用:讀、寫(xiě)、追加等。將流與文件關(guān)聯(lián)時(shí)(無(wú)論是使用文件名初始化文件流對(duì)象,還是使用open()
方法),都可以提供指定文件模式的第二個(gè)參數(shù):
ifstream fin("banjo", mode1); // mode1為文件模式
ofstream fout();
fout.open("harp", mode2); // mode2為文件模式
文件模式的常量有:
【 注 :ifstream``open()
方法和構(gòu)造函數(shù)用ios_base::in
(打開(kāi)文件以讀?。┳鳛槟J絽?shù)的默認(rèn)值,而ofstream``open()
方法和構(gòu)造函數(shù)用ios_base::out | ios_base::trunc
(打開(kāi)文件,以讀取并截短文件,也就是說(shuō),其以前的內(nèi)容將被刪除)作為默認(rèn)值。位運(yùn)算符OR(|
)用于將兩個(gè)位值合并成一個(gè)可用于設(shè)置兩個(gè)位的值。fstream
類(lèi)不提供默認(rèn)的模式值,因此在創(chuàng)建這種類(lèi)的對(duì)象時(shí),必須顯式地提供模式?!?/p>
如果要保留文件內(nèi)容,并在文件尾添加(追加)新信息,則可以使用ios_base::app
模式:
ofstream fout("bagels", ios_base::out | ios_base::app);//使用|運(yùn)算符來(lái)合并模式,啟用模式out和app
老式C++實(shí)現(xiàn)之間可能有一些差異。例如,有些實(shí)現(xiàn)允許省略前一例子中的ios_base::out
,有些則不允許。如果不使用默認(rèn)模式,則最安全的方法是顯式地提供所有的模式元素。
要以二進(jìn)制格式(而不是文本格式)存儲(chǔ)數(shù)據(jù),可以使用ofstream
對(duì)象的write()
成員函數(shù)。該方法將內(nèi)存中指定數(shù)目的字節(jié)復(fù)制到文件中。若從二進(jìn)制文件讀取數(shù)據(jù),可以使用ifstream
對(duì)象的read( )
成員函數(shù)。該方法從文件中內(nèi)容復(fù)制到目標(biāo)結(jié)構(gòu)中。這兩者的對(duì)應(yīng)的使用方法如下:
const int LIM = 20;
struct planet
{
char name[LIM]; // name of planet
double population; // its population
double g; // its acceleration of gravity
};
planet pl;
planet p2;
//寫(xiě)入
//ofstream fout("planets.dat", ios_base:: out | ios_base::app);
//fout < < pl.name < < " " < < pl.population < < " " < < pl.g < < "n";
ofstream fout("planets.dat",
ios_base:: out | ios_base::app | ios_base::binary);
fout.write( (char *) &pl, sizeof(pl));
//讀取
ifstream fin("planets.dat", ios_base::in | ios_base::binary);
fin.read((char *) &p2, sizeof(p2));
4. 隨機(jī)存取
隨機(jī)存取指的是直接移動(dòng)(不是依次移動(dòng))到文件的任何位置。要實(shí)現(xiàn)讀/寫(xiě)的效果,需要同時(shí)使用in
模式和out
模式將得到讀/寫(xiě)模式,要使用|
運(yùn)算符來(lái)組合模式。因此,需要使用下面的語(yǔ)句:
fstream finout;//fstream類(lèi)是從iostream類(lèi)派生而來(lái)的,而后者基于istream和ostream兩個(gè)類(lèi),因此它繼承了它們的方法。它還繼承了兩個(gè)緩沖區(qū),一個(gè)用于輸入,一個(gè)用于輸出,并能同步化這兩個(gè)緩沖區(qū)的處理。
finout.open(file, ios_base::in | ios_base::out | ios_base::binary);
接下來(lái),需要一種在文件中移動(dòng)的方式。fstream
類(lèi)為此繼承了兩個(gè)方法:seekg()
和seekp()
,前者將輸入指針移到指定的文件位置,后者將輸出指針移到指定的文件位置(實(shí)際上,由于fstream
類(lèi)使用緩沖區(qū)來(lái)存儲(chǔ)中間數(shù)據(jù),因此指針指向的是緩沖區(qū)中的位置,而不是實(shí)際的文件)。也可以將seekg()
用于ifstream
對(duì)象,將seekp()
用于oftream
對(duì)象。
seekg()
和seekp()
的原型及使用方法如下:
//seekg()
istream & seekg(streamoff, ios_base::seekdir);//第一個(gè)原型定位到離第二個(gè)參數(shù)指定的文件位置特定距離(單位為字節(jié))的位置;streamoff值被用來(lái)度量相對(duì)于文件特定位置的偏移量(單位為字節(jié))。
istream & seekg(streampos);//第二個(gè)原型定位到離文件開(kāi)頭特定距離(單位為字節(jié))的位置。streampos對(duì)應(yīng)的是距離(單位為字節(jié))。
//seek_dir參數(shù)是ios_base類(lèi)中定義的另一種整型,有3個(gè)可能的值:
//常量ios_base::beg指相對(duì)于文件開(kāi)始處的偏移量;
//常量ios_base::cur指相對(duì)于當(dāng)前位置的偏移量;
//常量ios_base::end指相對(duì)于文件尾的偏移量。
fin.seekg(30, ios_base::beg); //將讀取位置設(shè)置為從文件開(kāi)頭開(kāi)始的第31個(gè)字節(jié)(字節(jié)編號(hào)為30)
fin.seekg(-1, ios_base::cur); //將讀取位置設(shè)置為從當(dāng)前位置后退1個(gè)字節(jié)
fin.seekg(0, ios_base::end); //將讀取位置設(shè)置為從文件尾0個(gè)字節(jié)的位置
fin.seekg(112); //第一個(gè)字節(jié)的編號(hào)為0。因此該語(yǔ)句將讀取位置設(shè)置為第112個(gè)字節(jié),也就是文件中的第113個(gè)字節(jié)
//seekp()
ostream & seekp(streamoff offset,seek_dir origin);
ostream & seekp (streampos pos);
fout.seekp(30, ios_base::beg); //將寫(xiě)入位置設(shè)置為從文件開(kāi)頭開(kāi)始的第31個(gè)字節(jié)(字節(jié)編號(hào)為30)
fout.seekp(-1, ios_base::cur); //將寫(xiě)入位置設(shè)置為從當(dāng)前位置后退1個(gè)字節(jié)
fout.seekp(0, ios_base::end); //將寫(xiě)入位置設(shè)置為從文件尾0個(gè)字節(jié)的位置
fout.seekp(112); //第一個(gè)字節(jié)的編號(hào)為0。因此該語(yǔ)句將寫(xiě)入位置設(shè)置為編號(hào)為112的字節(jié),也就是文件中的第113個(gè)字節(jié)
【 注 :如果要檢查文件指針的當(dāng)前位置,則對(duì)于輸入流,可以使用tellg()
方法,對(duì)于輸出流,可以使用tellp()
方法。它們都返回一個(gè)表示當(dāng)前位置的streampos
值(以字節(jié)為單位,從文件開(kāi)始處算起)?!?/p>
seekg()
和seekp()
函數(shù)提供對(duì)文件的隨機(jī)存取。這些類(lèi)方法使得能夠?qū)⑽募羔樂(lè)胖玫较鄬?duì)于文件開(kāi)頭、文件尾和當(dāng)前位置的某個(gè)位置。tellg()
和tellp()
方法報(bào)告當(dāng)前的文件位置。
-
處理器
+關(guān)注
關(guān)注
68文章
19885瀏覽量
235042 -
連接器
+關(guān)注
關(guān)注
99文章
15375瀏覽量
140403 -
緩沖器
+關(guān)注
關(guān)注
6文章
2055瀏覽量
47002 -
二進(jìn)制
+關(guān)注
關(guān)注
2文章
807瀏覽量
42315
發(fā)布評(píng)論請(qǐng)先 登錄
什么是簡(jiǎn)單電路?簡(jiǎn)述簡(jiǎn)單電路的計(jì)算步驟?

Allegro生成鉆孔文件的步驟
AD中關(guān)于Gerber文件的輸出
基于PCB快速打板中的Protel 99 SE轉(zhuǎn)gerber文件步驟

電腦卡怎么辦簡(jiǎn)單步驟
DXP導(dǎo)出SMT坐標(biāo)文件的簡(jiǎn)述步驟詳細(xì)說(shuō)明

AltiumDesigner導(dǎo)出Gerber文件的步驟詳細(xì)教程說(shuō)明

VC++簡(jiǎn)單的輸入輸出教程詳細(xì)說(shuō)明

解析C語(yǔ)言入門(mén)基礎(chǔ)之輸入和輸出
PyTorch教程6.6.之文件輸入輸出

評(píng)論