io類
//到目前為止,我們已經使用過的io型別和物件都是操縱char資料的。預設情況下,這些物件都是關聯使用者的控制台視窗的。
//當然,我們不能限制實際應用程式僅從控制台視窗進行io操作,應用程式常常需要讀寫命名檔案。而且,使用io操作處理string
//中的字元會很方便。此外,應用程式還可能讀寫需要寬字元支援的語言。
.1 io物件無拷貝或賦值
.2條件狀態
//查詢流的狀態
//管理條件狀態
.3管理輸出緩衝
//每個輸出流都管理乙個緩衝區,用來儲存程式讀寫的資料。例如,如果執行下面的**
//os<<"please enter a value: ";
//文字串可能立即列印出來,但也有可能被作業系統儲存在緩衝區中,隨後再列印。有了緩衝機制,作業系統就可以將程式的
//多個輸出操作組合成單一的系統級寫操作。由於裝置的寫操作可能很耗時,允許系統將多個輸出操作組合成單一的系統級寫操作。
//導致緩衝重新整理的原因有很多。
//1.程式正常結束,作為main函式的return操作的一部分,緩衝重新整理被執行。
//2.緩衝區滿時,需要重新整理緩衝,而後新的資料才能繼續寫入緩衝區。
//3.我們可以使用操縱符如endl來顯式重新整理緩衝區。
//4.再每個輸出操作之後,我們可以用操作符unitbuf設定流的內部狀態,來清空緩衝區。預設情況下,對cerr是設定unitbuf的,因此寫到cerr
// 的內容都是立即重新整理的。
//5.乙個輸出流可能被關聯到另乙個流。在這種情況下,當讀寫被關聯的流時,關聯到的流的緩衝區會被重新整理。例如,預設情況下,cin和cerr都關聯到cout。
//因此,讀cin或寫cerr都會導致cout的緩衝區被重新整理。
//重新整理輸出緩衝區
#include
"iostream"
#include
"fstream"
#include
"vector"
#include
"string"
#include
"sstream"
using
namespace std;
intmain81()
//關聯輸入流和輸出流
//當乙個輸入流被鍛鍊到一輸出流時,任何試圖從輸入流讀取資料的操作都會先重新整理關聯的輸出流。
//標準庫將cout和cin關聯在一起。
//cin>>ival;
intmain82()
檔案輸入輸出
//標頭檔案fstream定義了三個型別來智齒檔案io:ifstream從乙個給定檔案中讀取資料,ofstream從乙個給定檔案中寫入資料,以及fstream可以讀寫給定檔案。
.1使用檔案流物件
//當我們想要讀寫乙個檔案時,可以定義乙個檔案流物件,並將物件與檔案關聯起來,每個檔案流都定義了乙個名為open的成員函式
//他完成一些系統相關的操作,來定位給定的檔案,並視情況開啟位讀或寫模式
//建立檔案流物件時,我們可以提供檔名。如果提供了乙個檔名,則open會被自動呼叫。
//ifstream in(ifile); //構造乙個ifstream並開啟給定檔案
//ofstream out; //輸出檔案流並未關聯到任何檔案
intmain83()
.2檔案模式
//每個流都有乙個關聯的檔案模式,用來指出如何使用檔案。表8.4列出了檔案模式和他們的含義
//以out模式開啟檔案會丟棄已有資料
intmain84()
流//sstream標頭檔案定義了三個型別來智齒記憶體io,這些型別可以向string寫入資料,從string讀取資料,就香string是乙個io流一樣
//isstring從string讀取資料,ostringstream向string寫入資料,而標頭檔案stringstream既可以從string讀資料也可以向string寫資料
使用istringstream
//假定又這樣乙個例子,假定有乙個檔案,列出了一些人和他們的**號碼。某些人只有乙個號碼,而另一些人則有多個——家庭**
//工作**,移動**。我們的輸入檔案看起來可能是這樣
//morgan 201552368 8625550123
//derw 9735550130
//iee 6095550132 20155550175 8005550000
//檔案中每條記錄都是以乙個人名開始,後面跟隨乙個或多個**號碼。
//我們首先定義乙個簡單的類來描述輸入資料:
struct presoninfo
;int
main85()
}system
("pause");
return0;
}使用ostringstream
//當我們逐步構造輸出,希望最後一起列印時,ostringstream是很有用的。例如,對上一節的例子,我們可能逐個驗證
//**號碼並逐個驗證**並改變其格式。如果所有號碼都是有效的,我們希望輸出乙個新的檔案,包含改變格式後的號碼。
//對於那些無效的號碼,我們不會將他們輸出到新檔案中,而是列印一條包含人名和無效號碼的錯誤資訊。
//由於我們不希望輸出有無效**號碼的人,因此對每個人,直到驗證完所有**號碼後才可以進行輸出操作。但是,我們可以先將輸出內容
//寫入到乙個記憶體ostringstream中。
intmain()
}for
(const
auto
& entry:people)
//else
// (formatted<<" "<}
if(badnums.
str().
empty()
)else
}system
("pause");
return0;
}//在此程式中,我們假定已有兩個函式,valid和format,分別完成**號碼驗證和改變格式的功能。
C primer 學習筆記(第八章)
c 使用標準庫類處理輸入和輸出 所有這些類都是通過繼承相互關聯的。輸入類繼承了istream,輸出類繼承了ostream。因此,可在istream物件上執行的操作同樣適用於ifstream或istringstream物件。而繼承ostream的輸出類也是類似的。所有io物件都有一組條件狀態,用來指示...
C primer 學習筆記 第八章 IO庫
io庫型別和標頭檔案 頭檔案型別iostream 流 istream,wistream從流讀取資料 ostream,wostream向流寫入資料 iostream,wiostream讀寫流 fstream 檔案 ifstream,wifstream從檔案讀取資料 ofstream,wofstream...
C Primer 筆記 第八章 IO庫
io物件無拷貝和賦值。unitbuf 使接下來每次輸出操作後都重新整理緩衝區,之後用 nounnitbuf 取消。輸入流與輸出流關聯時,任何試圖從輸入流讀取資料的操作都會重新整理它所關聯的輸出流。ostream old cin.tie nullptr 這句語句將 cin 原來關聯的輸出流存入 old...