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