版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
文件與圖形C語(yǔ)言程序設(shè)計(jì)目錄content文件的基本概念1文件類型指針2文件操作與相關(guān)函數(shù)3文件函數(shù)應(yīng)用綜合舉例4C語(yǔ)言圖形程序設(shè)計(jì)基本概念5C語(yǔ)言中的圖形函數(shù)6圖形方式下的文本常見操作函數(shù)7C語(yǔ)言圖形操作綜合應(yīng)用舉例8文件文件編碼的方式文件緩沖類型文件:指存放在外部介質(zhì)上的一組相關(guān)數(shù)據(jù)的有序集合。9.1文件的基本概念
這個(gè)數(shù)據(jù)集有一個(gè)名稱,叫做文件名。實(shí)際上在前面的各章中我們已經(jīng)多次使用了文件,例如源程序文件、目標(biāo)文件、可執(zhí)行文件、庫(kù)文件(頭文件)等。
文本文件二進(jìn)制文件緩沖型文件非緩沖型文件9.1.1文本文件與二進(jìn)制文件文本文件在磁盤中存放時(shí)每個(gè)字符對(duì)應(yīng)一個(gè)字節(jié),用于存放對(duì)應(yīng)的ASCII碼。例如,數(shù)1357在內(nèi)存中的存儲(chǔ)形式為:在文本文件中的保存形式為:共占用4個(gè)字節(jié)。00000101 01001101ASCII:00110001001100110011010100110111對(duì)應(yīng)的↓↓↓↓ 十進(jìn)制碼:1357文本文件:文本文件可在屏幕上按字符顯示,例如源程序文件就是文本文件,由于是按字符顯示,因此能讀懂文件內(nèi)容。但一般占存儲(chǔ)空間較多,而且要花費(fèi)轉(zhuǎn)換時(shí)間。9.1.1文本文件與二進(jìn)制文件二進(jìn)制文件:二進(jìn)制文件是按二進(jìn)制的編碼方式來(lái)存放文件的。例如,數(shù)1357的存儲(chǔ)形式為:只占二個(gè)字節(jié)。二進(jìn)制形式輸出數(shù)值,可以節(jié)省外存空間和轉(zhuǎn)換時(shí)間,但不便于閱讀。00000101 010011019.1.2緩沖性文件系統(tǒng)
ANSIC語(yǔ)言中把文件的輸入/輸出功能作為標(biāo)準(zhǔn)庫(kù)函數(shù)的一部分,以提高程序的可移植性。各種C語(yǔ)言系統(tǒng)都遵循ANSIC標(biāo)準(zhǔn)定義了一組完整的標(biāo)準(zhǔn)輸入/輸出操作函數(shù),這組標(biāo)準(zhǔn)輸入/輸出操作函數(shù)稱為緩沖性文件系統(tǒng)(BufferedFileSystem)。所謂緩沖性文件系統(tǒng)是指能夠自動(dòng)地在內(nèi)存區(qū)為每個(gè)正在使用的文件名開辟一個(gè)緩沖區(qū)的系統(tǒng)。
1.當(dāng)從磁盤向內(nèi)存讀取數(shù)據(jù)時(shí),首先一次性從磁盤文件中將一批數(shù)據(jù)讀入內(nèi)存,再?gòu)木彌_區(qū)中逐個(gè)將數(shù)據(jù)送到對(duì)應(yīng)的內(nèi)存空間中。
2.從內(nèi)存向磁盤輸出數(shù)據(jù)時(shí),必須首先輸出到緩沖區(qū)中。待緩沖區(qū)裝滿后,再一起輸出到磁盤文件中。
9.2文件類型指針在C語(yǔ)言中用一個(gè)指針變量指向一個(gè)文件,這個(gè)指針稱為文件指針。通過(guò)文件指針就可對(duì)它所指的文件進(jìn)行各種操作。該結(jié)構(gòu)類型由系統(tǒng)定義,取名FILE,并在stdio.h中定義(#include“stdio.h”):typedefstruct{
intlevel;//緩沖區(qū)“滿”或“空”的程度
unsignedflags;//文件狀態(tài)標(biāo)志
charfd;//文件描述符號(hào)
unsignedcharhold;//如無(wú)緩沖區(qū)則不讀取字符串
intbsize;//緩沖區(qū)大小
unsignedchar_FAR*buffer;//數(shù)據(jù)傳輸緩沖區(qū)指針unsignedchar_FAR*curp;//文件緩沖區(qū)位置unsignedistemp;//臨時(shí)文件指示器shorttoken;//用于有效性檢查}FILE;9.2文件類型指針定義說(shuō)明文件指針的一般形式為:其中FILE應(yīng)為大寫,它實(shí)際上是由系統(tǒng)定義的一個(gè)結(jié)構(gòu),該結(jié)構(gòu)中含有文件名、文件狀態(tài)和文件當(dāng)前位置等信息。在編寫源程序時(shí)不必關(guān)心FILE結(jié)構(gòu)的細(xì)節(jié)。FILE*指針變量標(biāo)識(shí)符;FILE*fp;表示fp是指向FILE結(jié)構(gòu)的指針變量,通過(guò)fp即可找存放某個(gè)文件信息的結(jié)構(gòu)變量,然后按結(jié)構(gòu)變量提供的信息找到該文件,實(shí)施對(duì)文件的操作。習(xí)慣上也籠統(tǒng)地把fp稱為指向一個(gè)文件的指針。9.3文件操作與相關(guān)函數(shù)文件處理過(guò)程通常要經(jīng)歷如下三個(gè)步驟:打開文件→文件讀/寫→關(guān)閉文件文件在進(jìn)行讀寫操作之前要先打開,使用完畢要關(guān)閉。所謂打開文件,實(shí)際上是建立文件的各種有關(guān)信息,并使文件指針指向該文件,以便進(jìn)行其它操作。關(guān)閉文件則斷開指針與文件之間的聯(lián)系,也就禁止再對(duì)該文件進(jìn)行操作。
在C語(yǔ)言中,文件操作都是由庫(kù)函數(shù)來(lái)完成的。在本章內(nèi)將介紹主要的文件操作函數(shù)。9.3.1文件的打開(fopen函數(shù)):
fopen函數(shù)用來(lái)打開一個(gè)文件,其函數(shù)原形為:其調(diào)用的一般形式為:其中,“文件指針名”必須是被說(shuō)明為FILE類型的指針變量;“文件名”是被打開文件的文件名,為字符串常量或字符串?dāng)?shù)組;“使用文件方式”是指文件的類型和操作要求。FILE*fopen(constchar*filename,constchar*mode);if((文件指針名=fopen(文件名,使用文件方式))==NULL)9.3.1例9.1文件的打開1FILE*fp;if((fp=("c:\\config.sys","r"))==NULL);其意義是檢查文件指針fp所指向的文件存在否,如果存在,則打開C盤目錄下的config.sys文件,只允許進(jìn)行“讀”操作,并使fp指向該文件。例9.2文件的打開2FILE*fphzk;If((fphzk=("ccbp.dat","rb"))==NULL);其意義是先檢查文件ccbp.dat文件是否存在,如果存在,則打開當(dāng)前目錄下的文件ccbp.dat,這是一個(gè)二進(jìn)制文件,只允許按二進(jìn)制方式進(jìn)行讀操作。文件的打開(fopen函數(shù)):
9.3.1使用文件的方式共有12種,符號(hào)和意義如下:文件使用方式意義“rt”只讀打開一個(gè)文本文件,只允許讀數(shù)據(jù)“wt”只寫打開或建立一個(gè)文本文件,只允許寫數(shù)據(jù)“at”追加打開一個(gè)文本文件,并在文件末尾寫數(shù)據(jù)“rb”只讀打開一個(gè)二進(jìn)制文件,只允許讀數(shù)據(jù)“wb”只寫打開或建立一個(gè)二進(jìn)制文件,只允許寫數(shù)據(jù)“ab”追加打開一個(gè)二進(jìn)制文件,并在文件末尾寫數(shù)據(jù)“rt+”讀寫打開一個(gè)文本文件,允許讀和寫“wt+”讀寫打開或建立一個(gè)文本文件,允許讀寫“at+”讀寫打開一個(gè)文本文件,允許讀,或在文件末追加數(shù)據(jù)“rb+”讀寫打開一個(gè)二進(jìn)制文件,允許讀和寫“wb+”讀寫打開或建立一個(gè)二進(jìn)制文件,允許讀和寫“ab+”讀寫打開一個(gè)二進(jìn)制文件,允許讀,或在文件末追加數(shù)據(jù)文件的打開(fopen函數(shù)):
9.3.1文件的打開(fopen函數(shù)):
1) 文件使用方式由r,w,a,t,b,+六個(gè)字符拼成,各字符的含義是:r(read):讀w(write):寫a(append):追加t(text):文本文件,可省略不寫b(banary):二進(jìn)制文件+:讀和寫2) 凡用“r”打開一個(gè)文件時(shí),該文件必須已經(jīng)存在,且只能從該文件讀出。3)用“w”打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經(jīng)存在,則將該文件刪去,重建一個(gè)新文件。9.3.1文件的打開(fopen函數(shù)):
若要向一個(gè)已存在的文件追加新的信息,只能用“a”方式打開文件。但此時(shí)該文件必須是存在的,否則將會(huì)出錯(cuò)。在打開一個(gè)文件時(shí),如果出錯(cuò),fopen將返回一個(gè)空指針值NULL。在程序中可以用這一信息來(lái)判別是否完成打開文件的工作,并作相應(yīng)的處理。if((fp=fopen("c:\\hzk16","rb")==NULL){printf("\nerroronopenc:\\hzk16file!");getch();exit(1);}例9.3文件打開錯(cuò)誤如果返回的指針為空,表示不能打開C盤根目錄下的hzk16文件,則給出錯(cuò)誤提示信息。敲鍵后執(zhí)行exit(1)退出程序。6) 標(biāo)準(zhǔn)輸入文件(鍵盤),標(biāo)準(zhǔn)輸出文件(顯示器),標(biāo)準(zhǔn)出錯(cuò)輸出(出錯(cuò)信息)是由系統(tǒng)打開的,可直接使用。9.3.2文件關(guān)閉函數(shù)(fclose函數(shù))文件一旦使用完畢,應(yīng)用關(guān)閉文件函數(shù)把文件關(guān)閉,以避免文件的數(shù)據(jù)丟失等錯(cuò)誤。fclose函數(shù)調(diào)用的一般形式是:
正常完成關(guān)閉文件操作時(shí),fclose函數(shù)返回值為0。如返回非零值則表示有錯(cuò)誤發(fā)生。fclose(文件指針);9.3.3數(shù)據(jù)塊讀寫函數(shù)fread和fwtriteC語(yǔ)言提供了用于整塊數(shù)據(jù)的讀寫函數(shù)??捎脕?lái)讀寫一組數(shù)據(jù),如一個(gè)數(shù)組元素,一個(gè)結(jié)構(gòu)變量的值等。函數(shù)fread和fwrite的原形分別如下:size_tfread(void*ptr,size_tsize,size_tn,FILE*stream);size_tfwrite(constvoid*ptr,size_tsize,size_tn,FILE*stream);對(duì)于函數(shù)fread而言,ptr是存放所讀入數(shù)據(jù)的內(nèi)存區(qū)域的指針,而對(duì)于函數(shù)fwrite而言,prt是寫入到那個(gè)文件的信息的指針。變量n的值確定將讀/寫多少項(xiàng),而每項(xiàng)的長(zhǎng)度是由size決定的,size的類型為size_t,一般代表無(wú)符號(hào)整數(shù)。形參stream是指針變量,是指向原先打開的文件。9.3.3數(shù)據(jù)塊讀寫函數(shù)fread和fwtrite函數(shù)fread和fwrite都有返回值。函數(shù)fread返回讀入的項(xiàng)數(shù),如果出錯(cuò)或者達(dá)到文件的尾部,則返回值可能會(huì)小于n;函數(shù)fwrite返回寫入的項(xiàng)數(shù),如果出錯(cuò),則該值將等于n。例如:
其意義是從fp所指的文件中,每次讀4個(gè)字節(jié)(一個(gè)實(shí)數(shù))送入實(shí)數(shù)組fa中,連續(xù)讀5次,即讀5個(gè)實(shí)數(shù)到fa中。read(fa,4,5,fp);9.3.4格式化讀寫函數(shù)fscanf和fprintffscanf函數(shù),fprintf函數(shù)與前面使用的scanf和printf函數(shù)的功能相似,都是格式化讀寫函數(shù)。兩者的區(qū)別在于fscanf函數(shù)和fprintf函數(shù)的讀寫對(duì)象不是鍵盤和顯示器,而是磁盤文件。函數(shù)fscanf和fprintf的原型分別如下:intfscanf(FILE*fp,constchar*format[,address,…]);intfprintf(FILE*fp,constchar*format[,address,…]);變?cè)猣p是函數(shù)fopen()返回的文件指針,而函數(shù)fprintf()和fscanf()是把I/O操作導(dǎo)向指明的文件。這兩個(gè)函數(shù)的調(diào)用格式為:fscanf(文件指針,格式字符串,輸入列表);fprintf(文件指針,格式字符串,輸出列表);9.3.5字符讀寫函數(shù)fgetc和fputc字符讀寫函數(shù)是以字符(字節(jié))為單位的讀寫函數(shù)。每次可從文件讀出或向文件寫入一個(gè)字符。讀字符函數(shù)fgetcfgetc函數(shù)的功能是從指定的文件中讀一個(gè)字符,函數(shù)調(diào)用的形式為:例如:其意義是從打開的文件fp中讀取一個(gè)字符并送入ch中。字符變量=fgetc(文件指針);ch=fgetc(fp);9.3.5字符讀寫函數(shù)fgetc和fputc1) 在fgetc函數(shù)調(diào)用中,讀取的文件必須是以讀或讀寫方式打開的。2) 讀取字符的結(jié)果也可以不向字符變量賦值,例如:
fgetc(fp);
但是讀出的字符不能保存。3)
在文件內(nèi)部有一個(gè)位置指針。用來(lái)指向文件的當(dāng)前讀寫字節(jié)。在文件打開時(shí),該指針總是指向文件的第一個(gè)字節(jié)。使用fgetc函數(shù)后,該位置指針將向后移動(dòng)一個(gè)字節(jié)。因此可連續(xù)多次使用fgetc函數(shù),讀取多個(gè)字符。應(yīng)注意文件指針和文件內(nèi)部的位置指針不是一回事。文件指針是指向整個(gè)文件的,須在程序中定義說(shuō)明,只要不重新賦值,文件指針的值是不變的。文件內(nèi)部的位置指針用以指示文件內(nèi)部的當(dāng)前讀寫位置,每讀寫一次,該指針均向后移動(dòng),它不需在程序中定義說(shuō)明,而是由系統(tǒng)自動(dòng)設(shè)置的。9.3.5寫字符函數(shù)fputcfputc函數(shù)的功能是把一個(gè)字符寫入指定的文件中,函數(shù)調(diào)用的形式為:
其中,待寫入的字符量可以是字符常量或變量,例如:其意義是把字符a寫入fp所指向的文件中。fputc(字符量,文件指針);fputc('a',fp);字符讀寫函數(shù)fgetc和fputc1) 被寫入的文件可以用寫、讀寫、追加方式打開,用寫或讀寫方式打開一個(gè)已存在的文件時(shí)將清除原有的文件內(nèi)容,寫入字符從文件首開始。如需保留原有文件內(nèi)容,希望寫入的字符以文件末開始存放,必須以追加方式打開文件。被寫入的文件若不存在,則創(chuàng)建該文件。2) 每寫入一個(gè)字符,文件內(nèi)部位置指針向后移動(dòng)一個(gè)字節(jié)。3) fputc函數(shù)有一個(gè)返回值,如寫入成功則返回寫入的字符,否則返回一個(gè)EOF??捎么藖?lái)判斷寫入是否成功。9.3.6字符串讀寫函數(shù)fgets和fputs讀字符串函數(shù)fgets函數(shù)的功能是從指定的文件中讀一個(gè)字符串到字符數(shù)組中,函數(shù)調(diào)用的形式為:
其中的n是一個(gè)正整數(shù)。表示從文件中讀出的字符串不超過(guò)n-1個(gè)字符。在讀入的最后一個(gè)字符后加上串結(jié)束標(biāo)志'\0'。fgets(字符數(shù)組名,n,文件指針);例如:的意義是從fp所指的文件中讀出n-1個(gè)字符送入字符數(shù)組str中。fgets(str,n,fp);1) 在讀出n-1個(gè)字符之前,如遇到了換行符或EOF,則讀出結(jié)束。2) fgets函數(shù)也有返回值,其返回值是字符數(shù)組的首地址。9.3.6字符串讀寫函數(shù)fgets和fputs寫字符串函數(shù)fputsfputs函數(shù)的功能是向指定的文件寫入一個(gè)字符串,其調(diào)用形式為:
其中字符串可以是字符串常量,也可以是字符數(shù)組名,或指針變量,例如:其意義是把字符串“abcd”寫入fp所指的文件之中。fputs(字符串,文件指針);fputs(“abcd“,fp);9.3.7文件定位前面介紹的對(duì)文件的讀寫方式都是順序讀寫,即讀寫文件只能從頭開始,順序讀寫各個(gè)數(shù)據(jù)。但在實(shí)際問題中常要求只讀寫文件中某一指定的部分。為了解決這個(gè)問題可移動(dòng)文件內(nèi)部的位置指針到需要讀寫的位置,再進(jìn)行讀寫,這種讀寫稱為隨機(jī)讀寫。實(shí)現(xiàn)隨機(jī)讀寫的關(guān)鍵是要按要求移動(dòng)位置指針,這稱為文件的定位。移動(dòng)文件內(nèi)部位置指針的函數(shù)主要有兩個(gè),
即rewind
函數(shù)和fseek函數(shù)。9.3.7文件定位rewind函數(shù)前面已多次使用過(guò),其調(diào)用形式為:功能:把文件內(nèi)部的位置指針移到文件首。rewind(文件指針);文件首位置定位rewind函數(shù)文件任意位置定位fseek函數(shù)fseek函數(shù)用來(lái)移動(dòng)文件內(nèi)部位置指針,其調(diào)用形式為:其中:“文件指針”指向被移動(dòng)的文件?!拔灰屏俊北硎疽苿?dòng)的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長(zhǎng)度大于64KB時(shí)不會(huì)出錯(cuò)。當(dāng)用常量表示位移量時(shí),要求加后綴“L”。fseek(文件指針,位移量,起始點(diǎn));9.3.7文件定位“起始點(diǎn)”表示從何處開始計(jì)算位移量,規(guī)定的起始點(diǎn)有三種:文件首,當(dāng)前位置和文件尾。起始點(diǎn)表示符號(hào)數(shù)字表示文件首SEEK_SET0當(dāng)前位置SEEK_CUR1文件末尾SEEK_END2例如:其意義是把位置指針移到離文件首100個(gè)字節(jié)處。還要說(shuō)明的是fseek函數(shù)一般用于二進(jìn)制文件。在文本文件中由于要進(jìn)行轉(zhuǎn)換,故往往計(jì)算的位置會(huì)出現(xiàn)錯(cuò)誤。在移動(dòng)位置指針之后,即可用前面介紹的任一種讀寫函數(shù)進(jìn)行讀寫。由于一般是讀寫一個(gè)數(shù)據(jù)據(jù)塊,因此常用fread和fwrite函數(shù)。fseek(fp,100L,0);9.3.8文件檢測(cè)函數(shù)C語(yǔ)言中常用的文件檢測(cè)函數(shù)有以下幾個(gè):文件結(jié)束檢測(cè)函數(shù)feof讀寫文件錯(cuò)誤檢測(cè)函數(shù)ferror文件出錯(cuò)標(biāo)志和文件結(jié)束標(biāo)志置零函數(shù)clearerr文件結(jié)束檢測(cè)函數(shù)feof函數(shù)調(diào)用格式:feof(文件指針);功能:判斷文件是否處于文件結(jié)束位置,如文件結(jié)束,則返回值為1,否則為0。9.3.8文件檢測(cè)函數(shù)讀寫文件出錯(cuò)檢測(cè)函數(shù)ferror函數(shù)調(diào)用格式:ferror(文件指針);功能:檢查文件在用各種輸入輸出函數(shù)進(jìn)行讀寫時(shí)是否出錯(cuò)。如ferror返回值為0表示未出錯(cuò),否則表示有錯(cuò)。文件出錯(cuò)標(biāo)志和文件結(jié)束標(biāo)志置0函數(shù)clearerr函數(shù)調(diào)用格式:clearerr(文件指針);功能:本函數(shù)用于清除出錯(cuò)標(biāo)志和文件結(jié)束標(biāo)志,使它們?yōu)?值。9.4文件函數(shù)應(yīng)用綜合舉例#include<stdio.h>#include<stdlib.h>#include<conio.h>structstu{charname[10];intnum;intage;charaddr[15];};main(){
charch;inti;FILE*fp;Structstuboya[2],boyb[2],*pp,*qq;pp指向boya,qqpp=boya;qq=boyb;
//以讀/寫方式打開二進(jìn)制文件“stu_list.txt”if((fp=fopen("stu_list.txt","wb+"))==NULL){printf("不能打開文件,任意鍵退出!");getch();exit(1);}
//輸入兩個(gè)學(xué)生數(shù)據(jù)
printf("\ninputdata\n");for(i=0;i<2;i++,pp++)scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
pp=boya;for(i=0;i<2;i++,pp++){fprintf(fp,"%s%d%d%s\n",pp->name,pp->num,pp->age,pp->addr);
}關(guān)閉文件,保證緩沖區(qū)的信息寫入到文件中
fclose(fp);
//再次以只讀形式打開文件
if((fp=fopen(“stu_list.txt”,”r”))==NULL){printf(“不能打開文件,任意鍵退出”);getch();exit(1);
}把文件內(nèi)部位置出兩個(gè)學(xué)生數(shù)據(jù)后,在屏幕上顯示
rewind(fp);for(i=0;i<2;i++,qq++){fscanf(fp,"%s%d%d%s\n",qq->name,&qq->num,&qq->age,qq->addr);}printf("\n\nname\tnumberageaddr\n");qq=boyb;for(i=0;i<2;i++,qq++){printf("%s\t%5d%7d%s\n",qq->name,\qq->num,qq->age,qq->addr);}fclose(fp);}例9.4文件函數(shù)應(yīng)用綜合應(yīng)用9.5C語(yǔ)言圖形程序設(shè)計(jì)基本概念圖形化界面是軟件的趨勢(shì),圖形化界面具有界面友好、交互性強(qiáng)的特點(diǎn),但圖形界面的開發(fā)相對(duì)來(lái)說(shuō)會(huì)麻煩一些,因此難度也就大一些,一般來(lái)說(shuō),圖形界面的開發(fā),經(jīng)常與屏幕的分辨率有關(guān)。在屏幕上進(jìn)行繪制圖形,一般要按以下幾個(gè)步驟執(zhí)行:(1)把屏幕設(shè)置為圖形模式;(2)選擇背景與顯示實(shí)體的顏色;(3)計(jì)算圖形顯示坐標(biāo);(4)調(diào)用繪圖語(yǔ)句繪制實(shí)體9.5C語(yǔ)言圖形程序設(shè)計(jì)基本概念顯示器的工作方式文本方式
圖形方式屏幕上顯示的最小單位是字符。不同的文本方式對(duì)應(yīng)相應(yīng)的行數(shù)、列數(shù)和顏色。一像素作為屏幕上的最小單元,以屏幕的左上角為原點(diǎn),位置為(0,0)。9.5C語(yǔ)言圖形程序設(shè)計(jì)基本概念
在屏幕上顯示圖形的方式稱為圖形模式。在圖形模式下,屏幕是由像素點(diǎn)組成的,像素點(diǎn)的多少?zèng)Q定了屏幕的分辨率。分辨率越高,顯示圖形越細(xì)致,質(zhì)量越好。
如右圖所示1.屏幕由許多像素點(diǎn)組成;2.圖形的顯示效果取決于分辨率的高低;9.5C語(yǔ)言圖形程序設(shè)計(jì)基本概念(0,0)(1023,0)(0,767)(1023,767)1024×768分辨率像素坐標(biāo)在圖形模式下,屏幕上每個(gè)像素的顯示位置用點(diǎn)坐標(biāo)來(lái)描述的。點(diǎn)坐標(biāo)系是以屏幕左上角為坐標(biāo)原點(diǎn)(0,0),水平方向?yàn)閄軸,自左向右;垂直方向?yàn)閅軸,自上向下。如下圖所示:9.6C語(yǔ)言中的圖形函數(shù)
C提供了十分豐富的圖形庫(kù)函數(shù),共有70多個(gè),所有圖形函數(shù)的原型均在頭文件“graphics.h”中定義。所以,在任何使用圖形函數(shù)的程序中,都要求其頭部包含文件graphics.h,即在程序文件的開頭寫上文件包含命令:
#include<graphics.h>同時(shí)將集成開發(fā)環(huán)境option/Linker中的graphics.lib選項(xiàng)設(shè)置為”on”。9.6.1初始化圖形系統(tǒng)函數(shù)initgraph
初始化圖形系統(tǒng)函數(shù)voidinitgraph(int*graphdriver,int*graphmode,char*pathtodriver)功能:將圖形驅(qū)動(dòng)程序裝入內(nèi)存,使屏幕顯示適配器設(shè)置為圖形模式,即圖形系統(tǒng)初始化;參數(shù)說(shuō)明:1.graphdriver是一個(gè)整型值,用來(lái)指定要裝入的圖形驅(qū)動(dòng)程序,指向存有顯卡類型編號(hào)(整數(shù))的整型變量;該值在頭文件graphics.h中以枚舉的形式定義;2.graphmode是一個(gè)整型值,用來(lái)設(shè)置圖形顯示模式。圖形顯示模式?jīng)Q定了顯示的分辨率和顯示的顏色的多少等;3.pathtodriver是一個(gè)字符串,用來(lái)指明圖形驅(qū)動(dòng)程序文件所在的路徑,圖形驅(qū)動(dòng)程序文件以bgi為擴(kuò)展名。9.6.1初始化圖形系統(tǒng)函數(shù)initgraph
enumgraphics_drivers{DETECT,//自動(dòng)檢測(cè)CGA,MCGA,EGA,EGA64,EGAMONO,IBM8514,//1-6HERCMONO,ATT400,VGA,PC3270,//7-10CURRENT_DRAIVER=-1};enumgraphics_modes{…//省略CGA,VGA等顯示模式VGALO=0,//640×20016color4pagesVGAMED=1,//640×35016color2pagesVGAHI=2,//640×48016color1pagesPC3270HI=0,//720×3501pagesIBM8514LO=0,
//640×480256colorIBM8514HI=1,//1024×768256color};1.若驅(qū)動(dòng)程序就在用戶當(dāng)前目錄下,則path可為空字符串,否則應(yīng)給出具體路徑名。以BC為例,一般情況下,在BC安裝目錄(假設(shè)暗轉(zhuǎn)在C盤),則該路徑為:C:\BC31,若寫在參數(shù)中則為“C:\\BC31”;2.前兩個(gè)參數(shù)實(shí)際上是整型指針,調(diào)用時(shí)應(yīng)加上地址運(yùn)算符“&”;9.6.1例9.5已知顯示器類型的圖形系統(tǒng)初始化
#include"graphics.h"main(){intgdriver,gmode;
detectgraph(&gdriver,&gmode);//測(cè)試結(jié)果存放于gdriver,gmode中if(gdriver<0){printf("thereisnotgraphicsdisplayer\n");exit(1);
}//無(wú)圖形顯示模式時(shí),顯示信息,停止程序
printf("detectgraphicsdriveris#%d,modeis#%d\n",gdriver,gmode);//顯示硬件測(cè)試結(jié)果getch();//等待按一鍵結(jié)束initgraph(&gdriver,&gmode,“D:\\TC");//初始化圖形系統(tǒng)bar3d(10,20,50,80,0,0);//畫一條形圖
getch();//等待按一鍵結(jié)束
closegraph();//關(guān)閉圖形系統(tǒng),回文本模式}初始化圖形系統(tǒng)函數(shù)initgraph
例9.6未知顯示器類型的圖形系統(tǒng)初始化#include"graphics.h"main(){
intgdriver,gmode;
gdriver=CGA;//設(shè)置顯示模式CGA
gmode=CGAC0;//選用CGA圖形模式
initgraph(&gdriver,&gmode,“c:\\bc31\\bgi");
//初始化圖形系統(tǒng)bar3d(10,20,50,80,0,0);//畫一條形圖
getch();//等待按一鍵結(jié)束
closegraph();
//關(guān)閉圖形系統(tǒng),回到文本模式}9.6.1例9.7自動(dòng)初始化圖形系統(tǒng)
初始化圖形系統(tǒng)函數(shù)initgraph
#include"graphics.h"main(){
intgdriver,gmode;
gdriver=DETECT;
initgraph(&gdriver,&gmode,“");
//初始化圖形系統(tǒng)bar3d(10,20,50,80,0,0);//畫一條形圖
getch();//等待按一鍵結(jié)束
closegraph();
//關(guān)閉圖形系統(tǒng),回到文本模式}9.6.2關(guān)閉圖形系統(tǒng)函數(shù)closegraph關(guān)閉圖形系統(tǒng)函數(shù)voidclosegraph(void)功能:關(guān)閉圖形系統(tǒng),釋放圖形系統(tǒng)所占的內(nèi)存空間,并返回調(diào)用initgraph函數(shù)之前的顯示模式(通常是文本模式);
另外,將系統(tǒng)從圖形方式切換到文本方式的函數(shù)還有:voidfarrestorecrtmode(void)9.6.3設(shè)置畫筆當(dāng)前顏色及屏幕背景色設(shè)置當(dāng)前畫筆顏色函數(shù)voidsetcolor(intcolor)功能:用來(lái)設(shè)置當(dāng)前畫筆的顏色,將影響待畫出的直線、圓、矩形等線條的顏色;設(shè)置屏幕背景色函數(shù)voidsetbkcolor(intcolor)功能:用來(lái)設(shè)置屏幕背景的顏色;在頭文件graphics.h中,以枚舉的形式定義了顏色:enumCOLORS{BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIGHTGRAY,DARKGRAY,LIGHTBLUE,LIGHTGREEN,LIGHTCYAN,LIGHTRED,LIGHTMAGENTA,YELLOW,WHITE};例如:設(shè)置當(dāng)前畫筆顏色為綠色,可執(zhí)行語(yǔ)句:
setcolor(GREEN)或者setcolor(2)
設(shè)置屏幕背景顏色為藍(lán)色,可執(zhí)行語(yǔ)句:
setbkcolor(BLUE)或者setbkcolor(1)9.6.4畫點(diǎn)及獲取屏幕點(diǎn)顏色畫點(diǎn)函數(shù)voidputpixel(intx,inty,intcolor)功能:向屏幕指定坐標(biāo)處畫一個(gè)給定顏色的點(diǎn);獲取屏幕點(diǎn)顏色函數(shù)unsignedgetpixel(intx,inty)功能:用來(lái)指出屏幕上某一點(diǎn)的顏色是什么;例如:putpixel(100,80,RED)例如:c=getpixel(100,80)9.6.5設(shè)置線型及畫直線設(shè)置線型函數(shù)voidsetlinestyle(intlinestyle,unsigneduser_pattern,intthickness)功能:用于設(shè)置畫筆的當(dāng)前線型及寬度;參數(shù)說(shuō)明:參數(shù)linestyle即線型的枚舉常量如下:枚舉常量名整數(shù)值線型SOLID_LINE0實(shí)線DOTTED_LINE1虛線CENTER_LINE2中心線DASHE_LINE3破折號(hào)USERBIT_LINE4用戶自定義線型如果linestyle的參數(shù)取值為USERBIT_LINE,則參數(shù)user_pattern的值就是用戶自定義的線型。線型以二進(jìn)制(共16位)的形式存放于參數(shù)user_pattern中,其中1點(diǎn)畫出,0不畫出。當(dāng)linestyle取非USERBIT_LINE,
user_pattern取0值。參數(shù)thickness只有兩個(gè)值:NORM_WIDTH(整數(shù)值為1)和THICK_WIDTH(數(shù)值為3)
NORM_WIDTH畫細(xì)線,
THICK_WIDTH表示畫粗線9.6.5畫直線的相關(guān)函數(shù)voidline(intx1,inty1,intx2,inty2)功能:line函數(shù)在屏幕上的任意兩點(diǎn)之間畫一條直線段;
如:在坐標(biāo)(10,20)、(150,50)的兩點(diǎn)畫一條直線
line(10,20,150,50);
函數(shù)moveto用于移動(dòng)畫筆的當(dāng)前位置到指定坐標(biāo)位置,但移動(dòng)過(guò)程中不畫線。
函數(shù)lineto配合函數(shù)moveto使用,則可在屏幕上畫出連續(xù)的折線。如畫一個(gè)以點(diǎn)(50,0),(100,0)及(60,80)為頂點(diǎn)的三角形:
moveto(50,0);
lineto(100,50);
lineto(60,80);Lineto(50,0);設(shè)置線型及畫直線voidlineto(intx,inty)void
moveto(intx,inty)9.6.6畫圓、橢圓、矩形及多邊形void
circle(intx,inty,intradius)voidellips(intx,inty,intstangle,intendangle,intxradius,intyradius)voidrectangle(intleft,inttop,intright,intbottom)voiddrawpoly(intnumpoints,int*polypoints)函數(shù)說(shuō)明:1)函數(shù)circle的功能是以某點(diǎn)為圓心,用當(dāng)前線型畫一個(gè)指定半徑的圓,如:
circle(100,80,30)即為以(100,80)為圓心,畫一個(gè)半徑30的圓;2)函數(shù)ellips用于在屏幕上畫一個(gè)橢圓。參數(shù)(x,y)是橢圓的中心坐標(biāo),stangle是起始角度,endangle結(jié)束角度,xradius和yradius分別為x軸和y軸的橢圓半徑;
ellips(150,100,0,180,40,30);3)函數(shù)rectangle的功能是畫一個(gè)矩形,參數(shù)(left,top)是左上角的坐標(biāo),參數(shù)(right,bottom)是矩形右下角的坐標(biāo)。
rectangle(10,20,80,50);9.6.6畫圓、橢圓、矩形及多邊形函數(shù)說(shuō)明:4)函數(shù)drawpoly的功能是按給定的頂點(diǎn),畫一條連續(xù)折線。如果所畫的折線式封閉的,那么畫出的便是一個(gè)多邊形。參數(shù)numpoints為折線的頂點(diǎn)數(shù),參數(shù)polypoints指向有頂點(diǎn)坐標(biāo)的一維整型數(shù)組的第一個(gè)元素,數(shù)組中頂點(diǎn)的坐標(biāo)按(x,y)依次存放。
如畫一個(gè)梯形,可執(zhí)行語(yǔ)句如下:
intv[]={50,10,100,10,120,60,30,60,50,10};
drawpoly(5,v);9.6.7填充圖形函數(shù)設(shè)置填充模式和填充顏色函數(shù)voidsetfillpattern(char*upattern,intcolor);void
setfillstyle(intpattern,intcolor);功能:setfillpattern是設(shè)置用戶定義的填充圖案及填充顏色;參數(shù)說(shuō)明:參數(shù)upattern指向存有表述填充圖案(8×8方塊)的8個(gè)字節(jié)存儲(chǔ)區(qū)域,參數(shù)color為填充顏色:
如:charpattern[]={0xFF,0x81,
0x81,
0x81,
0x81,
0x81,
0x81,0xFF};setfillpattern(pattern,BLUE);9.6.7填充圖形函數(shù)Setfillstyle的功能是設(shè)置系統(tǒng)預(yù)設(shè)填充圖案及用戶指定的填充顏色。參數(shù)pattern的取值如右表,枚舉常量名整數(shù)值填充圖案EMPTY_FILL0背景色填充SOLID_FILL1單色填充LINE_FILL2…填充LTSLASH_FILL3///填充SLASH_FILL4粗///填充BKSLASH_FILL5粗\\\填充LTBKSLASH_FILL6\\\填充HATCH_FILL7淡影線填充XHATCH_FILL8交叉線填充INTERLEAVE_FILL9間隔線填充WID_DOT_FILL10稀疏空白點(diǎn)填充COLOSE_DOT_FILL11密集空白點(diǎn)填充如果用戶想使用自定義填充模式,應(yīng)該使用setfillpattern函數(shù)而不是用setfillstyle函數(shù)的USER_FILL模式。9.6.7填充圖形函數(shù)填充指定區(qū)域函數(shù)void
floodfill(intx,inty,intborder);功能:將指定邊界色為border的封閉區(qū)域,用當(dāng)前填充圖案的填充色來(lái)填充;參數(shù)說(shuō)明:形參(x,y)為填充區(qū)域中的一點(diǎn),參數(shù)border為區(qū)域的邊界顏色值。如:用綠色填充一個(gè)圓形區(qū)域(邊界紅色),可執(zhí)行語(yǔ)句:
setcolor(GREEN);
circle(80,60,30);
floodfile(80,63,RED);9.6.7填充圖形函數(shù)填充矩形、多邊形、橢圓、圓和扇形等函數(shù):voidbar(intleft,inttop,intright,intbottom);voidfillpoly(intnumpoints,int*polypoints);voidfillellips(intx,inty,intxradius,intyradius);voidpeislice(intx,inty,intstangle,intendangle,intradius);voidsector(intx,inty,intstangle,intendangle,intxradius,intyradius);功能:函數(shù)bar和函數(shù)rectangle相似,不同的是函數(shù)bar用當(dāng)前線型和顏色畫完矩形邊框后,還會(huì)用當(dāng)前填充圖案和填充色填充該矩形;
函數(shù)fillpoly與函數(shù)drawpoly相似,不同的也是在畫完折線后,還會(huì)用當(dāng)前填充圖案和填充色填充折線所圍起的區(qū)域;
函數(shù)fillellips和ellips也是填充和不填充的區(qū)別;
函數(shù)pieslice和函數(shù)sector的區(qū)別:
pieslice是填充圓形扇形,
sector是填充橢圓形扇形;9.7圖形方式下的文本常見操作函數(shù)
在圖形方式下主要繪制圖形,但還要輸出文本。為了有效地進(jìn)行圖形操作,在圖形方式下開設(shè)“視口”(也稱“窗口”或“視見區(qū)”)也是極重要的,圖像方式下的文本操作函數(shù)是只在圖形區(qū)進(jìn)行文本輸入/輸出的函數(shù),BC++3.1只提供了對(duì)圖形進(jìn)行字符串輸出的函數(shù),但輸出字符的字型等是可控的。9.7.1視口操作函數(shù)視口操作函數(shù)是指用于圖形輸出的屏幕矩形區(qū)域,初始化圖形系統(tǒng)時(shí),視口默認(rèn)為整個(gè)屏幕。視口函數(shù)有:
voidfarsetviewport(intleft,inttop,intright,intbottom,intclip);
voidfargetviewport(structviewporttype*viewport);
voidfarclearviewport(void);功能:函數(shù)setviewport用于設(shè)置視口在屏幕中的位置和視口區(qū)的大小,參數(shù)(left,top)是視口左上角的坐標(biāo)(屏幕坐標(biāo)系中的坐標(biāo)),參數(shù)(right,bottom)是視口右下角的坐標(biāo)(屏幕坐標(biāo)系中的坐標(biāo))。參數(shù)clip用來(lái)確定當(dāng)繪制的圖形越過(guò)視口邊界時(shí),是否對(duì)其裁剪。0-裁剪;非0-不裁剪;
函數(shù)getviewport返回當(dāng)前視口區(qū)的信息,結(jié)果存入viewport中,viewport結(jié)構(gòu)定義:Structviewporttype{intleft,top,right,bottom;intclip;};函數(shù)clearviewport清除當(dāng)前視口;9.7.2圖形方式下的文字輸出相關(guān)函數(shù):
settextstyle(intfont,intdirection,intcharsize);outtext(char*textstring);outtextxy(intx,inty,char*textstring);功能:函數(shù)settextstyle用于指定輸出字符串的字體、大小和方向。參數(shù)說(shuō)明:函數(shù)中font確定所用字體的類型,bc31中包含了幾種英文字體,如表,其中8×8點(diǎn)陣字體放在圖形驅(qū)動(dòng)程序中,而其他的矢量字體都是以CHR為擴(kuò)展名,存放在系統(tǒng)初始化函數(shù)initgraph指定的目錄中或存放在當(dāng)前目錄下。
參數(shù)direction確定輸入文字的方向,它只有兩個(gè)值:HORIZ_DIR(整數(shù)值為0)和VERT_DIR(整數(shù)值為1)。參數(shù)charsize確定文字的大小,取值范圍是0∽10.9.7.2圖形方式下的文字輸出枚舉常量名整數(shù)值字體類型DEFAULT_FONT08×8點(diǎn)陣字體TRIPLEX_FONT1三重矢量字體SMALL_FONT2小號(hào)矢量字體SANS_SERIF_FONT3無(wú)襯線矢量字體GOTHIC_FONT4哥特矢量字體文本操作函數(shù)outtext和outtextxy主要功能是在屏幕上輸出字符串,區(qū)別在于outtext在當(dāng)前位置輸出,
outtextxy是在指定位置輸出。9.7.3屏幕圖形的保存和恢復(fù)相關(guān)函數(shù):
getimage(intleft,inttop,intright,intbottom,void*bitmap);imagesize(intleft,inttop,intright,intbottom,void);putimage(intleft,inttop,void*bitmap,intop);功能及參數(shù)說(shuō)明:
函數(shù)getimage可以把屏幕某一矩形區(qū)域的圖像保存到指定的內(nèi)存中。參數(shù)(left,top)為矩形左上角坐標(biāo),參數(shù)(right,bottom)為矩形右下角坐標(biāo),參數(shù)bitmap為用于保存圖像的內(nèi)存區(qū)地址。
函數(shù)imagsize用于計(jì)算保存圖形所需的存儲(chǔ)空間大小;
函數(shù)putimage是恢復(fù)函數(shù)getimage保存的圖像,并將其顯示到屏幕上。參數(shù)(left,top)為屏幕目標(biāo)矩形區(qū)域的左上角坐標(biāo),參數(shù)bitmap為由函數(shù)getimage保存的圖像存放區(qū)域的地址,參數(shù)op為恢復(fù)方式,如下:9.7.3屏幕圖形的保存和恢復(fù)枚舉常量名整數(shù)值恢復(fù)方式COPY_PUT0原樣拷貝到屏幕上XOR_PUT1與屏幕上的點(diǎn)“異或”后寫入OR_PUT2與屏幕上的點(diǎn)“或”后寫入AND_PUT3與屏幕上的點(diǎn)“與”后寫入NOT_PUT4原圖像取反后寫到屏幕例:要將屏幕某一區(qū)域圖像復(fù)制到屏幕另一位置:void*buffer;//定義指針用于存放圖像存儲(chǔ)區(qū)地址;unsigneds;//用于存放存儲(chǔ)區(qū)大小s=imagesize(20,30,50,65);//計(jì)算所需內(nèi)存的大小buffer=malloc(s);//動(dòng)態(tài)分配所需的內(nèi)存getimage(20,30,50,65,buffer)j;//保存矩形區(qū)圖像到buffer指向的內(nèi)存區(qū);putimage(100,100,buffer,COPY_PUT);//以復(fù)制方式將圖像恢復(fù)到指定位置free(buffer);9.8綜合舉例例9.8
畫出一個(gè)搜索引擎的界面,用一個(gè)二維數(shù)組來(lái)存儲(chǔ)鼠標(biāo)的畫圖
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 1 《開開心心上學(xué)去》(教學(xué)實(shí)錄)-2024-2025學(xué)年統(tǒng)編版(2024)(五四制)道德與法治一年級(jí)上冊(cè)
- 2025版高考生物第一部分專題練專練11物質(zhì)跨膜運(yùn)輸?shù)膶?shí)例
- 2024年度高新技術(shù)企業(yè)廠房租賃協(xié)議2篇
- 2024年八年級(jí)語(yǔ)文上冊(cè) 第六單元 第24課《詩(shī)詞五首》教學(xué)實(shí)錄 新人教版
- 2024年度居間服務(wù)評(píng)價(jià)與改進(jìn)合同3篇
- 六盤水幼兒師范高等??茖W(xué)?!缎W(xué)課程整合研究與設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2023三年級(jí)英語(yǔ)下冊(cè) Module 1 Unit 1 It's The Abc Song教學(xué)實(shí)錄2 外研版(三起)
- 2024年度yza房地產(chǎn)公司房屋銷售代理合同3篇
- 2024年度倪俊與戚露裝修款支付協(xié)議3篇
- 2024年機(jī)器交易合同樣本
- 校本研修教研工作總結(jié)匯報(bào)課件
- 山東省高等醫(yī)學(xué)院校臨床教學(xué)基地水平評(píng)估指標(biāo)體系與標(biāo)準(zhǔn)(修訂)
- 大孔吸附樹脂技術(shù)課件
- 空白貨品簽收單
- 建筑電氣施工圖(1)課件
- 質(zhì)量管理體系運(yùn)行獎(jiǎng)懲考核辦法課案
- 泰康人壽養(yǎng)老社區(qū)介紹課件
- T∕CSTM 00584-2022 建筑用晶體硅光伏屋面瓦
- 2020春國(guó)家開放大學(xué)《應(yīng)用寫作》形考任務(wù)1-6參考答案
- 國(guó)家開放大學(xué)實(shí)驗(yàn)學(xué)院生活中的法律第二單元測(cè)驗(yàn)答案
- CAMDS操作方法及使用技巧
評(píng)論
0/150
提交評(píng)論