c++语言文件流,C++ IO类、文件输入输出、string流详细讲解
新的C++標(biāo)準(zhǔn)中有三分之二的內(nèi)容都是描述標(biāo)準(zhǔn)庫。接下來重點(diǎn)學(xué)習(xí)其中幾種核心庫設(shè)施,這些是應(yīng)該熟練掌握的。
標(biāo)準(zhǔn)庫的核心是很多容器類(順序容器和關(guān)聯(lián)容器等)和一簇泛型算法(該類算法通常在順序容器一定范圍內(nèi)的元素上或其他類型的序列上進(jìn)行操作)。
該篇主要學(xué)習(xí)IO庫。
C++語言不直接處理輸入輸出,而是通過一簇標(biāo)準(zhǔn)庫中的IO庫來處理。IO庫定義了讀寫內(nèi)置類型值的操作。
1、IO類
為了處理不同的種類的IO操作,定義了:iostream(用于讀寫流的基本類型)、fstream(讀寫命名文件的類型)、sstream(讀寫內(nèi)存string對象的類型)。
其中后面以w開頭的是寬字符版本。
IO類型間的關(guān)系
繼承機(jī)制:ifstream和istringstream都是繼承自istream,上述所有的IO庫類型之間都存在這種繼承關(guān)系。
下面介紹的標(biāo)準(zhǔn)庫流特性都可以無差別地應(yīng)用于普通流、文件流和string流,以及它們的寬字符版本。
1.1 IO對象無拷貝或賦值
不能拷貝或?qū)O對象賦值
ofstream out1,out2;
out1=out2; //錯誤,不能對流對象賦值
ofstream print(ofstream); //錯誤,不能初始化ofstream參數(shù)
out2=print(out2); //錯誤,不能拷貝流對象
因?yàn)椴荒芸截怚O對象,因此不能將形參或返回類型設(shè)置為流類型。進(jìn)行IO操作的函數(shù)通常以引用方式傳遞和返回流。讀寫一個IO對象會改變其狀態(tài),因此傳遞和返回的引用不能是const。
1.2 條件狀態(tài)
IO操作可能會發(fā)生錯誤,IO類通過定義一些條件狀態(tài)來顯示IO對象的狀態(tài),使用戶知道流的當(dāng)前狀態(tài)。
由于流操作可能發(fā)生的錯誤,因此,代碼通常應(yīng)該在使用一個流之前檢查它是否處于良好狀態(tài),最簡單的方法是將它當(dāng)作一個條件來使用。
while(cin>>word)
{
......
}
查詢流的狀態(tài)
有時候不僅僅需要知道流是否有效,還要知道到底是什么原因?qū)е铝魇?#xff0c;IO庫定義了一個與機(jī)器無關(guān)的iostate類型,它提供了表達(dá)流狀態(tài)的完整功能。這個類型應(yīng)作為一個位集合來使用。
使用good或fail是確定流的總體狀態(tài)的正確方法。上述將流作為條件使用的代碼等價于!fail()。
while(cin>>word)
{
......
}
==================
cin >> s;
while (!(cin.fail()))
{
}
管理?xiàng)l件狀態(tài)
流對象的rdstate成員返回一個iostate值,對應(yīng)流的當(dāng)前狀態(tài)。setstate操作將給定條件位置位,表示發(fā)生了對應(yīng)錯誤。clear成員是一個重載的成員。有一個無參數(shù)的版本,清除所有錯誤標(biāo)志位。
auto old_state=cin.rdstate(); //記住cin的當(dāng)前狀態(tài)
cin.clear(); //清除所有錯誤
process_input(cin); //使用cin
cin.setstate(old_state); //將cin置為原有狀態(tài)
1.3 管理輸出緩沖
每個輸出流都管理一個緩沖區(qū),用來保存程序讀寫的數(shù)據(jù)。
刷新輸出緩沖區(qū)
已經(jīng)使用過操縱符endl,它完成換行并刷新緩沖區(qū)的工作。IO庫還有兩個類似的操縱符:flush和ends。flush刷新緩沖區(qū),但不輸出任何額外的字符;ends向緩沖區(qū)插入一個空字符,然后刷新緩沖區(qū)。
unitbuf操縱符
unitbuf每次輸出操作后都刷新緩沖區(qū)。它告訴流在接下來的每次寫操作之后都進(jìn)行一次flush。而nounitbuf操縱符則重置流,使其恢復(fù)正常的系統(tǒng)管理的緩沖區(qū)刷新機(jī)制。
cout<
cout<
2、文件輸入輸出
頭文件fstream定義了三種類型來支持文件IO:ifstream、ofstream、fstream。
fstream除了繼承自iostream類型的行為之外,fstream還定義了一些自己專有的操作。這是其他IO類型所沒有的。
2.1 使用文件流對象
用fstream代替iostream&
在使用iostream的地方,可以用fstream代替調(diào)用,因?yàn)閒stream是從iostream繼承來的。
成員函數(shù)open和close
可以先定義一個空文件流對象,然后用open將其與文件關(guān)聯(lián)起來。
如果調(diào)用open失敗,則failbit會被置位,因此進(jìn)行open是否成功的檢測是一個好的習(xí)慣。
ofstream out;
out.open("1.txt");
if(out)
.......
將文件流對象綁定到另一個文件之前,需要先close已經(jīng)關(guān)聯(lián)的文件,然后再關(guān)聯(lián)新的文件。
自動構(gòu)造和析構(gòu)
當(dāng)一個fstream對象被銷毀時,close會自動被調(diào)用。
2.2 文件模式
每個流都有一個關(guān)聯(lián)的文件模式,用來指出如何使用文件。
指定文件模式有如下限制
只可以對ofstream和fstream對象設(shè)定out模式
只可以對ifstream和fstream對象設(shè)定in模式
只有當(dāng)out也被設(shè)定時才可設(shè)定trunc模式
只要trunc沒被設(shè)定,就可以設(shè)定app模式。在app模式下,即使沒有顯式指定out模式,文件也總是以輸出方式被打開
ate和binary模式可用于任何類型的文件流對象,且可以與其他任何文件模式組合使用
每個文件流類型都定義了一個默認(rèn)的文件模式,ifstream是in,ofstream是out,fstream是in和out
以out模式打開文件會丟棄已有數(shù)據(jù)
默認(rèn)情況下,打開一個ofstream時,文件的內(nèi)容會被丟棄。阻止一個ofstream清空給定文件內(nèi)容的方法是同時指定app模式。
ofstream app("file",ofstream::app);
ofstream app2("file",ofstream::out | ofstream::app);
每次調(diào)用open時都會確定文件模式
ofstream out;
out.open("file1"); //模式隱含設(shè)置為輸出和截?cái)?/p>
out.close();
out.open("file2",ofstream::app); //模式為輸出和追加
out.close();
通常情況下,out模式意味著同時使用trunc模式,因此,file1的文件的內(nèi)動將被清空。
每次打開文件時,都要設(shè)置文件模式,可能是顯式地設(shè)置,也可能是隱式地設(shè)置,當(dāng)程序未指定模式時,就使用默認(rèn)值。
3、string流
sstream頭文件定義了三個類型來支持內(nèi)存IO,這些類型可以向string讀寫數(shù)據(jù),string像是一個IO流一樣。
istringstream
ostringstream
stringstream
上述三種都繼承自iostream。同樣的,除了繼承來的操作,其也定義了自己特有的操作。
總結(jié)
以上是生活随笔為你收集整理的c++语言文件流,C++ IO类、文件输入输出、string流详细讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构 算法与应用C 语言描述第六章,
- 下一篇: C++中include 与 includ