輸入輸出流ios
輸入輸出的含義:數組
從操做系統的角度看,每個與主機相連的輸入輸出設備都被看做一個文件。安全
程序的輸入:從文件傳送給程序。app
程序的輸出:從程序傳送給文件。函數
分類:spa
一、標準I/O 鍵盤輸入 顯示器輸出操作系統
二、文件I/O 外存輸入 外存輸出指針
三、字符串I/O 內存輸入 內存輸出對象
C語言回顧ip
int i= 1; //假定佔2字節
printf("%d",i); //正確輸出
printf("%d",f); //f爲float型,只輸出f變量的前兩個字節
printf("%d","C++"); //輸出字符串的起始地址
scanf("%d",&i);//將內容寫入變量i
scanf("%d",i);//將內容寫入內存地址爲i的地方
C++的輸入輸出中,編譯系統對數據類型進行嚴格的檢查。
C++的I/O操做是類型安全的。 type safe
——————————————————————————————
流stream
輸入輸出流是指由若干字節組成的字節序列,這些字節中的數據按順序從一個對象傳送到另外一對象。
流表示了信息從源到目的端的流動。
實際上,在內存中爲每個數據流開闢一個內存緩衝區,用來存放流中的數據。
流是與緩衝區相對應的。
緩衝區中的數據就是流。
輸入輸出流被定義爲類
I/O庫中的類被稱爲流類 stream class
用流類定義的對象被稱爲流對象
ios
istream ostream fstreambase strstreambase
iostream ifstream istrstream ofstream ostrstream istream_withassign ostream_withassign
fstream strstream iostream_withassign
與iostream類庫有關的頭文件
iostream 包含輸入輸出流的基本信息
fstream 文件I/O
strstream 字符串I/O
stdiostream 用於混合使用C和C++的I/O機制:例如想將C程序轉變爲C++程序
iomanip 使用格式化I/O時應包含此頭文件
在iostream頭文件中定義的類:
ios istream ostream iostream istream_withassign ostream_withassign istream_withassign
在iostream頭文件中定義的對象:
cin istream_withassign類對象 stdin
cout ostream_withassign類對象 stdout
cerr ostream_withassign類對象 stderr
clog ostream_withassign類對象 stderr
—————————————————————————————
標準輸出流
cout流對象
console output
一、cout是流對象
二、自動判斷輸出類型
三、在內存中自動開闢緩衝區,插入endl時輸出緩衝區中的全部數據,並刷新流。
「\n」沒有此效果(不是全部編譯系統都體現這一區別)
cerr流對象
console error
向標準出錯設備 standard error device 輸出有關出錯信息
和cout的不一樣:
cout能夠被重定向輸出到磁盤文件
cerr不能重定向,只能在顯示器輸出
clog流對象
console log
標準出錯流 做用與cerr相同
與cerr區別:
cerr不通過緩衝區
clog有緩衝區
——————————————————————————————
格式輸出
|--使用控制符
|--使用流對象的有關成員函數
使用控制符控制輸出格式:
頭文件iomanip
dec hex oct
setbase(n)
setfill(c)
setprecision(n)
setw(n)
setiosflags(ios::fixed)
setiosflags(ios::scientific)
setiosflags(ios::left)
setiosflags(ios::right)
setiosflags(ios::skipws)
setiosflags(ios::uppercase)
setiosflags(ios::showpos)
resetioflags()
用流對象的成員函數控制輸出格式
cout中的成員函數
precision(n)
width(n)
fill(c)
setf()
unsetf()
格式標誌在ios中被定義爲枚舉值
ios::left
ios::right
ios::internal
ios::dec
ios::oct
ios::hex
ios::showbase
ios::showpoint
ios::uppercase
ios::showpos
ios::scientific
ios::fixed
ios::unitbuf 每次輸出後刷新
iso::stdio 每次輸出後清除stdout stderr
說明:
一、成員函數width(n)和控制符setw(n)只對其後的第一個輸出項有效
二、輸出格式狀態分爲5組,每組中只能一個生效
三、用setf函數設置格式狀態時,能夠包含兩個或多個格式標誌
這些格式標誌在ios類中被定義爲枚舉值,每個格式標誌以一個二進位表明
能夠用「位或」運算符「|」組合多個格式標誌
cout.setf(ios::internal | ios::showpos);
用控制符更爲方便
——————————————————————————————
用流成員函數put輸出字符
專用於輸出單個字符的成員函數put
cout.put('a'); //字符
cout.put(65+32); //ASCII碼
cout.put(71).put(79).put(79).put(68).put('\n');// GOOD
C語言中,putchar()定義在stdio.h中
C++中,putchar()定義在iostream中
———————————————————————————
標準輸入流 鍵盤
>> 流提取符 終止標誌:輸入流中的white space(空格 tab 換行)
只有輸入完數據再按回車鍵後,該行數據才被送入鍵盤緩衝區,造成輸出流,提取運算符">>"才能從中提取數據。
cin
正常狀態:1 true
出錯狀態:0 false 無效字符 文件結束符
文件結束符
IBM PC Ctrl+Z
Unix Ctrl+D
用於字符輸入的流成員函數
get的3種形式
|--cin.get() 返回讀入的字符 遇EOF結束 C語言中的getchar()功能相同
|--cin.get(ch) 返回bool值 C語言中的getchar(ch)
|--cin.get(字符數組,字符個數,終止字符) 讀取n-1個字符賦給字符數組,終止字符默認爲'\n'
getline(字符數組,字符個數,終止字符)
和cin.get的不一樣,cin.get在終止字符以前中止,getline在終止字符以後中止
>>可讀取標準類型
getline只能操做字符
eof函數 end of file
cin.eof() 末尾爲真
peek函數
cin.peek() 觀察下一字符而指針不動
putback函數
cin.putback(ch) 將字符ch插入到當前指針位置,以供後面讀取
ignore函數
cin.ignore(n,終止字符)
cin.ignore(5, 'A') //跳過輸入流中的5個字符,遇A終止跳躍
cin.ignore() //等同於 cin.ignore(1,EOF)
——————————————————————————————
文件操做與文件流
文件的概念:file 存儲在外部介質上數據的集合
操做系統以文件爲單位對數據進行管理
文件分類:
|--程序文件 program file .cpp .obj .exe
|--數據文件 data file
在程序運行時,將一些數據輸出到磁盤上存放起來,之後須要時再從磁盤中輸入到計算機內存
組織形式劃分:
|--ASCII文件 字符文件
|--二進制文件 字節文件
int i = 100;
低級I/O 二進制形式 不進行數據格式轉換
高級I/O 字符串形式 將數據從內存送到顯示器輸出
——————————————————————————————
輸出文件流:從內存流向外存文件的數據
輸入文件流:從外存文件流向內存的數據
文件流類
ifstream ASCII 二進制 文件輸入
ofstream ASCII 二進制 文件輸出
fstream 二進制文件輸入輸出
必須事先定義流對象
cin cout cerr clog 是在iostream中已經定義好的流對象
ofstram outfile;//定義輸出文件流對象
文件的打開與關閉
文件流對象.open(磁盤文件名,輸入輸出方式);
outfile.open("f1.dat",ios::out);
ofstream outfile("f1.dat",ios::out);
輸入輸出方式在ios類中定義,是枚舉常量
ios::in
ios::out
ios::app
ios::ate
ios::trunc
ios::binary
ios::nocreate 新版C++不提供
ios::noreplace 新版C++不提供
ios::in | ios::out
ios::out |ios::binary
ios::in | ios::binary
每打開一個文件都有一個文件指針
打開操做失敗,返回0
構造函數失敗,返回0
關閉磁盤文件
outfile.close();
C語言,exit() 函數定義在 stdlib.h中
—————————————————————————————
對ASCII文件的操做的兩種操做
|-- << >>
|--get getline
put
對二進制文件的操做
將內存中數據存儲形式不加轉換地傳送到磁盤文件,所以它又稱爲內存數據的映象文件 又稱爲字節文件。
在打開時要用ios::binary指定爲二進制形式傳送和存儲。
二進制文件能夠既能輸入,又能輸出——與ASCII文件不一樣的地方。
用fstream定義輸入輸出的二進制文件
用成員函數read write 讀寫
istream& read(char *buffer, int len);
ostream& write(const char *buffer, int len);
與文件指針有關的流成員函數
二進制文件容許對指針進行控制,以便在該位置上進行讀寫
gcout()
tellg()
seekg(文件中的位置)
seekg(位移量,參照位置)
tellp()
seekp(文件中的位置)
seekp(位移量,參照位置)
位移量 和 參照位置 爲long型整數,以字節爲單位
參照位置:在ios中定義的枚舉常量
ios::beg
ios::cur
ios::end
—————————————————————————
字符串流
之內存中用戶定義的字符數組(字符串)爲輸入輸出的對象
內存 <-> 緩衝區 <-> 數組
二進制 ASCII ASCII
istrstream
ostrstream
strstream
不須要打開和關閉字符串流
自定義結束標誌
輸出字符串流對象
ostrstream構造函數原型
ostrstream::ostrstream(char * buffer, int n, int mode = ios::out);
//第三個參數默認爲ios::out
//n 緩衝區大小(與數組能夠相同,也能夠不一樣)
ostrstream srtout(ch1, 20);
輸入字符串流對象
istrstream::istrstream(char * buffer);
istrstream::istrstream(char * buffer, int n);
istream strin(ch2);
istream strin(ch2,20);
輸入輸出字符串流對象
strstream::strstream(char * buffer, int n, int mode);
strstream strio(ch3, sizeof(ch3), ios::in | ios::out);
明天二級 2016-3-25