(1)cin----標準輸入流物件, 與標準輸入裝置相聯絡(通常指鍵盤)。
例如: cin>>變數名;
「>>」為提取運算子(輸入運算子),表示從鍵盤讀取資料放入變數中。
(2) cout---標準輸出流(流物件), 與標準輸出裝置相聯絡(通常指顯示器)。
例如: cout<<「資料」;
「<<」為插入運算子(輸出運算子),表示將「資料」寫到顯示器上。
(3) cerr---非緩衝型的標準出錯流物件,與標準輸出裝置相聯絡(通常指鍵盤)。
(4) clog---緩衝型的標準出錯流,與標準輸出裝置相聯絡(通常指顯示器)。
cerr與clog均用來輸出出錯資訊。
cerr和clog之間的區別是:
cerr是不經過緩衝區,直接向顯示器上輸出有關資訊,因而傳送給它的任何內容都立即輸出;
clog中的資訊存放在緩衝區中,緩衝區滿後或遇上endl時向顯示器輸出。
只要在程式中包含標頭檔案iostream.h,c++程式開始執行時這四個標準流物件的建構函式都被自動呼叫。
使用者也可以用istream和ostream等類宣告自己的流物件.
例如istream is;
ostream os;
宣告了is為輸入流物件,宣告了os為輸出流物件。
輸入輸出流的成員函式
1.put函式
put函式常用的呼叫形式為:
cout.put(單字元);
或
cout.put(字元型變數);
功能: 用於輸出乙個字元
例如:cout.put('a');
它與語句:cout<<'a'; 等價,將字元a顯示在螢幕上
說明:(1) put函式的引數不但可以是字元,還可以是字元的ascii**(也可以是乙個整型表示式)。
例如以下語句都可以將字元a顯示在螢幕上:
cout.put(65);
或cout.put(20+45);
(2) 可以在乙個語句中連續呼叫put函式。
例如:cout.put(65).put(66),cout.put('\n');
2.get函式
常用的呼叫形式為:
cin.get(字元型變數)
功能: 是從輸入流中讀取乙個字元(包括空白符),賦給字元變數,如果讀取成功則函式返回非0值,如失敗(遇檔案結束符eof)則函式返回0值。
#include //get函式應用舉例。
using namespace std;
int main()
執行時,如果輸入:
123 abc xyz
則輸出:
123 abc xyz
當輸入「ctrl+z」及回車時,程式讀入的值是eof,程式結束。
ch=cin.get();這樣的用法並不可取,,,因為cin.get()的返回值型別是int.其中可能包含其他資訊...雖說賦值操作擷取的數值是正確的...(相容c?)
3.getline函式
getline函式常用的的呼叫形式為:
cin.getline(字元陣列,字元個數n,終止標誌字元)
或//注意:只讀取 n-1個字元 ,因為要有乙個字串終止符'\0'
cin.getline(字元指標,字元個數n,終止標誌字元)
功能: 從輸入流讀取n-1個字元,賦給指定的字元陣列(或字元指標指向的陣列),然後插入乙個字串結束標誌『\0』。
如果在讀取n-1個字元之前遇到指定的終止字元,則提前結束讀取,然後插入乙個字串結束標誌'\0'。
例子 用getline函式讀入一行字元。
#includeusing namespace std;
int main()
看輸入輸出結果:
enter string one:once upon a time
string one: once upon a time
enter string two: string two:
now try again...
enter string one: once upon a time
string one: once upon a time
enter string two: there was a
string two: there was a
3 兩個比較有用的函式:peek(), putback() 和 ignore()
cin.peek(ch); 忽略字元ch
cin.putback(ch); 把當前讀到的字元替換為ch
cin.ignore(num, ch); 從當前字元開始忽略num個字元,或是碰到ch字元開始,並且把ch字元丟丟掉。
#include
using namespace std;
int main()
return 0;
}輸入輸出結果:
enter a phrase: now!is#the!time#for!fun#!
now$isthe$timefor$fun$
4 cout.put() cout.write()
與輸入相同,cout.put(ch) 返回乙個iosream物件,因此可以連續使用
cout.write(text,num) 輸出text中的num個字元,如果num > strlen(text), 則後面輸出的是text之後的記憶體中的隨機的字元。
#include
#include
using namespace std;
int main()
輸入結果:
one if by land
one if by
one if by land i?!
1 超出資料型別指定長度的賦值
(1)無符號資料型別
unsigned char ch1= 336;
unsigned char ch2 = -1;
上面兩個賦值都超出了unsigned char 型別的範圍,大部分的編譯器對這種情況是這麼處理的:允許賦值,僅僅給出乙個警告,但是是經過modulo之後的值。
cout<::const_iterator 和 const vector::iterator
看下面兩個例子,就能明白二者的區別
for (vector::const_iterator iter = text.begin();
iter != text.end(); ++ iter)
*iter = " "; // error: *iter is const
vector::const_iterator iter 允許自身變化,但不允許修改它下面指向的資料,即指向的內容是常量
vectornums(10); // nums is non const
const vector::iterator cit = nums.begin();
*cit = 1; // ok:cit can change its underlying element
++cit; // error: can't change the value of cit
const vector::iterator cit 允許修改它指向的下面的資料,不允許自身的變化,即本身是個常量
7 typedef string *pstring
const pstring cstr; 解釋這個宣告的意思?
相信大部分人是這麼理解的,typedef string *pstring 是定義了乙個指向string 的指標型別,因此const pstring cstr <=> const string * cstr
即 指向乙個const string的指標,但是這是錯誤的。
正確的解釋應該是, cstr是乙個const指標,指向string型別的字串
C 容易忽略的輸入輸出特性
1 cin cout cin.get cin.get ch 的返回值 1 cin cout 就不用多說了還是返回乙個iostream物件,因此它們可以這麼使用。cin var1 var2 var3 cout var1 var2 cin.get 沒有引數時,返回值是乙個整數,所以通常這麼用 while...
C 容易忽略的細節
1 超出資料型別指定長度的賦值 1 無符號資料型別 unsigned char ch1 336 unsigned char ch2 1 上面兩個賦值都超出了unsigned char 型別的範圍,大部分的編譯器對這種情況是這麼處理的 允許賦值,僅僅給出乙個警告,但是是經過modulo之後的值。cou...
C 容易忽略的細節
1 超出資料型別指定長度的賦值 1 無符號資料型別 unsigned char ch1 336 unsigned char ch2 1 上面兩個賦值都超出了unsigned char 型別的範圍,大部分的編譯器對這種情況是這麼處理的 允許賦值,僅僅給出乙個警告,但是是經過modulo之後的值。cou...