1.C++ I/O各類之間的繼承關系圖
參考網址:
http://www.cplusplus.com/reference/iolibrary/
Note:
在程序中包含iostream文件將自動創建8個流對象(4個用於窄字符流, 4個用於寬字符流),如下:
cin --標准輸入流,該流被關聯到標准輸入設備(通常為鍵盤) ----> wcin
cout --標准輸入流,該流被關聯到標准輸出設備(通常為顯示器) ----> wcout
cerr --標准錯誤流,類似cout,但cerr流沒有緩沖區 ----> wcerr
clog --標准錯誤流,類似cerr,但clog流擁有緩沖區 ----> wlog
由上圖可知,cin 是一個istream對象,擁有istream的相關成員函數; cout是一個ostream對象,擁有ostream的相關成員函數和數據成員
2.I/O 常見的成員函數
對於istream類而言,其常見的成員函數如下(以cin對象實例):
istream::get
--istream對get方法進行了重載,常見的調用get的形式有4種,如下:
1) int get(); //讀取下一個字符,返回該字符的ascii碼
2) istream & get(char & c); //讀取下一個字符,並將其賦值給字符變量 c
3) istream & get(char * s, streamsize n); //從輸入流中讀取指定大小的字節(參數n),並存儲到s所指向的地址空間中
4) istream & get(char * s, streamsize n, char delim); //沖輸入緩沖區中讀取n字節,並存儲到s指向的存儲空間中
Note:
1) get的第3種形式和第4種形式,均讀區最多n字節的內容;不同之處在於
istream & get(char * s, streamsize n);在讀取n字節或遇到換行符時,停止讀取
istream & get(char * s, streamsize n, char delim);在讀取n字節或遇到delim指定的分隔符時停止讀取
形式3相當於如下的形式4樣式:
get(char * s, streamsize n) ----> get(char * s, streamsize n, '\n');
2) get的后兩種形式中,當讀取的字符超過n指定的值時,get不會重置流狀態
istream::getline
istream & getline(char * s, streamsize n);
istream & getline(char * s, streamsize n, char delim);
Note:
getline 與 get都可以用來讀取一行輸入,不同在於
1) getline讀取一行時,連同換行符'\n'一起從輸入流中讀取,然后丟棄\n,在讀取的字符最后加上\0空字符,以表示字符串結尾
get不會讀取\n換行符,\n依然保留在輸入流中,以備后續的讀取
2) getline讀取超過n個字節時,重置流狀態,設置failbit等流標志位;get函數則不會進行該操作
istream::ignore
istream & ignore(streamsize n, char delim = EOF); //提取並丟棄字符
istream::gcout
streamsize gcount() const; //獲取最后一次非格式化讀取的字節數
istream::peek
int peek(); //查看輸入流中下一個字符,返回該字符的ascii碼
Note: peek僅僅查看,並不從輸入流中讀取字符
istream::putback
istream & putback(char c); //將字符c放回輸入流中(插入到輸入流中,以備下一次讀取)
istream::read
istream & read(char * s, streamsize n); //從輸入流中讀取n字節,並存儲到s指定的存儲空間中
其他:tellg , seekg //用於輸入流定位的函數
對於ostream類而言,其常見的成員函數如下(以cout對象實例):
ostream::put
ostream & put(char c); //將字符c插入到輸出流中,即打印字符c
ostream::write
ostream & write(const char * s, streamsize n); //將s從的前n個字節插入到輸入流中
其他:
tellp, seekp //用於輸出流定位的函數
flush //刷新輸出流
3.文件操作
ifstream::open
void open(const char * filename, ios_base::openmode mode = ios_base::in); //打開filename文件,並將它與ifstream對象關聯
void open(const string & filename, ios_base::openmode mode = ios_base::in);
ifstream::is_open
bool is_open() const; //檢測文件是否與ifstream對象關聯
ifstream::close
void close(); //關閉ifstream對象與文件的鏈接
ofstream::open
void open(const char * filename, ios_base::openmode mode = ios_base::out);
void open(const string & filename, ios_base:openmode mode = ios_base::out);
其他:ofstream::is_open, ofstream::close與ifstream相同
Note:
1) ios_base::openmode指定了打開文件的模式,常見的模式有:
ios_base::app //append
ios_base::ate //at end
ios_base::in //input
ios_base::out //output
ios_base::trunc //truncate
ios_base::binary //binary
2)可將多個openmode通過 | (與運算)進行組合,如:
ios_base::out|ios_base::trunc