C Primer第八章標準IO庫筆記

2021-10-02 05:21:51 字數 4124 閱讀 3450

io物件不可複製或賦值

這有兩個含義:

1)由於流物件不能複製,則不能儲存在vector(或其它)容器中(即不存在儲存流物件的vector或其它容器).

2)形參或返回型別不能為流型別,如果需要傳遞或者返回io物件,則必須傳遞或返回指向該物件的指標或引用.

ofstream out1, out2;

// 錯,不能賦值

out1 = out2;

// 錯,引數為流型別(呼叫的時候就會執行複製操作了)

ofstream print

(ofstream)

;// 錯,流物件的複製操作

out2 =

print

(out2)

;// 對

ofstream &

print

(ofstream&);

while

(print

(out2)

)

導致緩衝區的內容被重新整理,即寫入到真實的輸出裝置或檔案的情況

1)程式正常結束. 作為main返回工作的一部分,將清空所有的緩衝區

2)在一些不確定的時候,緩衝區可能已經滿了,在這種情況下,緩衝區將會在寫下乙個值之前重新整理

3)用操縱符顯式的重新整理緩衝區,例如行結束符endl;

// 重新整理流,但不再輸出中新增任何字元

cout <<

"hi!"

<< flush;

// 在緩衝區中插入空字元null,然後重新整理緩衝區

cout <<

"hi!"

<< ends;

// 輸出乙個換行符並重新整理緩衝區

cout <<

"hi!"

<< endl;

4)在每次輸出操作執行完後,用unitbuf操縱符設定流的內部狀態,從而清空緩衝區.

// unitbuf操縱符在每次執行完寫操作後都重新整理流,nounitbuf操縱符將流恢復為使用正常的、由系統管理的緩衝區重新整理方式

cout << unitbuf <<

"first"

<<

"second"

<< nounitbuf;

// 與上一條語句等價

cout <<

"first"

<< flush <<

"second"

<< flush;

5)可將輸出流與輸入流關聯(tie)起來,在這種情況下,在讀輸入流時將重新整理其關聯的輸出緩衝區.

// 繫結輸入流和輸出流

cin.

tie(

&cout)

;// 獲取指向輸入流繫結的輸出流的指標

ostream *old_tie = cin.

tie();

// 解除繫結

cin.

tie(0)

;// 將輸入流和錯誤流繫結

cin.

tie(

&cerr)

;// 解除入流和錯誤流繫結

cin.

tie(0)

;// 將輸入流和輸出流繫結在一塊

cin.

tie(old_tie)

;

注:如果程式崩潰了,將不會重新整理緩衝區

檔案流物件的使用

//為ifstream或者ofstream物件提供檔名作為初始化式,就相當於開啟了特定的檔案

//ifile、ofile為檔名

ifstream infile

(ifile.

c_str()

);ofstream outfile

(ofile.

cstr()

);// 下面這種寫法功能與上面一樣

ifstream infile;

ofstream outfile;

// 呼叫open成員函式將已存在的fstream物件與特定檔案繫結

infile.

open

("in");

outfile.

open

("out"

);

注:io標準庫使用c風格字串,而不是c++ string型別的字串作為檔名,在建立fstream物件時,如果程式從標準輸入中獲取檔名,比較好的方法是將檔名讀入string物件,然後呼叫c_str()函式獲取c風格字串.

將檔案流物件與新檔案重新繫結

// fstream物件一旦開啟,就保持與指定檔案相關聯,如果把fstream物件與另乙個不同的檔案關聯,就必須先關閉現在的檔案,然後開啟乙個新的檔案.

ifstream infile

("in");

infile.

close()

;infile.

open

("next"

);

清除檔案流的狀態
// 建立並重用流物件

ifstream input;

vector

::const_iterator it = files.

begin()

;while

(it != files.

end())

while

(input >> s)

// 關閉檔案

input.

close()

;// 清除流狀態,否則因為上一次對流的讀操作到達了檔案結束符或發生錯誤,接著在input上做的任何輸入運算都會失敗

input.

clear()

;}

檔案模式

同條件狀態標誌(true、false)一樣,檔案模式也是整型常量,在開啟指定檔案時,可用位操作符(與&、或|、異或^、取反~)設定乙個或多個模式.

模式是檔案的屬性而不是流的屬性

// in 開啟檔案做讀操作

// out 開啟檔案做寫操作.以out模式開啟的檔案會被清空,丟棄該檔案中儲存的所有資料

// ate 開啟檔案後立即將檔案定義在檔案尾

// trunc 開啟檔案時清空已存在的檔案流

// binary 以二進位制模式進行io操作

// 下面兩種寫法等價

ofstream outfile

("file1");

// 相應的二進位制位做「或」操作,表示同時設定兩種模式

ofstream outfile2

("file1"

, ofstream::out | ofstream::trunc);(

"file2"

;// 對同乙個檔案作輸入和輸出操作

// 當檔案同時以in和out開啟時不清空

// 當開啟fstream所關聯的檔案時,只使用out模式,而不指定in模式,則檔案會清空已存在資料

// 當開啟檔案時指定trunc模式,無論是否同時指定in模式,檔案都會被清空

fstream inout

("file3"

, fstream::in | fstream::out)

;

開啟模式的有效組合字串流

// 建立自由的stringstream物件

stringstream strm;

// 建立儲存s副本的stringstream物件,其中s是string型別的物件

stringstream strm

(s);

// 返回strm中儲存的string型別的物件

strm.

str();

// 將string型別的s複製給strm,返回void

strm.

str(s)

;// stringstream物件的使用

string line, word;

// 從輸入中獲取一行並存入到line中

while

(getline

(cin, line)

)}

c primer 第八章 IO庫

1.常用的io庫設施 istream型別,提供輸入操作 ostream型別,提供輸出操作 cin,乙個istream物件,從標準輸入讀資料 cout,乙個ostream物件,向標準輸出寫入資料 cerr,乙個ostream物件,向標準錯誤寫資訊。從乙個istream物件讀資料 向乙個ostream物...

C Primer 第八章 IO庫

1.3 管理輸出緩衝 2.檔案輸入輸出 2.2 檔案模式 3.string 標準庫的核心就是很多容器和一族泛型演算法,這些設施幫助我們編寫簡潔高效的程式。標準庫會關注那些薄記操作的細節,特別是記憶體管理,這樣我們的程式就可以將全部的注意力投入到需要解決的問題上。io庫定義了讀寫內建型別值的操作。此外...

C Primer 筆記 第八章 IO庫

io物件無拷貝和賦值。unitbuf 使接下來每次輸出操作後都重新整理緩衝區,之後用 nounnitbuf 取消。輸入流與輸出流關聯時,任何試圖從輸入流讀取資料的操作都會重新整理它所關聯的輸出流。ostream old cin.tie nullptr 這句語句將 cin 原來關聯的輸出流存入 old...