C++ 筆記 | 第8課 流類庫的輸入與輸出
文章目錄
- C++ 筆記 | 第8課 流類庫的輸入與輸出
- 輸出流
- ostream 通用輸出流類 (標準輸出)
- ofstream 輸出文件流類 (向文件輸出)
- 打開文件的四種方式
- 常用輸出流成員函數
- open()
- close()如 `of.close();` `ofp->close();`
- put()
- write()
- seekp()和 tellp()
- flush()
- clear()`clear()` 清除 (復位) 所有錯誤標記位,包括:`goodbit`, `failbit`, `eofbit`, `badbit`, 在發生輸入輸出錯誤後,需要利用 `clear()` 讓輸入輸出流對象恢復正常。
- 錯誤處理函數
- 文本輸出格式的控制符
- ostringstream 輸出字符串流類 (向字符串輸出)
- 輸入流
- 輸入輸出流
**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 位有效數字輸出浮點數,直至按科學方式輸出浮點數
進制
進制 dec
、oct
、hex
分別以十進制、八進制、十六進制方式輸出,默認爲十進制
setiosflags(ios_base::uppercase)
將字母按大寫方式輸出十六進制數
setiosflags
setiosflags
不同於 width
和 setw
,它的影響是持久的. 用 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
來定義。