好玩, 有趣, 項目源碼, 零基礎教程盡在: C/C++9群 99816772
C ++保持與C非常高的向後相容性,
因此可以包含
好玩, 有趣, 項目源碼, 零基礎教程盡在: C/C++9群 99816772
在之前的課程中, 這是一個使用cout的例子。 這裡我們先從輸出開始深入一點,
iostream類提供對輸出和輸入所需的物件和方法的訪問。 從位元組流的角度來看I / O, 無論是從應用程式到檔, 還是從鍵盤輸出的螢幕或印表機, 都是輸入的。
用COUT輸出如果你知道C, 你可能知道<<用來向左移位。 例如3 << 3是24.例如左移兩倍, 所以3左移乘以8。
在C ++中, <<在ostream類中被重載, 所以int, float和strings類型(及其變體, 例如double)都被支持。 這是你如何做文本輸出, 通過串在<<之間的多個項目。
cout << "Some Text" << intvalue << floatdouble << endl;這個特殊的語法是可能的, 因為每個<<實際上是一個函式呼叫, 它返回一個對一個ostream 物件的引用。 所以像上面這樣的一條線實際上是這樣的
cout.<<("some text").cout.<<( intvalue ).cout.<<(floatdouble).cout.<<(endl) ;C 函數 printf能夠使用格式說明符(如%d)格式化輸出。 在C ++中, cout也可以格式化輸出, 但是使用不同的方法。
物件cout是iostream庫的成員。 請記住, 這必須包含在一個
#include這個庫iostream是從ostream(用於輸出)和輸入的istream派生的。
文本輸出的格式化是通過將操縱器插入到輸出流中來完成的。
什麼是機械手?這是一個可以改變輸出(和輸入)流的特性的函數。 在前一頁中, 我們看到<<是一個重載函數, 它返回對調用物件的引用, 例如cout輸出或cin輸入。 所有的操縱器都這樣做, 所以你可以將它們包含在輸出<<或輸入>>中。 我們來看看輸入>>後來在這一課。
count << endl;endl是一個結束行的操作符(並開始一個新行)。 這個函數也可以這樣調用。
endl(cout) ;雖然在實踐中你不會這樣做。 你這樣使用它。
cout << "Some Text" << endl << endl; // Two blank lines檔只是流需要記住的是, 近來在GUI應用程式中進行了許多開發, 為什麼還需要文本I / O功能?這不僅僅是控制台應用程式?那麼你可能會做檔I / O,
文本I / O。 在控制台應用程式中。
字串。 方便格式化。
文件I / O。
再次操縱機器人
雖然我們一直使用ostream類, 但它是從ios_base派生的ios類的派生類。 這個祖先階級定義了作為操縱者的公共職能。
Cout機器人列表可以在輸入或輸出流中定義操縱器。
這些物件返回物件的引用,
並放置在<<對之間。
大多數操縱符都在
這是一個更詳細的清單。
從
endl - 結束行並調用flush。
結束 - 將' 0'(NULL)插入到流中。
刷新 - 強制緩衝區立即輸出。
從
boolalpha - 插入或提取bool對象為“true”或“false”。
noboolalpha - 插入或提取bool物件作為數位值。
fixed - 以固定格式插入浮點值。
科學 - 以科學格式插入浮點值。
內部 - 內部證明。
左 - 左對齊。
正確的 - 正確的。
dec - 以十進位格式插入或提取整數值。
十六進位 - 以十六進位(基本16)格式插入或提取整數值。
oct - 以八進制(基本8)格式插入或提取值。
noshowbase - 不要以其基數為首碼。
showbase - 基於首碼的值。
noshowpoint - 如果沒有必要, 不要顯示小數點。
顯示點 - 插入浮點值時始終顯示小數點。
noshowpos - 如果number> = 0, 不要插入加號(+)。
showpos - 如果number> = 0, 則插入加號(+)。
noskipws - 不要跳過提取的初始空白。
skipws - 在提取時跳過最初的空格。
nouppercase - 不要用大寫字母替換小寫字母。
大寫 - 用大寫字母替換小寫字母。
unitbuf - 插入後沖洗緩衝區。
nounitbuf - 每次插入後都不要沖洗緩衝區。
使用Cout的例子// ex2_2cpp#include "stdafx.h"#include下面的輸出是為了清楚起見,刪除了一個或兩個額外的行空格。
TestTest 2Test 346David4.50678762E+011450678762345.122990000X4D202322+12344d223221234注:儘管大寫,大衛是列印為大衛而不是大衛。這是因為大寫字母僅影響生成的輸出,例如以十六進位列印的數位。所以當大寫字母在運行時,十六進位輸出4d2是4D2。
而且,這些操縱器中的大部分實際上都是設置了一個標誌位元,並可以直接設置它
cout.setf()並用它清除
cout.unsetf()05
08
使用Setf和Unsetf來操作I / O格式
函數setf有兩個重載的版本,如下所示。而unsetf只是清除指定的位。
setf( flagvalues) ;setf( flagvalues, maskvalues) ;unsetf( flagvalues) ;變數標誌是通過將所有您想要的位與| 進行OR運算而得到的。所以,如果你想科學,大寫和boolalpha然後使用這個。只有傳入的參數被設置。其他位保持不變。
cout.setf( ios_base::scientific | ios_base::uppercase | ios_base::boolalpha) ;cout << hex << endl;cout << 1234 << endl;cout << dec << endl;cout << 123400003744.98765 << endl;bool value=true;cout << value << endl;cout.unsetf( ios_base::boolalpha) ;cout << value << endl;產生
4D21.234000E+011true1掩蔽位setf 的兩個參數版本使用一個遮罩。如果該位在第一和第二參數中都被設置,那麼它被設置。如果該位只在第二個參數中被清除。值adjustfield,basefield和floatfield(如下所列)是複合標誌,即多個標誌進行或運算在一起。對於值為0x0e00的basefield與dec |相同 oct | 十六進位。所以
setf( ios_base::hex,ios_basefield ) ;清除所有三個標誌,然後設置十六進位。同樣的adjustfield是留下| right | 內部和floatfield是科學的 固定。
位列表這個枚舉列表取自Microsoft Visual C ++ 6.0。實際使用的值是任意的 - 另一個編譯器可能使用不同的值。
skipws = 0x0001unitbuf = 0x0002uppercase = 0x0004showbase = 0x0008showpoint = 0x0010showpos = 0x0020left = 0x0040right = 0x0080internal = 0x0100dec = 0x0200oct = 0x0400hex = 0x0800scientific = 0x1000fixed = 0x2000boolalpha = 0x4000adjustfield = 0x01c0basefield = 0x0e00,floatfield = 0x3000_Fmtmask = 0x7fff,_Fmtzero = 0關於Clog和Cerr像cout一樣,clog和cerr是在ostream中定義的預定義物件。iostream類從ostream和istream繼承,所以這就是為什麼cout示例可以使用iostream。
好玩,有趣,項目源碼,零基礎教程盡在: C/C++9群 99816772
緩衝和無緩衝緩衝 - 所有輸出都暫時存儲在緩衝區中,然後一次轉儲到螢幕上。cout和clog都被緩衝。
無緩衝 - 所有輸出立即到達輸出設備。一個沒有緩衝的物件的例子是cerr。
下面的例子表明cerr和cout的用法相同。
#include緩衝的主要問題是,如果程式崩潰,那麼緩衝區內容就會丟失,而且很難明白為什麼它會崩潰。無緩衝的輸出是即時的,所以通過代碼灑這樣幾行可能會有用。
cerr << "Entering Dangerous function zappit" << endl;記錄問題編寫程式事件的日誌可能是發現難題的一種有用的方法 - 只是偶爾發生的類型。如果該事件發生崩潰,則會出現問題 - 每次調用後都會將日誌刷新到磁片,以便您可以查看事件直至崩潰或將其保存在緩衝區中,並定期刷新緩衝區,並希望不會發生事故時失去太多?
使用Cin作為輸入:格式化輸入有兩種類型的輸入。
格式化。以數位或特定類型讀取輸入。
未格式化。讀取位元組或字串。這對輸入流提供了更好的控制。
這是一個格式化輸入的簡單例子。
// excin_1.cpp : Defines the entry point for the console application.#include "stdafx.h" // Microsoft only#include這使用cin讀取由空格分隔的三個數位(int,float,int)。輸入號碼後必須按回車。
3 7.2 3將輸出“您輸入3 7.2 3”。
格式化輸入有限制!
如果輸入3.76 5 8,則會顯示“您輸入3 0.76 5”,該行上的所有其他值都將丟失。這是行為正確的,因為。不是int的一部分,所以標誌著float的開始。
錯誤捕獲好玩,有趣,項目源碼,零基礎教程盡在: C/C++9群 99816772
如果輸入未成功轉換,則cin物件會設置一個失敗位元。這個位是ios的一部分,可以像這樣在cin和cout上使用fail()函數來讀取。
if (cin.fail() ) // do something毫不奇怪,很少設置,至少在螢幕輸出。在稍後的檔I / O課程中,我們將看到如何變成真的。對於cin,cout等也有一個很好的()函數。 cout.fail()cout.fail()
格式化輸入中的錯誤陷印這裡是一個輸入迴圈的例子,直到正確輸入一個浮點數。
// excin_2.cpp#include "stdafx.h" // Microsoft only#include這個例子請求一個浮點數,只有當它有一個時才退出。如果無法轉換輸入,則會輸出錯誤消息,並調用clear()來清除失敗位。該忽略功能跳過輸入行的所有的休息。256是一個足夠多的字元, n將在所有的256被讀取之前被達到。
注意:像654.56Y這樣的輸入將一直讀到Y,提取654.56並退出迴圈。它被認為是cin的有效輸入
未格式化的輸入這是輸入字元或整行的更強大的方式,而不是鍵盤輸入,但是這將留給稍後的檔I / O課程。
鍵盤輸入所有的輸入,使用cin需要輸入或返回鍵被按下。標準C ++不提供直接從鍵盤讀取字元的方法。在未來的課程中,我們將看到如何用協力廠商庫來做到這一點。
這結束了課程。
nounitbuf - 每次插入後都不要沖洗緩衝區。
使用Cout的例子// ex2_2cpp#include "stdafx.h"#include下面的輸出是為了清楚起見,刪除了一個或兩個額外的行空格。
TestTest 2Test 346David4.50678762E+011450678762345.122990000X4D202322+12344d223221234注:儘管大寫,大衛是列印為大衛而不是大衛。這是因為大寫字母僅影響生成的輸出,例如以十六進位列印的數位。所以當大寫字母在運行時,十六進位輸出4d2是4D2。
而且,這些操縱器中的大部分實際上都是設置了一個標誌位元,並可以直接設置它
cout.setf()並用它清除
cout.unsetf()05
08
使用Setf和Unsetf來操作I / O格式
函數setf有兩個重載的版本,如下所示。而unsetf只是清除指定的位。
setf( flagvalues) ;setf( flagvalues, maskvalues) ;unsetf( flagvalues) ;變數標誌是通過將所有您想要的位與| 進行OR運算而得到的。所以,如果你想科學,大寫和boolalpha然後使用這個。只有傳入的參數被設置。其他位保持不變。
cout.setf( ios_base::scientific | ios_base::uppercase | ios_base::boolalpha) ;cout << hex << endl;cout << 1234 << endl;cout << dec << endl;cout << 123400003744.98765 << endl;bool value=true;cout << value << endl;cout.unsetf( ios_base::boolalpha) ;cout << value << endl;產生
4D21.234000E+011true1掩蔽位setf 的兩個參數版本使用一個遮罩。如果該位在第一和第二參數中都被設置,那麼它被設置。如果該位只在第二個參數中被清除。值adjustfield,basefield和floatfield(如下所列)是複合標誌,即多個標誌進行或運算在一起。對於值為0x0e00的basefield與dec |相同 oct | 十六進位。所以
setf( ios_base::hex,ios_basefield ) ;清除所有三個標誌,然後設置十六進位。同樣的adjustfield是留下| right | 內部和floatfield是科學的 固定。
位列表這個枚舉列表取自Microsoft Visual C ++ 6.0。實際使用的值是任意的 - 另一個編譯器可能使用不同的值。
skipws = 0x0001unitbuf = 0x0002uppercase = 0x0004showbase = 0x0008showpoint = 0x0010showpos = 0x0020left = 0x0040right = 0x0080internal = 0x0100dec = 0x0200oct = 0x0400hex = 0x0800scientific = 0x1000fixed = 0x2000boolalpha = 0x4000adjustfield = 0x01c0basefield = 0x0e00,floatfield = 0x3000_Fmtmask = 0x7fff,_Fmtzero = 0關於Clog和Cerr像cout一樣,clog和cerr是在ostream中定義的預定義物件。iostream類從ostream和istream繼承,所以這就是為什麼cout示例可以使用iostream。
好玩,有趣,項目源碼,零基礎教程盡在: C/C++9群 99816772
緩衝和無緩衝緩衝 - 所有輸出都暫時存儲在緩衝區中,然後一次轉儲到螢幕上。cout和clog都被緩衝。
無緩衝 - 所有輸出立即到達輸出設備。一個沒有緩衝的物件的例子是cerr。
下面的例子表明cerr和cout的用法相同。
#include緩衝的主要問題是,如果程式崩潰,那麼緩衝區內容就會丟失,而且很難明白為什麼它會崩潰。無緩衝的輸出是即時的,所以通過代碼灑這樣幾行可能會有用。
cerr << "Entering Dangerous function zappit" << endl;記錄問題編寫程式事件的日誌可能是發現難題的一種有用的方法 - 只是偶爾發生的類型。如果該事件發生崩潰,則會出現問題 - 每次調用後都會將日誌刷新到磁片,以便您可以查看事件直至崩潰或將其保存在緩衝區中,並定期刷新緩衝區,並希望不會發生事故時失去太多?
使用Cin作為輸入:格式化輸入有兩種類型的輸入。
格式化。以數位或特定類型讀取輸入。
未格式化。讀取位元組或字串。這對輸入流提供了更好的控制。
這是一個格式化輸入的簡單例子。
// excin_1.cpp : Defines the entry point for the console application.#include "stdafx.h" // Microsoft only#include這使用cin讀取由空格分隔的三個數位(int,float,int)。輸入號碼後必須按回車。
3 7.2 3將輸出“您輸入3 7.2 3”。
格式化輸入有限制!
如果輸入3.76 5 8,則會顯示“您輸入3 0.76 5”,該行上的所有其他值都將丟失。這是行為正確的,因為。不是int的一部分,所以標誌著float的開始。
錯誤捕獲好玩,有趣,項目源碼,零基礎教程盡在: C/C++9群 99816772
如果輸入未成功轉換,則cin物件會設置一個失敗位元。這個位是ios的一部分,可以像這樣在cin和cout上使用fail()函數來讀取。
if (cin.fail() ) // do something毫不奇怪,很少設置,至少在螢幕輸出。在稍後的檔I / O課程中,我們將看到如何變成真的。對於cin,cout等也有一個很好的()函數。 cout.fail()cout.fail()
格式化輸入中的錯誤陷印這裡是一個輸入迴圈的例子,直到正確輸入一個浮點數。
// excin_2.cpp#include "stdafx.h" // Microsoft only#include這個例子請求一個浮點數,只有當它有一個時才退出。如果無法轉換輸入,則會輸出錯誤消息,並調用clear()來清除失敗位。該忽略功能跳過輸入行的所有的休息。256是一個足夠多的字元, n將在所有的256被讀取之前被達到。
注意:像654.56Y這樣的輸入將一直讀到Y,提取654.56並退出迴圈。它被認為是cin的有效輸入
未格式化的輸入這是輸入字元或整行的更強大的方式,而不是鍵盤輸入,但是這將留給稍後的檔I / O課程。
鍵盤輸入所有的輸入,使用cin需要輸入或返回鍵被按下。標準C ++不提供直接從鍵盤讀取字元的方法。在未來的課程中,我們將看到如何用協力廠商庫來做到這一點。
這結束了課程。