C Primer 學習筆記 第八章 IO庫

2021-10-21 18:15:56 字數 2987 閱讀 5675

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...