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

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

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

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

VC++簡單的輸入輸出教程詳細(xì)說明

評論