C++ 筆記 | 第8課 流類庫的輸入與輸出

C++ 筆記 | 第8課 流類庫的輸入與輸出


**I/O 流 ** 負責在兩個對象之間建立聯繫, 並管理數據的流動.

讀操作在流數據抽象中被稱爲 從流中提取.
寫操作在流數據抽象中被稱爲 向流中插入.

輸出流

ostream 通用輸出流類 (標準輸出)

cout 標準輸出
cerr 標準錯誤輸出, 無緩衝, 立即輸出
clog 標準錯誤輸出, 有緩衝, 緩衝區滿時再輸出
<< 插入運算符

ofstream 輸出文件流類 (向文件輸出)

打開文件的四種方式

ofstream of("filename", iosmode);
/////
ofstream of;
of.open("filename", iosmode);
/////
ofstream *ofp = new ofstream("filename", iosmode);
/////
ofstream *ofp=new ofstream ;
ofp->open("filename", iosmode);

iosmode

of.open("filename") 默認以文本寫的方式打開文件

ios_base::app 文件尾添加
ios_base::ate 打開現存文件並移到文件尾
ios_base::in 打開一個輸入文件
ios_base::out 寫方式打開, 隱含模式, 可以省略
ios_base::trunc 打開文件, 抹去原有內容
ios_base::binary 二進制方式打開 (默認文本方式打開)
ios_base::nocreate 打開已有文件,否則失敗
ios_base::noreplace 文件不存在則生成,否則失敗

以上各方式可以通過 | 運算符組合起來使用

常用輸出流成員函數

open()

ios_base:: 是 ISO C++ 方式

close()如 of.close(); ofp->close();

文件使用完畢必須關閉; 不過 ofstream 類的析構函數也能自動完成文件關閉

put()

cout.put('A'); // cout << 'A';
of.put('A'); // of << 'A';

write()

二進制方式寫到文件輸出流中。
of.write((char *)&dt, sizeof dt);
一定要把輸出對象的指針轉成 char * 型 按字節輸出

seekp()和 tellp()

tellp() 返回當前文件指針位置
seekp(n, pos) 設置指針位置

pos 取值

ios_base::beg 從文件頭開始 (默認)
ios_base::end 從文件尾開始
ios_base::cur 從文件指針的當前位置開始

flush()

清空 I/O 緩衝區 到文件中, 防止出現同時寫 / 讀同一文件時,內容不同步。

clear()clear() 清除 (復位) 所有錯誤標記位,包括:goodbit, failbit, eofbit, badbit, 在發生輸入輸出錯誤後,需要利用 clear() 讓輸入輸出流對象恢復正常。

同一個流對象在打開過一個文件並關閉後, 再打開另一個文件前,最好先調用一次 clear 函數, 給流對象復位。

錯誤處理函數

eof() 遇到文件尾則返回一個非 0 值
bad()
fail()
good()

文本輸出格式的控制符

setw 操縱符

width() setw() 設置隨後的輸出項寬度
cout.width() 設置隨後的輸出項寬度
cout.fill() 用 () 中的符號填充空白

對齊方式

(需要 #include<iomanip>)
setiosflags(ios_base::right) (默認) 右對齊
setiosflags(ios_base::left) 左對齊

精度

setprecision(i) 設置隨後輸出的浮點數 i 位小數 setiosflags(ios_base::fixed) 小數方式 setiosflags(ios_base::scientific) 科學方式
始終按 6 位有效數字輸出浮點數,直至按科學方式輸出浮點數

進制

進制 decocthex 分別以十進制、八進制、十六進制方式輸出,默認爲十進制
setiosflags(ios_base::uppercase)
將字母按大寫方式輸出十六進制數

setiosflags

setiosflags 不同於 widthsetw,它的影響是持久的. 用 resetiosflags 操作符關閉前面 setiosflags 設置的標誌, 重新恢復默認值時 setiosflags 設置的標誌影響力才終止。此時下一個 setiosflags 設置纔會起作用。

ostringstream 輸出字符串流類 (向字符串輸出)

輸入流

istream 通用輸入流類 (標準輸入)

cin
提取操作符 >>
可以用 dec oct hex 改變輸入流的輸入方式
get getline 的功能是從輸入流一次讀入多個字符, 幷包括控制符, 可以從標準設備 / 文件輸入.

ifstream 輸入文件流類 (從文件輸入)

打開文件的四種方式

ifstream inf("filename", iosmode);
/////
ifstream inf;
inf.open("filename", iosmode);
/////
ifstream *infp=new ifstream("filename", iosmode);
/////
ifstream *infp=new ifstream ;
infp->open("filename", iosmode);

iosmode

ios_base::in (默認方式)
ios_base::binary 二進制方式 (默認文本方式)

輸入流常用函數

read()

實現二進制讀

seekg()和 tellg()

seekg() 返回當前文件指針位置
seekg(n, pos) 設置指針位置

pos 取值

ios_base::beg 從文件頭開始 (默認)
ios_base::end 從文件尾開始
ios_base::cur 從文件指針的當前位置開始

ignore()ignore(n, 終止字符) 跳過輸入流的 n 個字符, 或直到指定的終止字符 (終止字符也跳過),終止字符 可以是任意字符,但通常是回車符 \n

sync()sync() 清空輸入輸出緩衝區,把輸入丟掉,把輸出打印出來 (或送到文件中)。

清空輸入緩衝區

#include<iostream>
#include<limits>
using namespace std;
cin.clear( ); // 清除 std::cin 的錯誤狀態
cin.ignore(numeric_limits<streamsize>::max(), '\n');// 跳過能跳過的最大數 ( 也就是全部跳過)
#include<iostream>
using namespace std;
cin.clear(); // 清除 std::cin 的錯誤狀態
cin.sync( ); // 清空輸入緩衝區

fail()fail() 可由 cin.fail() 判斷上一次的輸入是否成功

good() bad() eof()

peek()

預覽將要讀入的下一個字符,但不改變輸入流。

putback()

將一個字符放回到輸入流中。但放回去的字符數不能超過讀入的字符數。

unget()

將最近讀入的一個字符放回到輸入流中。

istringstream 輸入字符串流類 (從字符串輸入)

輸入輸出流

fstream 爲輸入輸出流,它有兩個子類:
ifstream(input file stream)
ofstream(output file stream)

其中 ifstream 默認以輸入方式打開文件, ofstream 默認以輸出方式打開文件。

所以,在實際應用中,根據需要的不同,選擇不同的類來定義

如果想以輸入 / 輸出方式來打開,就用 fstream 來定義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章