您的位置:首頁>正文

C++的First Blood,最全面的C++輸出和輸出內容概括,何其磅礴

一種新的輸出方式

好玩, 有趣, 項目源碼, 零基礎教程盡在: C/C++9群 99816772

C ++保持與C非常高的向後相容性, 因此可以包含以便訪問printf()函數以進行輸出。

但是, C ++提供的I / O功能更強大, 更重要的是類型安全。 您仍然可以使用scanf()進行輸入, 但是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格式化輸出

物件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, 從 結束並刷新。 幾個操縱器採取一個參數, 這些來自

這是一個更詳細的清單。

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 using namespace std;int main(int argc, char* argv[]){cout.width(10) ;cout << right << "Test" << endl;cout << left << "Test 2" << endl;cout << internal <<"Test 3" << endl;cout << endl;cout.precision(2) ;cout << 45.678 << endl;cout << uppercase << "David" << endl;cout.precision(8) ;cout << scientific << endl;cout << 450678762345.123 << endl;cout << fixed << endl;cout << 450678762345.123 << endl;cout << showbase << endl;cout << showpos << endl;cout << hex << endl;cout << 1234 << endl;cout << oct << endl;cout << 1234 << endl;cout << dec << endl;cout << 1234 << endl;cout << noshowbase << endl;cout << noshowpos << endl;cout.unsetf(ios::uppercase) ;cout << hex << endl;cout << 1234 << endl;cout << oct << endl;cout << 1234 << endl;cout << dec << endl;cout << 1234 << endl;return 0;}

下面的輸出是為了清楚起見,刪除了一個或兩個額外的行空格。

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 using namespace std;int _tmain(int argc, _TCHAR* argv[]){ cerr.width(15) ;cerr.right;cerr << "Error" << endl;return 0;}

緩衝的主要問題是,如果程式崩潰,那麼緩衝區內容就會丟失,而且很難明白為什麼它會崩潰。無緩衝的輸出是即時的,所以通過代碼灑這樣幾行可能會有用。

cerr << "Entering Dangerous function zappit" << endl;記錄問題

編寫程式事件的日誌可能是發現難題的一種有用的方法 - 只是偶爾發生的類型。如果該事件發生崩潰,則會出現問題 - 每次調用後都會將日誌刷新到磁片,以便您可以查看事件直至崩潰或將其保存在緩衝區中,並定期刷新緩衝區,並希望不會發生事故時失去太多?

使用Cin作為輸入:格式化輸入

有兩種類型的輸入。

格式化。以數位或特定類型讀取輸入。

未格式化。讀取位元組或字串。這對輸入流提供了更好的控制。

這是一個格式化輸入的簡單例子。

// excin_1.cpp : Defines the entry point for the console application.#include "stdafx.h" // Microsoft only#include using namespace std;int main(int argc, char* argv[]){int a = 0;float b = 0.0;int c = 0;cout << "Please Enter an int, a float and int separated by spaces" <> a >> b >> c;cout << "You entered " << a << " " << b << " " << c << endl;return 0;}

這使用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 using namespace std;int main(int argc, char* argv[]){float floatnum;cout << "Enter a floating point number:" <> floatnum)){cin.clear() ;cin.ignore(256,' ') ;cout << "Bad Input - Try again" << endl;}cout << "You entered " << floatnum << endl;return 0;}

這個例子請求一個浮點數,只有當它有一個時才退出。如果無法轉換輸入,則會輸出錯誤消息,並調用clear()來清除失敗位。該忽略功能跳過輸入行的所有的休息。256是一個足夠多的字元, n將在所有的256被讀取之前被達到。

注意:像654.56Y這樣的輸入將一直讀到Y,提取654.56並退出迴圈。它被認為是cin的有效輸入

未格式化的輸入

這是輸入字元或整行的更強大的方式,而不是鍵盤輸入,但是這將留給稍後的檔I / O課程。

鍵盤輸入

所有的輸入,使用cin需要輸入或返回鍵被按下。標準C ++不提供直接從鍵盤讀取字元的方法。在未來的課程中,我們將看到如何用協力廠商庫來做到這一點。

這結束了課程。

nounitbuf - 每次插入後都不要沖洗緩衝區。

使用Cout的例子// ex2_2cpp#include "stdafx.h"#include using namespace std;int main(int argc, char* argv[]){cout.width(10) ;cout << right << "Test" << endl;cout << left << "Test 2" << endl;cout << internal <<"Test 3" << endl;cout << endl;cout.precision(2) ;cout << 45.678 << endl;cout << uppercase << "David" << endl;cout.precision(8) ;cout << scientific << endl;cout << 450678762345.123 << endl;cout << fixed << endl;cout << 450678762345.123 << endl;cout << showbase << endl;cout << showpos << endl;cout << hex << endl;cout << 1234 << endl;cout << oct << endl;cout << 1234 << endl;cout << dec << endl;cout << 1234 << endl;cout << noshowbase << endl;cout << noshowpos << endl;cout.unsetf(ios::uppercase) ;cout << hex << endl;cout << 1234 << endl;cout << oct << endl;cout << 1234 << endl;cout << dec << endl;cout << 1234 << endl;return 0;}

下面的輸出是為了清楚起見,刪除了一個或兩個額外的行空格。

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 using namespace std;int _tmain(int argc, _TCHAR* argv[]){ cerr.width(15) ;cerr.right;cerr << "Error" << endl;return 0;}

緩衝的主要問題是,如果程式崩潰,那麼緩衝區內容就會丟失,而且很難明白為什麼它會崩潰。無緩衝的輸出是即時的,所以通過代碼灑這樣幾行可能會有用。

cerr << "Entering Dangerous function zappit" << endl;記錄問題

編寫程式事件的日誌可能是發現難題的一種有用的方法 - 只是偶爾發生的類型。如果該事件發生崩潰,則會出現問題 - 每次調用後都會將日誌刷新到磁片,以便您可以查看事件直至崩潰或將其保存在緩衝區中,並定期刷新緩衝區,並希望不會發生事故時失去太多?

使用Cin作為輸入:格式化輸入

有兩種類型的輸入。

格式化。以數位或特定類型讀取輸入。

未格式化。讀取位元組或字串。這對輸入流提供了更好的控制。

這是一個格式化輸入的簡單例子。

// excin_1.cpp : Defines the entry point for the console application.#include "stdafx.h" // Microsoft only#include using namespace std;int main(int argc, char* argv[]){int a = 0;float b = 0.0;int c = 0;cout << "Please Enter an int, a float and int separated by spaces" <> a >> b >> c;cout << "You entered " << a << " " << b << " " << c << endl;return 0;}

這使用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 using namespace std;int main(int argc, char* argv[]){float floatnum;cout << "Enter a floating point number:" <> floatnum)){cin.clear() ;cin.ignore(256,' ') ;cout << "Bad Input - Try again" << endl;}cout << "You entered " << floatnum << endl;return 0;}

這個例子請求一個浮點數,只有當它有一個時才退出。如果無法轉換輸入,則會輸出錯誤消息,並調用clear()來清除失敗位。該忽略功能跳過輸入行的所有的休息。256是一個足夠多的字元, n將在所有的256被讀取之前被達到。

注意:像654.56Y這樣的輸入將一直讀到Y,提取654.56並退出迴圈。它被認為是cin的有效輸入

未格式化的輸入

這是輸入字元或整行的更強大的方式,而不是鍵盤輸入,但是這將留給稍後的檔I / O課程。

鍵盤輸入

所有的輸入,使用cin需要輸入或返回鍵被按下。標準C ++不提供直接從鍵盤讀取字元的方法。在未來的課程中,我們將看到如何用協力廠商庫來做到這一點。

這結束了課程。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示