W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
為了從文件獲取數(shù)據(jù),必須創(chuàng)建一個(gè)從文件到程序的流對(duì)象。這點(diǎn)我們可以利用ifstream的構(gòu)造函數(shù)實(shí)現(xiàn):
ifstream infile ("file-name");
該構(gòu)造函數(shù)的參數(shù)是一個(gè)字符串,即你要打開(kāi)的文件的名字。其結(jié)果是創(chuàng)建了infile對(duì)象,它支持所有 cin上可以執(zhí)行的操作,包括>>和getline。
int x;
apstring line;
infile >> x; // 讀取一個(gè)整型數(shù)并保存到x中
getline (infile, line); // 讀取整行并保存到line中
如果我們提前知道文件中有多少數(shù)據(jù),那就可以直接寫一個(gè)循環(huán)來(lái)讀取整個(gè)文件,然后再停止。然而更常見(jiàn)的情況是,我們想讀取整個(gè)文件,但是不知道其大小。
ifstream有幾個(gè)用以檢查輸入流狀態(tài)的成員函數(shù),它們是good、eof、fail和bad等。我們使用good函數(shù)來(lái)確保文件成功打開(kāi),而使用eof函數(shù)來(lái)探測(cè)”文件尾“。
無(wú)論什么時(shí)候從輸入流讀取數(shù)據(jù),直到檢查時(shí)你才能知道嘗試是否成功。如果eof函數(shù)的返回值為true,那說(shuō)明已經(jīng)到達(dá)文件尾,我們就知道最后一次讀取嘗試以失敗告終。下面程序代碼的功能是:讀取一個(gè)文件的每一行并將其輸出到屏幕上。
apstring fileName = ...;
ifstream infile (fileName.c_str());
if (infile.good() == false) {
cout << "Unable to open the file named " << fileName;
exit (1);
}
while (true) {
getline (infile, line);
if (infile.eof()) break;
cout << line << endl;
}
函數(shù)c_str把a(bǔ)pstring轉(zhuǎn)換為原生C字符串。因?yàn)閕fstream構(gòu)造函數(shù)期望的參數(shù)是C字符串,所以apstring必須轉(zhuǎn)換一下。
我們可以在打開(kāi)文件之后,立即調(diào)用good函數(shù)。如果系統(tǒng)無(wú)法打開(kāi)文件,該函數(shù)就返回false,原因很可能是文件不存在或者你沒(méi)有文件讀取權(quán)限。
while(true)是無(wú)窮循環(huán)的習(xí)慣寫法。通常循環(huán)中某處會(huì)有個(gè)break語(yǔ)句,這樣程序就不會(huì)真的永遠(yuǎn)運(yùn)行下去(不過(guò)有的程序的確是希望永遠(yuǎn)執(zhí)行)。這個(gè)例子中,break語(yǔ)句允許只要發(fā)現(xiàn)文件尾就退出循環(huán)。
退出循環(huán)操作放在輸入語(yǔ)句和輸出語(yǔ)句之間很重要,這樣getline在遇到文件尾失敗之后,我們就不會(huì)在line中輸出無(wú)效信息。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: