C_C++控制臺界面編程_第1頁
C_C++控制臺界面編程_第2頁
C_C++控制臺界面編程_第3頁
C_C++控制臺界面編程_第4頁
C_C++控制臺界面編程_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 /53C/C+控制臺界面編程序資料中一部分來自互聯(lián)網(wǎng),作者已無法考證,另一部分來自MSDN,其余部分為本人()自己編寫并重新整理、修改、增加和補(bǔ)充一些內(nèi)容,使之更充實、完善,所有程序均在VisualStudio2005SP1中調(diào)試通過(操作系統(tǒng)為WindowsXPSP3),原文很多代碼均有語法錯誤,全部作了更正,部分示例代碼的功能也進(jìn)行了增加,有些示例代碼功能稍多,為使示例更有針對性,在保留其知識點(diǎn)的基礎(chǔ)上對代碼進(jìn)行了精簡,最后提供了自己的幾個簡易的程序示例,以饗讀者。每一個學(xué)習(xí)C、C+的人,最先接觸到的就是在控制臺窗I下進(jìn)行編程學(xué)習(xí),它是一個基于文本模式的黑黑的窗口,它不涉及到復(fù)雜的人機(jī)交

2、互編程,是深入學(xué)習(xí)C、C+最直接、簡單的手段。早期的開發(fā)都使用TurboC(簡稱TC)進(jìn)行開發(fā),在TC的庫中提供了大量的用于控制臺界面處理的函數(shù),時至今口,這些涉及到C、C+標(biāo)準(zhǔn)之外的界面控制程序已經(jīng)無法在在VC中編譯通過了,有時候為了學(xué)習(xí)和移植早期的代碼,需要將這些函數(shù)在VC中重新實現(xiàn),本教程提供了這樣的參考。更多的時候,用戶學(xué)習(xí)編程語言最先接觸的是控制臺的界面,通過本教程可以深入了解界面相關(guān)的操作,對于Win32窗II界面的程序來說,基于控制臺窗II的程序也有很多優(yōu)點(diǎn),操作簡單、幾乎不需要書寫與界面相關(guān)的代碼就能編譯并生成可執(zhí)行文件,這樣的程序開發(fā)速度非常快,一些對于界面要求不是很高的小工

3、具用它開發(fā),比花更多的時間去處理窗口程序的界面要劃得來。從Windows2000以后,Windows操作系統(tǒng)中的控制臺已經(jīng)不再是那個古老的,只能在Windows系統(tǒng)劃分的一塊內(nèi)存中模擬運(yùn)行的16位程序了,現(xiàn)在的控制臺窗II是一個與窗II程序有著相同特性的特殊窗II程序,說它特殊是它只能顯示字符,而且是命令行的,但它幾乎支持窗II程序的所有功能,比如多線程、網(wǎng)絡(luò)通信、以及其它的Windows程序開發(fā)用的技術(shù)等,除了涉及到界面的東西以外,它可以完成你想要的所有功能,當(dāng)然Windows的API也可以完全由它來調(diào)用。在眾多C+開發(fā)工具中,由于Microsoft本身的獨(dú)特優(yōu)勢,選用VisualC+已越來

4、越被眾多學(xué)習(xí)者所接受。顯然,現(xiàn)今如果還再把TC作為開發(fā)壞境的話,不僅沒有必要,而且也不利于向Windows應(yīng)用程序開發(fā)的過渡。然而,VisualC+的C+專用庫卻沒有TC所支持的文本屏幕(控制臺窗II)控制函數(shù)(相應(yīng)的頭文件是conio.h)o這必然給C+學(xué)習(xí)者在文本界面設(shè)計和編程上帶來諸多不便。要知道,文本界面設(shè)計是一種深入學(xué)習(xí)C+、掌握交互系統(tǒng)的實現(xiàn)方法的最簡單的一種手段,它不像C+的Windows圖形界面應(yīng)用程序,涉及知識過多。為此,本系列文章討論在VisualStudi。開發(fā)環(huán)境中,如何編寫具有美觀清晰的控制臺窗口界面的C+應(yīng)用程序,并且只介紹輸入、輸出和界面相關(guān)的東西,即只涉及控制臺

5、的人機(jī)交互方面,其它方面本文檔并不涉及。當(dāng)然,控制臺的窗II也有自己的缺點(diǎn),它與窗II界面的程序沒有可比性。教程中所有的示例全部可以用C和C+來實現(xiàn),教程中的示例為便于學(xué)習(xí),盡量采用的是面向過程的C語言的結(jié)構(gòu),部分示例還同時C+的實現(xiàn),關(guān)于這兩種語言的使用,教程中不作過多講解,這里假設(shè)讀者已經(jīng)具備了熟練的C、C+語言功底。對于只學(xué)習(xí)過C語言的讀者,也不影響從本教程中獲取想要的知識,但最后面的幾個示例和小程序,有的用C+實現(xiàn)的,可能會給您帶來不便,見諒,文中如有錯誤和不足之處,希望各位讀者批評、指正。目錄TOC o 1-5 h z HYPERLINK l bookmark0C/C+控制臺界面編程

6、1 HYPERLINK l bookmark2目錄2 HYPERLINK l bookmark4第一部分控制臺界面編程預(yù)備知識3 HYPERLINK l bookmark6VisualStudio2005中控制臺程序的類型3 HYPERLINK l bookmark8簡要復(fù)習(xí)C/C+語言中控制臺字符輸入、輸出3制表符t4回退字符b6ASCII碼表8以開頭的格式控制符11數(shù)據(jù)流的格式設(shè)置12 HYPERLINK l bookmark10怎樣從控制臺復(fù)制粘貼文字13 HYPERLINK l bookmark12將批處理bat轉(zhuǎn)換為exe程序13 HYPERLINK l bookmark14在Vis

7、ualStudio2005中設(shè)置控制臺程序的圖標(biāo)13 HYPERLINK l bookmark16重定向控制臺程序的輸出14 HYPERLINK l bookmark20第二部分控制臺界面編程詳解15概述15 HYPERLINK l bookmark22控制臺文本窗I編程的一般控制步驟16 HYPERLINK l bookmark24控制臺窗口操作函數(shù)16 HYPERLINK l bookmark26文本屬性操作20 HYPERLINK l bookmark32文本輸出22 HYPERLINK l bookmark36文本操作示例23 HYPERLINK l bookmark42滾動和移動28

8、 HYPERLINK l bookmark48光標(biāo)操作30 HYPERLINK l bookmark54讀取鍵盤信息31 HYPERLINK l bookmark78讀取鼠標(biāo)信息38 HYPERLINK l bookmark80結(jié)束語40 HYPERLINK l bookmark82第三部分附錄41分?jǐn)?shù)等級劃分工具41controlio.h文件41Main.c文件44 HYPERLINK l bookmark92簡易俄羅斯方塊46代碼Main.c文件47 HYPERLINK l bookmark120模擬實現(xiàn)可用鼠標(biāo)、鍵盤控制的菜單和窗I51第一部分控制臺界面編程預(yù)備知識1)VisualStu

9、dio2005中控制臺程序的類型在VS2005中控制臺可以支持MFC、ATL,這些內(nèi)容在本教程中用不到,不用支持,所以學(xué)習(xí)本教程的時候使用空的工程就行了讀者在練習(xí)的時候,使用空的工程類型即可,如果向?qū)闪薽ain()主函數(shù),那么代碼可能如下:(讀者最好能知道怎樣通過它創(chuàng)建一個工程,并且知道怎樣設(shè)置這個工程的字符編碼方式,在VisualC+6.0默認(rèn)的字符集為多字節(jié)的,VS2005中默認(rèn)為人字符集,為考慮移植,代碼人多數(shù)使用通用字符集來實現(xiàn)。)intargcf_TCHAR*argv)return0;為便于讀者理解,作以下解釋:C、C+中main主函數(shù)可能接收字符數(shù)組作為參數(shù),由于VS2005支

10、持不同的字符集,所以C+標(biāo)準(zhǔn)中對所有字符處理的函數(shù)都提供了兩個版本,一個為普通的接收多字節(jié)型的版本,即char型,另一個為接收大字符集的版本,一般要普通版本的函數(shù)前有前綴w”,且對名稱作了細(xì)微的更改,如果需要這方面的信息可以在MSDN中查詢,微軟對字符處理的所有函數(shù)除了提供標(biāo)準(zhǔn)中的兩個版本,至少還提供了一個通用版,可同時用于兩種字符集(一般由_t”開頭,且利用編譯器的DEBUG宏來實現(xiàn)的,且不屬于標(biāo)準(zhǔn)中的要求,對移植性有要求時甚用),使用大字符集編碼越來越重要,讀者應(yīng)在學(xué)習(xí)C+的時候就應(yīng)該適當(dāng)接觸這些內(nèi)容,本教程中使用通用的字符處理函數(shù),但會在必要的時候把對應(yīng)的其它兩個版本的函數(shù)注釋出來。如果

11、讀者不習(xí)慣于這種編程方式,請自己更改調(diào)用的字符處理函數(shù),并設(shè)置VisualStudio2005的工程屬性為使用多字節(jié)字符集上面代碼中的_TCHAR是一個宏(常簡寫為TCHAR),當(dāng)字符集為多字節(jié)時為char,當(dāng)為人字符集時為wchar_t,類似的解釋以后不再作解釋,讀者自行查閱MSDN即可。2)簡要復(fù)習(xí)C/C+語言中控制臺字符輸入、輸出C語言中的輸出使用printf()實現(xiàn),使用它,需要包含stdio.h頭文件,而C+則除了使用兼容C的這種格式,還可以使用iostream輸入輸出流來實現(xiàn)。使用控制臺輸出,對于字符格式有精確的要求,所以學(xué)C語言的讀者務(wù)必要牢牢掌握printf()中的格式控制符,

12、學(xué)習(xí)C+的則需要掌握流的成員函數(shù)和輸出流的格式控制符,并包含iostream頭文件并引入命名空間std(或所用到的成員)。學(xué)習(xí)C語言的讀者,還應(yīng)該掌握C語言中的其它輸入、輸出函數(shù)(如putchar,getchar;getch,puts,gets等),學(xué)習(xí)C+中的讀者則還需要掌握字符串流以及緩沖區(qū)的刷新等操作(如endl,flush等),以便更好的掌握人機(jī)交互行為。(注意輸入、輸出流的控制符在頭文件iomanip中,使用之前需要包含)。除此之外,還需要重點(diǎn)掌握C、C+中的轉(zhuǎn)義字符,特別是b,n,t,八進(jìn)制數(shù)或十六進(jìn)制數(shù)。以上這些知識在一般的C、C+書籍中均有詳細(xì)介紹,這里不再贅述,如果掌握不扎實

13、,是不可能隨心所欲的操作控制臺的輸入輸出的,但更多的時候是學(xué)會舉一反三,遷移運(yùn)用,下面就轉(zhuǎn)義字符中的b和t進(jìn)行一些詳細(xì)講解,很多人對于這兩個字符根本就沒有理解透徹。a)制表符t默認(rèn)的控制臺共可以顯示80*25個文字,每一行共80個字符,共25列,除去最后一行可能因為切換中文輸入法需要,至少可以有24行文字空間可以操作(注:在控制臺程序中,切換輸入只能用Ctrl4-空格來實現(xiàn),如果對于界面要求非常嚴(yán)格,不允許出現(xiàn)滾動條和任何一丁點(diǎn)破壞界面的操作,那么請記住把最后一行空間留給操作系統(tǒng)的輸入法吧,否則你完全無法釋懷心里的痛)當(dāng)然控制臺是可以使用一些手段來使它的界面顯示文字行數(shù)增大的,最多增加到多少行

14、,受計算機(jī)屏幕大小決定(后面內(nèi)容會講解)每兩個制表符在控制臺窗I中占據(jù)8個字符的寬度。這樣,一個標(biāo)準(zhǔn)的控制臺窗I】就會被分成10*25塊單元,每一個單元對應(yīng)一個制表位,而t的作用是從當(dāng)前光標(biāo)所在的位置跳到所在行最近的一個制表位開始的地方,因此,使用t所跳過的字符寬度并不是固定的,而是介于0“8個字符之間,這主要是看下一個制表位距離當(dāng)前光標(biāo)有多遠(yuǎn),制表位用于多行文字在列上對齊是非常方便的,但其完美的程序取決于程序書寫者對它的控制。典型的例子是輸出9*9乘法表:1*1=12*1=22*2=43*1=33*2=63*3=94*1=44*2=84*3=124*4=165*1=55*2=105*3=15

15、5*4=205*5=256*1=66*2=126*3=186*4=246*5=306*6=367*1=77*2=147*3=217*4=287*5=357*6=427*7=498*1=88*2=168*3=248*4=328*5=408*6=488*?=568*8=649*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81請按任意鍵繼續(xù)#includestdafx.h”irrt_tmain(irrtargcr_TCHAR*argv)for(in七i=丄;i=9;+i)for(intj=1;j=i;+j)_tprin(_T(%d*d=3dt)#

16、iFj,i*j);_tprintf(MnH);_tsystem(_T(pause11);return0;以上是通用字符集下的代碼(即可用于兩種字符集版本的代碼)如果是多字節(jié)字符集可以如下書寫:#inc丄udestdafx.h”#include/多了一個頭文件包含irrtmain(in七argcfchar*argv)for(in七i=丄;i=9;+i)for(intj=1;j=i;+j)printf(,%d*%d=%dt/izjzi*j);prin七f(n”);system(pause);/注總需要包會頭文件stdlib.h或cstdiib(C+1!1)return0;如果是大字符集下可以這樣寫

17、:#include“stdafxh”irrtmain(in七argc,wchar_t*argv)for(in七i=丄;i=9;+i)for(in七j=1;j=i;+j)wprintf(LM%d*,%d=%dt,fizj,i*j);wprintf(Lnn,f);_wsystem(LHpause,f);return0;說明:#includeHstdafx.h11是用向?qū)傻拇a,它相當(dāng)于包含了兩個頭文件(其實還有一些其它的東西):#include#include代碼中的L表示將字符或字符串轉(zhuǎn)換成人字符集編碼,如果不使用表示為多字節(jié)編碼,使用表示根據(jù)當(dāng)前工程屬性的需要,要么與L的含義一樣,要么相當(dāng)

18、于不使用,即為通用版本,也可以寫成_TEXT,它只是一個宏,在使用的時候,需要將要處理的字符串用扌舌號括起來,但L在使用時則可以不用括號。printf用于多字節(jié)字符集環(huán)境中,wprintf用于大字符集環(huán)境中,.tprintf則可以根據(jù)工程屬性自動選擇表示printf還是wprintf,即為通用函數(shù),其它的函數(shù)也一樣,還有三個字符串的數(shù)據(jù)類型也是一樣的含義,即char,wchar_t,TCHAR,其中TCHAR為通用版本。system在頭文件stdlib.h頭文件中,其它兩個版本則不用包含這個頭文件,這個函數(shù)的功能是執(zhí)行系統(tǒng)命令的,它能使用的系統(tǒng)命令在不同的電腦中不相同,如果需要查看,可以在命令

19、行窗II中輸入help即可,但只列舉系統(tǒng)提供的,這里給出兩個,一個是system(pause)用于暫停執(zhí)行,并顯示一行文字“按任意皺鍵繼續(xù)”,另一個是system(“cis”)用于清除窗口中的文字,其實只要是在系統(tǒng)目錄system32卞的可執(zhí)行文件都可用這個命令執(zhí)行,所以用戶也可以將自己需要的程序(為保證兼容性,最好是命令行的程序)拷到對應(yīng)的目錄中,即可利用system執(zhí)行。代碼中:system(pausef/);相當(dāng)于c語言的:printf(、按任總鍵繼續(xù)n);getch();或者是C+的:cout“按任總鍵繼續(xù)”endl;/不需要ngetch();說明:VS2005中g(shù)etch0相當(dāng)于函數(shù)

20、.getch0代碼中使用了制表符對齊,當(dāng)然也可以不用制表符,那樣的話,用戶只能通過計算每一個表達(dá)式的文字長度,并用空格填充不夠的地方,才能對齊,代碼量會很人,邏輯也會變得復(fù)雜,可見合理使用制表符及轉(zhuǎn)義字符可以為輸出帶來方便。程序中使用的是C語言的代碼,典型的C+代碼如下(只提供通用版的代碼):int_tmain(intargcrTCHAR*argv)for(in七i=丄;i=9;+i)for(intj=1;j=i;+j)cou七iv_T(”i)j_T(”=”)i*j_T(”t”)flush;cotrtendl;system(MpauseM);return0;輸出代碼中的flash是刷新緩沖區(qū)的

21、,但不向緩沖區(qū)插入任何字符,endl是在緩沖區(qū)中插入一個回車符,并刷新(注意n并不等同于endl,n是字符,可以用在任何能用字符的地方,表示換行符,而endl不是個字符,只用于流輸出中,表示向流中插入一個n字符并刷新緩沖區(qū))。這只是順便提及一卞,如果不明白,可以復(fù)習(xí)C+基礎(chǔ),個人覺得學(xué)習(xí)C+的讀者非常有必要精深的掌握C語言,這方面?zhèn)€人覺得CPrimer(藍(lán)色的封面)很精典,另譚浩強(qiáng)的C語言程序設(shè)計是輕量級的C語言經(jīng)典教程,C+學(xué)習(xí)開始以復(fù)習(xí)C為基礎(chǔ),推薦C+PrimerPlus(藍(lán)色封面)這本書講法講解很完善,對C+有全面細(xì)致的學(xué)習(xí)后,可以從頭到尾精細(xì)研究C+Primer(紅色封面)這本書是學(xué)

22、習(xí)C+的經(jīng)典之作,但初學(xué)者看起來非常吃力。b)回退字符bb可以讓當(dāng)前光標(biāo)向后回退一個字符,下一次輸出的時候,就會從當(dāng)前位置輸出,如果回退到的地方有文字,那么將會被覆蓋(屏幕上會覆蓋,如呆是在打印機(jī)上輸出則前后兩次輸出會重疊在一起),這個字符有著非常重要的作用,在教程的后面會講述到一個API函數(shù),可以讓光標(biāo)跳轉(zhuǎn)到任意位置,也可以完成b的功能,此處暫不作講述。b典型的用途是控制輸入,控制臺的輸入一般不受用戶掌控,很容易因為輸入過多的字符而導(dǎo)致界面被破壞,當(dāng)對界面格式要求很嚴(yán)格的時候,不能使用普通的輸入函數(shù),除了使用系統(tǒng)檢測鍵盤按鍵的API以外,C、C+都可以使用getch0函數(shù),這個函數(shù)與getc

23、harO作用一樣,接收一個字符,但getchO不回顯到屏幕上,而且不使用緩沖區(qū)緩存多余字符,保證了用戶按下任意一個按鍵就一定結(jié)束這個函數(shù)的調(diào)用,但getchar0則需要到按了回車或強(qiáng)制刷新緩沖區(qū)才行。所以利用這個函數(shù)結(jié)合b就能完成很多功能,比如刪除一個字符等。這里為了更好的說明這個問題,給用戶提供了一個小程序,用于輸入很多個學(xué)生的成績,最后對成績進(jìn)行分?jǐn)?shù)等級劃分,這個程序使用了其它的一些界面編程技術(shù),這里不對其講解,用戶只需要閱讀控制輸入數(shù)值的代碼,并結(jié)合界面進(jìn)行觀察就能理解了,具體代碼見附錄中的源代碼分?jǐn)?shù)劃分工具,這里僅摘抄輸入一個0-100之間的分?jǐn)?shù)的代碼,用到了b而且可以使用Backsp

24、ace來刪除輸入錯誤的數(shù)字。代碼如下:/在控制臺程序下輸入一個整數(shù)/tag=l有下劃線,無下劃線/return-丄表示取消輸入/return-2,-3表示參數(shù)不正確/return-5表示進(jìn)行統(tǒng)計/return-4表示運(yùn)行出錯/n表示待輸入數(shù)據(jù)的最大位數(shù)/附:這是早期初學(xué)時寫的代碼格式.結(jié)構(gòu)均很糟糕,用戶根據(jù)I勺己的經(jīng)驗進(jìn)行改寫,特別/是返回值,使用枚舉更合理;錯誤處理使用斷言更合理,程序結(jié)構(gòu)應(yīng)再進(jìn)行模塊化,使邏輯/更清楚;變雖名命名毫無意義;代碼風(fēng)格和格式比較雜亂等。此處不再進(jìn)行舊代碼的更改,n/接貼在文檔中,只求能說清楚問題即可。/如果移植到VS2005中請注意代碼的字符集為多字節(jié),讀者也可

25、以將其改寫為大字符集,即通/用字符集intGetlnteger(intnrinttag)intkn=0rs=0fi;charc;if(n=10)ptin七f(”n無法輸入規(guī)定的數(shù)據(jù)!n“);return-2;if(1(tag=l|tag=0)printf(rrn函數(shù)參數(shù)不合法!nrr);return-3;if(tag=l)for(i=0;in;i+)prin七f;for(i=0;i=0&s0)if(tag=0)printfCbb);/這里用到了belseprintfCb_b);/這里用到了bif(kn=0)kn=0;elsekn-;s=s/10;if(c=*0&knn)prin七fs=s*10

26、+c-,0f;kn+;while(1);printf(,rnfS序出現(xiàn)未知錯課!nf);return-4;c)ASCII碼表為方便編程時查閱一些常用的字符,這里附上一張ASCII碼表。BinDecHex縮寫/字符解釋000NUL(null)空字符111SOH(startofheadling)標(biāo)題開始1022STX(startoftext)正文開始1133ETX(endoftext)正文結(jié)束10044EOT(endoftransmission)傳輸結(jié)束10155ENQ(enquiry)請求11066ACK(acknowledge)收到通知11177BEL(bell)響鈴100088BS(back

27、space)退格100199HT(horizontaltab)水平制表符1010100ALF(NLlinefeed,newline)換行鍵101111OBVT(verticaltab)垂直制表符110012OCFF(NPformfeed,newpage)換頁鍵1101130DCR(carriagereturn)回車鍵1110140ESO(shiftout)不用切換111115OFSI(shiftin)啟用切換100001610DLE(datalinkescape)數(shù)據(jù)鏈路轉(zhuǎn)義100011711DC1(devicecontrol1)設(shè)備控制1100101812DC2(devicecontrol2

28、)設(shè)備控制2100111913DC3(devicecontrol3)設(shè)備控制3101002014DC4(devicecontrol4)設(shè)備控制4101012115NAK(negativeacknowledge)拒絕接收101102216SYN(synchronousidle)同步空閑101112317ETB(endoftrans,block)傳輸塊結(jié)束110002418CAN(cancel)取消110012519EM(endofmedium)介質(zhì)中斷11010261ASUB(substitute)替補(bǔ)11011271BESC(escape)溢出11100281CFS(fileseparator

29、)文件分割符11101291DGS(groupseparator)分組符11110301ERS(recordseparator)記錄分離符11111311FUS(unitseparator)單元分隔符1000003220(space)空格1000013321!1000103422II1000113523#1001003624$1001013725%1001103826&100111392711010004028(1010014129)101010422A*101011432B+101100442C1101101452D-101110462E-101111472F/110000483001100

30、01493111100105032211001151333110100523441101015335511011054366110111553771110005638811100157399111010583A111011593B1111100603C111111633F?1000000644010000016541A10000106642B10000116743C10001006844D10001016945E10001107046F10001117147G10010007248H1001001734911001010744AJ1001011754BK1001100764CL10011017

31、74DM1001110784EN /531001111794F010100008050P10100018151Q10100108252R10100118353S10101008454T10101018555U10101108656V10101118757W10110008858X10110018959Y1011010905AZ1011011915B1011100925C1011101935D1011110945EA1011111955F11000009660%11000019761a11000109862b11000119963c110010010064d110010110165e110011

32、010266f110011110367g110100010468h110100110569i11010101066Aj11010111076Bk11011001086CI11011011096Dm11011101106En11011111116F0111000011270P111000111371q111001011472r111001111573s111010011674t111010111775u111011011876V111011111977w111100012078X111100112179y /5311110101227Az11110111237B11111001247CI1111

33、1011257D11111101267E11111111277FDEL(delete)刪除d)以%開頭的格式控制符C語言中控制臺的輸出最常用的是printfO,這個函數(shù)有兩種用法,一種用法是直接輸出字符串,如:printf(Teststring);另一種用法是使用格式控制符,如:printf(nTestNUM:%dnTeststring:%sn,10zSTRING輸出最小寬度:用十進(jìn)制整數(shù)來表示輸出的最少位數(shù)。若實際位數(shù)多于定義的寬度,則按實際位數(shù)輸出,若實際位數(shù)少于定義的寬度則補(bǔ)以空格或0。精度:精度格式符以開頭,后跟十進(jìn)制整數(shù)。本項的意義是:如果輸出數(shù)字,則表示小數(shù)的位數(shù):如果輸出的是字符

34、,則表示輸出字符的個數(shù):若實際位數(shù)人于所定義的精度數(shù),則截去超過的部分。長度:長度格式符為h兩種,h表示按短整型量輸出,I表示按長整型量輸出。示例:#includevoidmain();第二種用法中第一個參數(shù)為一個字符串,以其以開頭后接特定含義的字符(一般為一個,少數(shù)情況下會有多個)表示格式說明,這是C語言中的內(nèi)容,讀者可參考相應(yīng)書籍,格式控制符既可用于輸出也可用于輸入,輸入時使用scanf()函數(shù),在此不再細(xì)講,僅列舉常見的格式說明符。類型:類型字符用以表示輸出數(shù)據(jù)的類型,其格式符和意義如下表所示:格式字符意義d以十進(jìn)制形式輸出帶符號整數(shù)(正數(shù)不輸出符號)0以八進(jìn)制形式輸出無符號整數(shù)(不輸出

35、前綴0)x,X以十六進(jìn)制形式輸出無符號整數(shù)(不輸出前綴Ox)u以十進(jìn)制形式輸出無符號整數(shù)f以小數(shù)形式輸出單、雙精度實數(shù)e,E以指數(shù)形式輸出單、雙精度實數(shù)&G以%f%e中較短的輸出寬度輸出單、雙精度實數(shù)c輸出單個字符s輸出字符串標(biāo)志:標(biāo)志字符為-、+、#、空格四種,其意義下表所示:標(biāo)志意義-結(jié)果左對齊,右邊填空格+輸出符號(正號或負(fù)號)空格輸出值為正時冠以空格,為負(fù)時冠以負(fù)號#對c,s,d,u類無影響:對o類,在輸出時加前綴0:對x類,在輸出時加前綴Ox;對ef類當(dāng)結(jié)果有小數(shù)時才給出小數(shù)點(diǎn)inta=floatb=doublec=chard=15;丄231234567;12345678丄2345G

36、7;*pf;prin七=prin七f(”b=prin七f(”c=prin七f(”d=%5dz%or%xnn,a,ara);%lf,54J.f,gen”,b,bzb,b);84丄fn”,c,czc);%8cnH/dzd);數(shù)據(jù)流的格式設(shè)置C+也可以兼容并使用C語言中的控制符進(jìn)行輸出,但更好的方法是使用C+的數(shù)據(jù)流進(jìn)行輸出,主要使用的是cin和cout,讀者可參考標(biāo)準(zhǔn)C+的語法書籍,這里僅列舉一些對流格式進(jìn)行控制的方法和函數(shù):控制符作用dec設(shè)置整數(shù)為十進(jìn)制hex設(shè)置整數(shù)為八進(jìn)制oct設(shè)置整數(shù)為十六進(jìn)制setbase(n)設(shè)置整數(shù)為n進(jìn)制(”8,10,16)setfill(n)設(shè)置字符填充,c可以

37、是字符常或字符變量setprecision(n)設(shè)置浮點(diǎn)數(shù)的效數(shù)字為setw(n)設(shè)置字段寬度為n位setiosflags(ios:fixed)設(shè)置浮點(diǎn)數(shù)以固定的小數(shù)位數(shù)顯示setiosflags(ios:scientific)設(shè)置浮點(diǎn)數(shù)以科學(xué)計數(shù)法表示setiosflags(ios:left)輸出左對齊setiosflags(ios:right)輸出右對齊setiosflags(ios:skipws)忽略前導(dǎo)空格setiosflags(ios:uppercase)在以科學(xué)計數(shù)法輸出E與十六進(jìn)制輸出X以大寫輸出,否則小寫setiosflags(ios:showpos)輸出正數(shù)時顯示“+“號re

38、setiosflags()終止已經(jīng)設(shè)置的輸出格式狀態(tài),在括號中應(yīng)指定內(nèi)容【注】如果使用到以上控制符,除了包禽iostream頭外,還要包禽iomanip頭文件并引入std命名空間。示例:#includeiostream#includeiomanip/輸入輸出流控制符需包含iomanip頭文件usingnamespacestd;voidmain()/dec:返回數(shù)值的十進(jìn)制,oct:返回數(shù)值的八進(jìn)制,hex:返回數(shù)值的十六進(jìn)制cout12345G的十進(jìn)制:”dec123456”,八進(jìn)制為:”oct123456”,十六進(jìn)制為:”hex123456endl;coutdec;/恢復(fù)為十進(jìn)制格式/set

39、fill(c):設(shè)世字符填充,c可以是字符?;蜃址冸m,只對當(dāng)前語句生效/setw(n):設(shè)置字段寬度為n位,如果n小于所要返回的字符寬度則保留字符原樣輸出,且只對當(dāng)前語句生效/setiosflags(ios:left):左寸齊,setiosflags(ios:righ七):右對齊coutsetfill(*f)setw(10)setiosflags(ios:left)123456endl;coutresetiosflags(ios:left);/終止已設(shè)置的輸入輸出流格式,木例去掉左對齊方式doubled=丄2345678901234567;coutdendl;/耒設(shè)置椿度之前默認(rèn)格式輸出椿度

40、為位小數(shù)coutsetprecision(16)dendl;/設(shè)置浮點(diǎn)數(shù)的緖度,n為有效數(shù)字,采用四則五入法舍位,setprecision(n)中,n小于等于有效coutdendl;/之前使用Tsetprecision(),此函數(shù)保留前面的寬度設(shè)置。coutresetiosflags(ios:fixed);/setiosflags(ios:fixed):取消的小數(shù)位數(shù)“勺設(shè)買,恢復(fù)默認(rèn)設(shè)置/setiosflags(ios:scietific):用科學(xué)計數(shù)法表示,為指定小數(shù)位分為四位,且第四位四舍五入/setiosflags(ios:uppercase):在以科學(xué)計數(shù)法輸出E與十六進(jìn)制輸出X以大

41、寫輸出,否則小寫coutsetiosflags(ios:scientific)setiosflags(ios:uppercase)setprecision(4)dendl;怎樣從控制臺復(fù)制粘貼文字本教程除了講解界面相關(guān)的編程以外,還對一些控制臺用的重要操作進(jìn)行說明,以便讀者能更好的在控制臺界面下工作。要復(fù)制粘貼命令行窗11中的文字,可以點(diǎn)擊鼠標(biāo)右鍵,選擇標(biāo)記,并用鼠標(biāo)拖動標(biāo)記一片區(qū)域并點(diǎn)擊右鍵即可完成復(fù)制操作。粘貼則點(diǎn)擊鼠標(biāo)右鍵選擇粘貼即可。將批處理bat轉(zhuǎn)換為exe程序前面講解過system,這個函數(shù)除了執(zhí)行命令行功能和system32下的程序以外,最重要的一個作用是可以利用它來把批處理文件

42、中的命令逐一的轉(zhuǎn)換為system()的調(diào)用,并編譯生成可執(zhí)行文件,這樣的兼容性是最好的,而且還能加入其它的一些程序功能,顯著增強(qiáng)程序的功能,網(wǎng)絡(luò)上也有很多將批處理轉(zhuǎn)換為EXE的工具,但一般都存在兼容性問題,且難以更改或擴(kuò)展生成文件的功能。在VisualStudio2005中設(shè)置控制臺程序的圖標(biāo)Windows卜的程序一般都有一個程序的圖標(biāo),控制臺也可以拋棄原始的應(yīng)用程序默認(rèn)圖標(biāo),讓自己的程序編譯后有個性化的程序圖標(biāo),具體操作如下:在VS2005中打開“資源視圖窗I”(ResourceView)導(dǎo)入添加一個ic。的圖標(biāo)文件(圖標(biāo)可以利用VS自帶的圖標(biāo)工具來新建,也可以利用專業(yè)的IconWorksh

43、op等工具來制作,但VS自帶的圖標(biāo)工具僅支持256色,表現(xiàn)力太差,關(guān)于ic。圖標(biāo)的一些制作常識可以慢慢摸索,本教程不作過多講解),查看屬性窗Ih保證圖標(biāo)的ID標(biāo)識在所有圖標(biāo)中是最小的,這樣編譯器會把最小標(biāo)識的那個圖標(biāo)當(dāng)作應(yīng)用程序的圖標(biāo)。默認(rèn)情況卞VC+6.0并沒有生成文件,也就不會出現(xiàn)在資源視圖窗II中,這時只需創(chuàng)建.rc資源文件即可看到,VS2005中用向?qū)t生成這個文件,如果生成的時候選擇的是空的工程,也可以采用相同方法添加。6)重定向控制臺程序的輸出對于控制臺的應(yīng)用程序,可以從命令提示符中輸入所在路徑及文件名來啟動,默認(rèn)情況下,控制臺程序啟動后,輸出設(shè)備為顯示器,如果重定向輸出為文件,程

44、序執(zhí)行期間的所有輸出將輸出到文件,不會在屏幕上顯示任何字符,就算需要用戶輸入一些字符以繼續(xù)執(zhí)行的程序也不會有任何顯示。重定向輸出在Windows系統(tǒng)中使用主要用在兩個方面,一是沒有源代碼的命令行程序只提供輸出到屏幕的功能,沒有保存結(jié)果到文件的功能,如果需要把計算的結(jié)果輸出到文件,則可利用輸出重定向?qū)崿F(xiàn),這樣不用對程序進(jìn)行任何更改即可將原本輸出到屏幕的計算結(jié)果輸出到文件;二是控制臺程序在開發(fā)的時候,只是顯示在屏幕上,但由于開的程序時就只把它作為一個小工具,臨時用一下,就沒有必要為它提供輸入到文件的功能,這樣可以不用寫這些功能代碼,更用不到去測試它,從而減少許多的開發(fā)測試時間,所以這個時候也可以借

45、助重寫向技術(shù)來讓程序間接的支持輸出到文件的功能。重定向的使用方法為:在命令行中輸入命令后,再輸入一個空格,后接兩個人于號,并跟上一個文件名,這樣即可實現(xiàn),如在命令提示符窗口中輸入命令并按回車:pausec:test,txt即可在C:test.txt中看到輸出的文件中有程序執(zhí)行的內(nèi)容,這里的路徑也可以使用相對路徑,相對路徑的起始節(jié)點(diǎn)在命令行中所需執(zhí)行的程序所在的目錄。一味的使用重定向功能可能是個麻煩,如果命令行程序的用戶交互過程較多,那么,所有的輸入、輸出都只能摸黑操作,非常不便,所以,如有可能在程序中提供將輸出結(jié)果保存到文件的功能,會更方便一些。 /53第二部分控制臺界面編程詳解文本界面的控制

46、臺應(yīng)用程序開發(fā)是深入學(xué)習(xí)C+、掌握交互系統(tǒng)的實現(xiàn)方法的最簡單的一種手段。然而,VisualC+的C+專用庫卻沒有TC所支持的文本(字符)屏幕控制函數(shù),為此本系列文章從一般控制步驟、控制臺窗II操作、文本(字符)控制、滾動和移動、光標(biāo)、鍵盤和鼠標(biāo)等幾個方面討論控制臺窗II界面的編程控制方法。在眾多C+開發(fā)工具中,由于Microsoft本身的獨(dú)特優(yōu)勢,選用VisualC+已越來越被眾多學(xué)習(xí)者所接受。顯然,現(xiàn)今如果還再把TC作為開發(fā)環(huán)境的話,不僅沒有必要,而且也不利于向Windows應(yīng)用程序開發(fā)的過渡。然而,VisualC+的C+專用庫卻沒有TC所支持的文本屏幕(控制臺窗II)控制函數(shù)(相應(yīng)的頭文件

47、是conio.h)。這必然給C+學(xué)習(xí)者在文本界面設(shè)計和編程上帶來諸多不便。要知道,文本界面設(shè)計是一種深入學(xué)習(xí)C+、掌握交互系統(tǒng)的實現(xiàn)方法的最簡單的一種手段,它不像C+的Windows圖形界面應(yīng)用程序,涉及知識過多。為此,本系列文章來討論在VisualC+開發(fā)壞境中,如何編寫具有美觀清晰的控制臺窗II界面的C+應(yīng)用程序。1)概述所謂控制臺應(yīng)用程序,就是指那些需要與傳統(tǒng)DOS操作系統(tǒng)保持某種程序的兼容,同時又不需要為用戶提供完善界面的程序。簡單地講,就是指在Windows壞境下運(yùn)行的DOS程序。一旦C+控制臺應(yīng)用程序在Windows9x/NT/2000操作系統(tǒng)中運(yùn)行后,就會彈出一個窗II。例如新建

48、一個空的工程,添加一個cpp源程序文件,在文檔窗門中輸入下列代碼,并編譯執(zhí)行(在VS2005中此處設(shè)置為多字節(jié)字符集):#includeusingnamespacestd;voidmain()cout,rHello,Console1endl;程序運(yùn)行后,彈出下圖的窗II。注意:有很多初學(xué)C、C+的讀者,喜歡使用快捷鍵,我個人比較喜歡將VS2005的鍵盤快捷鍵設(shè)置為VC6的,這里也以VC6的快捷鍵作說明。使用F5是運(yùn)行程序,這個程序運(yùn)行后馬上就結(jié)束了,用戶來不及查看窗II輸出,如果要看到窗II輸出有兩個辦法,一是使用CE+F5,二是在main()函數(shù)結(jié)束的人括號之前添加條語句:systme(“p

49、ause),并用F5執(zhí)行,使用F5與生成的應(yīng)用程序的方式一樣,所以推薦后一種方法,兩種方法執(zhí)行的操作是不太一樣的,讀者自己查看相應(yīng)的快捷鍵對應(yīng)的功能即可知曉,此處不再贅述。圖片中的窗口就是控制臺窗口,與傳統(tǒng)的DOS屏幕窗口相比最主要的區(qū)別有:(1)默認(rèn)的控制臺窗II有系統(tǒng)菜單和標(biāo)題,它是一個內(nèi)存緩沖區(qū)窗II,緩沖區(qū)大小取決于Windows操作系統(tǒng)的分配;而DOS屏幕是一種物理窗I丨,不具有Windows窗II特性,其人小取決于ROMBIOS分配的內(nèi)存空間。(2)控制臺窗II的文本操作是調(diào)用低層的Win32API,而DOS屏幕的文本操作是通過調(diào)用BIOS的26(10h)中斷而實現(xiàn)的。(3)默認(rèn)的

50、控制臺窗II可以接收鍵盤和鼠標(biāo)的輸入信息,設(shè)備驅(qū)動由Windows管理,而DOS屏幕窗II接收鼠標(biāo)時需要調(diào)用33h中斷,且鼠標(biāo)設(shè)備驅(qū)動程序由自己安裝。2)控制臺文本窗口編程的一般控制步驟除了使用第一部分介紹的控制臺界面控制的相關(guān)方法以外,用得最多的是調(diào)用系統(tǒng)的控制臺API來對其進(jìn)行操作,要調(diào)用這些API,需要提供控制臺窗II的句柄(句柄用于Windows程序中標(biāo)識窗II等資源對的,關(guān)于它的詳細(xì)概念讀者自行了解,對于這些編程知識,不再本教程的講解范闈之內(nèi),在此僅提及一卞),才能利用這個句柄對它進(jìn)行各種操作,控制臺窗口界面的一般編程控制步驟如下:第一步:調(diào)用GetStdHandle獲取當(dāng)前的標(biāo)準(zhǔn)輸

51、入(STDIN)和標(biāo)準(zhǔn)輸出(STDOUT)設(shè)備句柄。函數(shù)原型為:HANDLEGetStdHandle(DWORDnStdHandle);其中,nStdHandle可以是STDNPUT_HANDLE(標(biāo)準(zhǔn)輸入設(shè)備句柄)、STD_OUTPUT_HANDLE(標(biāo)準(zhǔn)輸出設(shè)備句柄)和STD_ERROR_HANDLE(標(biāo)準(zhǔn)錯誤句柄)。需要說明的是,句柄是Windows最常用的概念。它通常用來標(biāo)識Windows資源(如菜單、圖標(biāo)、窗II等)和設(shè)備等對彖。雖然可以把句柄理解為是一個指針變量類型,但它不是對彖所在的地址指針,而是作為Windows系統(tǒng)內(nèi)部表的索引值來使用的。第二步:調(diào)用相關(guān)文本界面控制的API函

52、數(shù)。這些函數(shù)可分為三類。一是用于控制臺窗II操作的函數(shù)(包括窗II的緩沖區(qū)大小、窗II前景字符和背景顏色、窗II標(biāo)題、人小和位置等);二是用于控制臺輸入輸出的函數(shù)(包括字符屬性操作函數(shù));其他的函數(shù)并為最后一類。第三步:調(diào)用CloseHandle()來關(guān)閉輸入輸出句柄。注意,這些函數(shù)都是Windows的API函數(shù),所以在使用之前還必須包含頭文件Windows.ho在使用系統(tǒng)所提供的API過程中還需要了解和認(rèn)識一些Windows.h中定義的數(shù)據(jù)結(jié)構(gòu),用到的時候會逐一講解。還需要說明的是,雖然在C+中,iostream.h定義了cin和cout的標(biāo)準(zhǔn)輸入和輸出流對彖,以及一些精細(xì)控制輸入、輸出的標(biāo)

53、記,在C中提供了格式控制符,但它們只能實現(xiàn)基本的輸入輸出操作,最多能控制文字的位置、數(shù)目,對于控制臺窗II文字界面顏色和其它非文字性質(zhì)的控制卻無能為力,而且C+中的流操作不能與stdio.h和conio.h友好相處,因為iostream.h和它們是C+兩套不同的輸入輸出操作方式,使用時要特別注意,不要在代碼中混用操作相同的對彖,或者在一個工程中只用一種方案。3)控制臺窗口操作函數(shù)用于控制臺窗口操作的常用API函數(shù)如下:GetConsoleScreenBufferInfo獲取控制臺窗II信息GetConsoleTitle獲取控制臺窗II標(biāo)題ScrollConsoleScreenBuffer在緩沖

54、區(qū)中移動數(shù)據(jù)塊SetConsoleScreenBufferSize更改指定緩沖區(qū)大小SetConsoleTitle設(shè)置控制臺窗II標(biāo)題SetConsoleWindov/Info設(shè)置控制臺窗II信息(包括窗口大小、位置等)完整的VS2005中能用的控制臺函數(shù)列舉如卞(絕人多數(shù)在VC6中也能用),以便讀者查閱使用,還有一部分這里的常用函數(shù)沒有列舉出來的,后面用到也會進(jìn)行講解,讀者如有不懂的地方,可自己查閱MSDN,這里需要提醒的一點(diǎn)是有些函數(shù)在VS2005中可以原型和參數(shù)類型發(fā)生了一些微小的變化,在VC6中可以需要適當(dāng)更改才能正常使用,對于掌握了C+語法的讀者會很輕松就能完成:Function(函

55、數(shù)Description(描述)AddConsoleAliasDefinesaconsolealiasforthespecifiedexecutable.AllocConsoleAllocatesanewconsoleforthecallingprocessAttachConsoleAttachesthecallingprocesstotheconsoleofthespecifiedprocess.CreateConsoleScreenBufferCreatesaconsolescreenbufferFillConsoleOutputAttributeSetsthetextandbackgro

56、undcolorattributesforaspecHiednumberofcharactercellsFillConsoleOutputCharacterWritesacharactertotheconsolescreenbufferaspecifiednumberoftimes.FlushConsolelnputBufferFlushestheconsoleinputbuffer.FreeConsoleDetachesthecallingprocessfromitsconsoleGenerateConsoleCtrlEventSendsaspecifiedsignaltoaconsolep

57、rocessgroupthatsharestheconsoleassociatedwiththecallingprocess.GetConsoleAliasRetrievesthespecifiedaliasforthespecifiedexecutableGetConsoleAliasesRetrievesalldefinedconsolealiasesforthespecifiedexecutableGetConsoleAliasesLengthReturnsthesize,inbytes,ofthebufferneededtostorealloftheconsolealiasesfort

58、hespecifiedexecutableGetConsoleAliasExesRetrievesthenamesofallexecutableswithconsolealiasesdefinedGetConsoleAliasExesLengthReturnsthesize,inbytes,ofthebufferneededtostorethenamesofallexecutablesthathaveconsolealiasesdefinedGetConsoleCPRetrievestheinputcodepageusedbytheconsoleassociatedwiththecalling

59、processGetConsoleCursorlnfoRetrievesinformationaboutthesizeandvisibilityofthecursorforthespecifiedconsolescreenbuffer.GetConsoleDisplayModeRetrievesthedisplaymodeofthecurrentconsoleGetConsoleFontSizeRetrievesthesizeofthefontusedbythespecifiedconsolescreenbufferGetConsoleModeRetrievesthecurrentinputm

60、odeofaconsolesinputbufferorthecurrentoutputmodeofaconsolescreenbuffer.GetConsoleOutputCPRetrievestheoutputcodepageusedbytheconsoleassociatedwiththecallingprocessGetConsoleProcessListRetrievesalistoftheprocessesattachedtothecurrentconsoleGetConsoleScreenBufferlnfoRetrievesinformationaboutthespecified

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論