C語言的發(fā)展教程_第1頁
C語言的發(fā)展教程_第2頁
C語言的發(fā)展教程_第3頁
C語言的發(fā)展教程_第4頁
C語言的發(fā)展教程_第5頁
已閱讀5頁,還剩177頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

...wd......wd......wd...C語言教程C語言概述C語言的開展過程C語言是在70年代初問世的。一九七八年由美國電報(bào)公司(AT&T)貝爾實(shí)驗(yàn)室正式發(fā)表了C語言。同時(shí)由B.W.Kernighan和D.M.Ritchit合著了著名的“THECPROGRAMMINGLANGUAGE〞一書。通常簡稱為《K&R》,也有人稱之為《K&R》標(biāo)準(zhǔn)。但是,在《K&R》中并沒有定義一個(gè)完整的標(biāo)準(zhǔn)C語言,后來由美國國家標(biāo)準(zhǔn)協(xié)會〔AmericanNationalStandardsInstitute〕在此根基上制定了一個(gè)C語言標(biāo)準(zhǔn),于一九八三年發(fā)表。通常稱之為ANSIC。當(dāng)代最優(yōu)秀的程序設(shè)計(jì)語言早期的C語言主要是用于UNIX系統(tǒng)。由于C語言的強(qiáng)大功能和各方面的優(yōu)點(diǎn)逐漸為人們認(rèn)識,到了八十年代,C開場進(jìn)入其它操作系統(tǒng),并很快在各類大、中、小和微型計(jì)算機(jī)上得到了廣泛的使用,成為當(dāng)代最優(yōu)秀的程序設(shè)計(jì)語言之一。C語言版本目前最流行的C語言有以下幾種:·MicrosoftC或稱MSC·BorlandTurboC或稱TurboC·AT&TC這些C語言版本不僅實(shí)現(xiàn)了ANSIC標(biāo)準(zhǔn),而且在此根基上各自作了一些擴(kuò)大,使之更加方便、完美。C語言的特點(diǎn)1·C語言簡潔、緊湊,使用方便、靈活。ANSIC一共只有32個(gè)關(guān)鍵字:autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedstaticsizofstructswitchtypedefunionunsignedvoidvolatilewhile9種控制語句,程序書寫自由,主要用小寫字母表示,壓縮了一切不必要的成分。TurboC擴(kuò)大了11個(gè)關(guān)鍵字:asm _cs _ds _es _ss cdecl farhuge interrupt near pascal注意:在C語言中,關(guān)鍵字都是小寫的。2·運(yùn)算符豐富。共有34種。C把括號、賦值、逗號等都作為運(yùn)算符處理。從而使C的運(yùn)算類型極為豐富,可以實(shí)現(xiàn)其他高級語言難以實(shí)現(xiàn)的運(yùn)算。3·數(shù)據(jù)構(gòu)造類型豐富。4·具有構(gòu)造化的控制語句。5·語法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。6·C語言允許直接訪問物理地址,能進(jìn)展位〔bit〕操作,能實(shí)現(xiàn)匯編語言的大局部功能,可以直接對硬件進(jìn)展操作。因此有人把它稱為中級語言。7·生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。8·與匯編語言相比,用C語言寫的程序可移植性好。但是,C語言對程序員要求也高,程序員用C寫程序會感到限制少、靈活性大,功能強(qiáng),但較其他高級語言在學(xué)習(xí)上要困難一些。面向?qū)ο蟮某绦蛟O(shè)計(jì)語言在C的根基上,一九八三年又由貝爾實(shí)驗(yàn)室的BjarneStrou-strup推出了C++。C++進(jìn)一步擴(kuò)大和完善了C語言,成為一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語言。C++目前流行的最新版本是BorlandC++,SymantecC++和MicrosoftVisualC++。C++提出了一些更為深入的概念,它所支持的這些面向?qū)ο蟮母拍钊菀讓栴}空間直接地映射到程序空間,為程序員提供了一種與傳統(tǒng)構(gòu)造程序設(shè)計(jì)不同的思維方式和編程方法。因而也增加了整個(gè)語言的復(fù)雜性,掌握起來有一定難度。C和C++但是,C是C++的根基,C++語言和C語言在很多方面是兼容的。因此,掌握了C語言,再進(jìn)一步學(xué)習(xí)C++就能以一種熟悉的語法來學(xué)習(xí)面向?qū)ο蟮恼Z言,從而到達(dá)事半功倍的目的。簡單的C程序介紹為了說明C語言源程序構(gòu)造的特點(diǎn),先看以下幾個(gè)程序。這幾個(gè)程序由簡到難,表現(xiàn)了C語言源程序在組成構(gòu)造上的特點(diǎn)。雖然有關(guān)內(nèi)容還未介紹,但可從這些例子中了解到組成一個(gè)C源程序的基本局部和書寫格式?!纠?.1】main(){printf("世界,您好!\n");}main是主函數(shù)的函數(shù)名,表示這是一個(gè)主函數(shù)。每一個(gè)C源程序都必須有,且只能有一個(gè)主函數(shù)(main函數(shù))。函數(shù)調(diào)用語句,printf函數(shù)的功能是把要輸出的內(nèi)容送到顯示器去顯示。printf函數(shù)是一個(gè)由系統(tǒng)定義的標(biāo)準(zhǔn)函數(shù),可在程序中直接調(diào)用?!纠?.2】#include<math.h>#include<stdio.h>main(){doublex,s;printf("inputnumber:\n");scanf("%lf",&x);s=sin(x);printf("sineof%lfis%lf\n",x,s);}include稱為文件包含命令擴(kuò)展名為.h的文件稱為頭文件定義兩個(gè)實(shí)數(shù)變量,以被后面程序使用顯示提示信息從鍵盤獲得一個(gè)實(shí)數(shù)x求x的正弦,并把它賦給變量s顯示程序運(yùn)算結(jié)果main函數(shù)完畢程序的功能是從鍵盤輸入一個(gè)數(shù)x,求x的正弦值,然后輸出結(jié)果。在main()之前的兩行稱為預(yù)處理命令(詳見后面)。預(yù)處理命令還有其它幾種,這里的include稱為文件包含命令,其意義是把尖括號<>或引號""內(nèi)指定的文件包含到本程序來,成為本程序的一局部。被包含的文件通常是由系統(tǒng)提供的,其擴(kuò)展名為.h。因此也稱為頭文件或首部文件。C語言的頭文件中包括了各個(gè)標(biāo)準(zhǔn)庫函數(shù)的函數(shù)原型。因此,但凡在程序中調(diào)用一個(gè)庫函數(shù)時(shí),都必須包含該函數(shù)原型所在的頭文件。在本例中,使用了三個(gè)庫函數(shù):輸入函數(shù)scanf,正弦函數(shù)sin,輸出函數(shù)printf。sin函數(shù)是數(shù)學(xué)函數(shù),其頭文件為math.h文件,因此在程序的主函數(shù)前用include命令包含了math.h。scanf和printf是標(biāo)準(zhǔn)輸入輸出函數(shù),其頭文件為stdio.h,在主函數(shù)前也用include命令包含了stdio.h文件。需要說明的是,C語言規(guī)定對scanf和printf這兩個(gè)函數(shù)可以省去對其頭文件的包含命令。所以在本例中也可以刪去第二行的包含命令#include<stdio.h>。同樣,在例1.1中使用了printf函數(shù),也省略了包含命令。在例題中的主函數(shù)體中又分為兩局部,一局部為說明局部,另一部為分執(zhí)行局部。說明是指變量的類型說明。例題1.1中未使用任何變量,因此無說明局部。C語言規(guī)定,源程序中所有用到的變量都必須先說明,后使用,否則將會出錯(cuò)。這一點(diǎn)是編譯型高級程序設(shè)計(jì)語言的一個(gè)特點(diǎn),與解釋型的BASIC語言是不同的。說明局部是C源程序構(gòu)造中很重要的組成局部。本例中使用了兩個(gè)變量x,s,用來表示輸入的自變量和sin函數(shù)值。由于sin函數(shù)要求這兩個(gè)量必須是雙精度浮點(diǎn)型,故用類型說明符double來說明這兩個(gè)變量。說明局部后的四行為執(zhí)行局部或稱為執(zhí)行語句局部,用以完成程序的功能。執(zhí)行局部的第一行是輸出語句,調(diào)用printf函數(shù)在顯示器上輸出提示字符串,請操作人員輸入自變量x的值。第二行為輸入語句,調(diào)用scanf函數(shù),承受鍵盤上輸入的數(shù)并存入變量x中。第三行是調(diào)用sin函數(shù)并把函數(shù)值送到變量s中。第四行是用printf函數(shù)輸出變量s的值,即x的正弦值。程序完畢。運(yùn)行本程序時(shí),首先在顯示器屏幕上給出提示串inputnumber,這是由執(zhí)行局部的第一行完成的。用戶在提示下從鍵盤上鍵入某一數(shù),如5,按下回車鍵,接著在屏幕上給出計(jì)算結(jié)果。輸入和輸出函數(shù)在前兩個(gè)例子中用到了輸入和輸出函數(shù)scanf和printf,在以后要詳細(xì)介紹。這里我們先簡單介紹一下它們的格式,以便下面使用。scanf和printf這兩個(gè)函數(shù)分別稱為格式輸入函數(shù)和格式輸出函數(shù)。其意義是按指定的格式輸入輸出值。因此,這兩個(gè)函數(shù)在括號中的參數(shù)表都由以下兩局部組成:“格式控制串〞,參數(shù)表格式控制串是一個(gè)字符串,必須用雙引號括起來,它表示了輸入輸出量的數(shù)據(jù)類型。各種類型的格式表示法可參閱第三章。在printf函數(shù)中還可以在格式控制串內(nèi)出現(xiàn)非格式控制字符,這時(shí)在顯示屏幕上將原文照印。參數(shù)表中給出了輸入或輸出的量。當(dāng)有多個(gè)量時(shí),用逗號間隔。例如:printf("sineof%lfis%lf\n",x,s);其中%lf為格式字符,表示按雙精度浮點(diǎn)數(shù)處理。它在格式串中兩次現(xiàn),對應(yīng)了x和s兩個(gè)變量。其余字符為非格式字符則照原樣輸出在屏幕上。【例1.3】intmax(inta,intb);/*函數(shù)說明*/main()/*主函數(shù)*/{intx,y,z;/*變量說明*/intmax(inta,intb);/*函數(shù)說明*/printf("inputtwonumbers:\n");scanf("%d%d",&x,&y);/*輸入x,y值*/z=max(x,y);/*調(diào)用max函數(shù)*/printf("maxmum=%d",z);/*輸出*/}intmax(inta,intb)/*定義max函數(shù)*/{if(a>b)returna;elsereturnb;/*把結(jié)果返回主調(diào)函數(shù)*/}上面例中程序的功能是由用戶輸入兩個(gè)整數(shù),程序執(zhí)行后輸出其中較大的數(shù)。本程序由兩個(gè)函數(shù)組成,主函數(shù)和max函數(shù)。函數(shù)之間是并列關(guān)系??蓮闹骱瘮?shù)中調(diào)用其它函數(shù)。max函數(shù)的功能是對比兩個(gè)數(shù),然后把較大的數(shù)返回給主函數(shù)。max函數(shù)是一個(gè)用戶自定義函數(shù)。因此在主函數(shù)中要給出說明(程序第三行)??梢?,在程序的說明局部中,不僅可以有變量說明,還可以有函數(shù)說明。關(guān)于函數(shù)的詳細(xì)內(nèi)容將在以后第五章介紹。在程序的每行后用/*和*/括起來的內(nèi)容為注釋局部,程序不執(zhí)行注釋局部。上例中程序的執(zhí)行過程是,首先在屏幕上顯示提示串,請用戶輸入兩個(gè)數(shù),回車后由scanf函數(shù)語句接收這兩個(gè)數(shù)送入變量x,y中,然后調(diào)用max函數(shù),并把x,y的值傳送給max函數(shù)的參數(shù)a,b。在max函數(shù)中對比a,b的大小,把大者返回給主函數(shù)的變量z,最后在屏幕上輸出z的值。C源程序的構(gòu)造特點(diǎn)1.一個(gè)C語言源程序可以由一個(gè)或多個(gè)源文件組成。2.每個(gè)源文件可由一個(gè)或多個(gè)函數(shù)組成。3.一個(gè)源程序不管由多少個(gè)文件組成,都有一個(gè)且只能有一個(gè)main函數(shù),即主函數(shù)。4.源程序中可以有預(yù)處理命令(include命令僅為其中的一種),預(yù)處理命令通常應(yīng)放在源文件或源程序的最前面。5.每一個(gè)說明,每一個(gè)語句都必須以分號結(jié)尾。但預(yù)處理命令,函數(shù)頭和花括號“}〞之后不能加分號。6.標(biāo)識符,關(guān)鍵字之間必須至少加一個(gè)空格以示間隔。假設(shè)已有明顯的間隔符,也可不再加空格來間隔。書寫程序時(shí)應(yīng)遵循的規(guī)則從書寫清晰,便于閱讀,理解,維護(hù)的角度出發(fā),在書寫程序時(shí)應(yīng)遵循以下規(guī)則:1.一個(gè)說明或一個(gè)語句占一行。2.用{}括起來的局部,通常表示了程序的某一層次構(gòu)造。{}一般與該構(gòu)造語句的第一個(gè)字母對齊,并單獨(dú)占一行。3.低一層次的語句或說明可比高一層次的語句或說明縮進(jìn)假設(shè)干格后書寫。以便看起來更加清晰,增加程序的可讀性。在編程時(shí)應(yīng)力求遵循這些規(guī)則,以養(yǎng)成良好的編程風(fēng)格。C語言的字符集字符是組成語言的最基本的元素。C語言字符集由字母,數(shù)字,空格,標(biāo)點(diǎn)和特殊字符組成。在字符常量,字符串常量和注釋中還可以使用漢字或其它可表示的圖形符號。1.字母小寫字母a~z共26個(gè)大寫字母A~Z共26個(gè)2.數(shù)字 0~9共10個(gè)3.空白符空格符、制表符、換行符等統(tǒng)稱為空白符??瞻追辉谧址A亢妥址A恐衅鹱饔?。在其它地方出現(xiàn)時(shí),只起間隔作用,編譯程序?qū)λ鼈兒雎圆挥?jì)。因此在程序中使用空白符與否,對程序的編譯不發(fā)生影響,但在程序中適當(dāng)?shù)牡胤绞褂每瞻追麑⒃黾映绦虻那逦院涂勺x性。4.標(biāo)點(diǎn)和特殊字符C語言詞匯在C語言中使用的詞匯分為六類:標(biāo)識符,關(guān)鍵字,運(yùn)算符,分隔符,常量,注釋符等。1.標(biāo)識符在程序中使用的變量名、函數(shù)名、標(biāo)號等統(tǒng)稱為標(biāo)識符。除庫函數(shù)的函數(shù)名由系統(tǒng)定義外,其余都由用戶自定義。C規(guī)定,標(biāo)識符只能是字母(A~Z,a~z)、數(shù)字(0~9)、下劃線(_)組成的字符串,并且其第一個(gè)字符必須是字母或下劃線。以下標(biāo)識符是合法的: a,x,x3,BOOK_1,sum5以下標(biāo)識符是非法的:3s以數(shù)字開頭s*T出現(xiàn)非法字符*-3x以減號開頭bowy-1出現(xiàn)非法字符-(減號)在使用標(biāo)識符時(shí)還必須注意以下幾點(diǎn):(1)標(biāo)準(zhǔn)C不限制標(biāo)識符的長度,但它受各種版本的C語言編譯系統(tǒng)限制,同時(shí)也受到具體機(jī)器的限制。例如在某版本C中規(guī)定標(biāo)識符前八位有效,當(dāng)兩個(gè)標(biāo)識符前八位一樣時(shí),則被認(rèn)為是同一個(gè)標(biāo)識符。(2)在標(biāo)識符中,大小寫是有區(qū)別的。例如BOOK和book是兩個(gè)不同的標(biāo)識符。(3)標(biāo)識符雖然可由程序員隨意定義,但標(biāo)識符是用于標(biāo)識某個(gè)量的符號。因此,命名應(yīng)盡量有相應(yīng)的意義,以便于閱讀理解,作到“顧名思義〞。2.關(guān)鍵字關(guān)鍵字是由C語言規(guī)定的具有特定意義的字符串,通常也稱為保存字。用戶定義的標(biāo)識符不應(yīng)與關(guān)鍵字一樣。C語言的關(guān)鍵字分為以下幾類:(1)類型說明符用于定義、說明變量、函數(shù)或其它數(shù)據(jù)構(gòu)造的類型。如前面例題中用到的int,double等(2)語句定義符用于表示一個(gè)語句的功能。如例1.3中用到的ifelse就是條件語句的語句定義符。(3)預(yù)處理命令字用于表示一個(gè)預(yù)處理命令。如前面各例中用到的include。3.運(yùn)算符C語言中含有相當(dāng)豐富的運(yùn)算符。運(yùn)算符與變量,函數(shù)一起組成表達(dá)式,表示各種運(yùn)算功能。運(yùn)算符由一個(gè)或多個(gè)字符組成。4.分隔符在C語言中采用的分隔符有逗號和空格兩種。逗號主要用在類型說明和函數(shù)參數(shù)表中,分隔各個(gè)變量??崭穸嘤糜谡Z句各單詞之間,作間隔符。在關(guān)鍵字,標(biāo)識符之間必須要有一個(gè)以上的空格符作間隔,否則將會出現(xiàn)語法錯(cuò)誤,例如把inta;寫成inta;C編譯器會把inta當(dāng)成一個(gè)標(biāo)識符處理,其結(jié)果必然出錯(cuò)。5.常量C語言中使用的常量可分為數(shù)字常量、字符常量、字符串常量、符號常量、轉(zhuǎn)義字符等多種。在后面章節(jié)中將專門給予介紹。6.注釋符C語言的注釋符是以“/*〞開頭并以“*/〞結(jié)尾的串。在“/*〞和“*/〞之間的即為注釋。程序編譯時(shí),不對注釋作任何處理。注釋可出現(xiàn)在程序中的任何位置。注釋用來向用戶提示或解釋程序的意義。在調(diào)試程序中對暫不使用的語句也可用注釋符括起來,使翻譯跳過不作處理,待調(diào)試完畢后再去掉注釋符。TurboC2.0集成開發(fā)環(huán)境的使用TurboC2.0簡介和啟動我們上機(jī)實(shí)習(xí)和將來考試都是使用BorlandTurboC2.0這個(gè)版本。該系統(tǒng)是DOS操作系統(tǒng)支持下的軟件,在windows98環(huán)境下,可以在DOS窗口下運(yùn)行。我們機(jī)房是在D盤根目錄下建設(shè)一個(gè)TC子目錄下安裝TurboC2.0系統(tǒng)的。TC下還建設(shè)了兩個(gè)了目錄LIB和INCLUDE,LIB子目錄中存放庫文件,INCLUDE

子目錄中存放所有頭文件。在DOS環(huán)境下或在windows98的DOS窗口下運(yùn)行運(yùn)行TurboC2.0時(shí),只要在TC子目錄下鍵入TC并回車即可進(jìn)入TurboC2.0

集成開發(fā)環(huán)境。在windows98環(huán)境下,也可以選運(yùn)行菜單,然后鍵入d:\tc\tc即可,也可以在tc文件夾找到tc.exe文件,然后用鼠標(biāo)雙擊該文件名也可進(jìn)入TurboC2.0

集成開發(fā)環(huán)境。TurboC是美國Borland公司的產(chǎn)品,Borland公司是一家專門從事軟件開發(fā)、研制的大公司。該公司相繼推出了一套Turbo系列軟件,如Turbo

BASIC,

TurboPascal,TurboProlog,這些軟件很受用戶歡送。該公司在1987年首次推出TurboC1.0產(chǎn)品,其中使用了全然一新的集成開發(fā)環(huán)境,即使用了一系列下拉式菜單,將文本編輯、程序編譯、連接以及程序運(yùn)行一體化,大大方便了程序的開發(fā)。1988年,Borland公司又推出TurboC1.5版本,增加了圖形庫和文本窗口函數(shù)庫等,而TurboC2.0則是該公司1989年出版的。TurboC2.0在原來集成開發(fā)環(huán)境的根基上增加了查錯(cuò)功能,并可以在Tiny模式下直接生成.COM(數(shù)據(jù)、代碼、堆棧處在同一64K內(nèi)存中)文件。還可對數(shù)學(xué)協(xié)處理器(支持8087/80287/80387等)進(jìn)展仿真。Borland公司后來又推出了面向?qū)ο蟮某绦蜍浖黅urboC++,它繼承開展TurboC2.0的集成開發(fā)環(huán)境,并包含了面向?qū)ο蟮幕舅枷牒驮O(shè)計(jì)方法。1991年為了適用Microsoft公司的Windows3.0版本,Borland公司又將TurboC++作了更新,即TurboC的新一代產(chǎn)品BorlandcC++也已經(jīng)問世了。TurboC2.0集成開發(fā)環(huán)境進(jìn)入TurboC2.0集成開發(fā)環(huán)境中后,屏幕上顯示:其中頂上一行為TurboC2.0主菜單,

中間窗口為編輯區(qū),

接下來是信息窗口,最底下一行為參考行。這四個(gè)窗口構(gòu)成了TurboC2.0的主屏幕,以后的編程、編譯、調(diào)試以及運(yùn)行都將在這個(gè)主屏幕中進(jìn)展。主菜單在TurboC2.0主屏幕頂上一行,顯示以下內(nèi)容:FileEditRunCompileProjectOptionsDebugBreak/watch除Edit外,其它各項(xiàng)均有子菜單,只要用Alt加上某項(xiàng)中第一個(gè)字母,就可進(jìn)入該項(xiàng)的子菜單中。File菜單按Alt+F可進(jìn)入File菜單,如圖:File菜單的子菜單共有9項(xiàng),分別表達(dá)如下:Load:裝入一個(gè)文件,可用類似DOS的通配符(如*.C)來進(jìn)展列表選擇。也可裝入其它擴(kuò)展名的文件,只要給出文件名(或只給路徑)即可。該項(xiàng)的熱鍵為F3,即只要按F3即可進(jìn)入該項(xiàng),而不需要先進(jìn)入File菜單再選此項(xiàng)。Pick:將最近裝入編輯窗口的8個(gè)文件列成一個(gè)表讓用戶選擇,

選擇后將該程序裝入編輯區(qū),并將光標(biāo)置在上次修改正的地方。其熱健為Alt-F3。New:新建文件,缺省文件名為NONAME.C,存盤時(shí)可改名。Save:將編輯區(qū)中的文件存盤,假設(shè)文件名是NONAME.C時(shí),將詢問是否更改文件名,其熱鍵為F2。Writeto:可由用戶給出文件名將編輯區(qū)中的文件存盤,假設(shè)該文件已存在,則詢問要不要覆蓋。Directory:顯示目錄及目錄中的文件,并可由用戶選擇。Changedir:顯示當(dāng)前默認(rèn)目錄,用戶可以改變默認(rèn)目錄。Osshell:暫時(shí)退出TurboC2.0到DOS提示符下,

此時(shí)可以運(yùn)行DOS命令,

假設(shè)想回到

TurboC2.0中,只要在DOS狀態(tài)下鍵入EXIT即可。Quit:退出TurboC2.0,返回到DOS操作系統(tǒng)中,其熱鍵為Alt+X。說明:以上各項(xiàng)可用光標(biāo)鍵移動色棒進(jìn)展選擇,回車則執(zhí)行。也可用每一項(xiàng)的第一個(gè)大寫字母直接選擇。假設(shè)要退到主菜單或從它的下一級菜單列表框退回均可用Esc鍵,

TurboC2.0所有菜單均采用這種方法進(jìn)展操作,以下不再說明。Edit菜單按Alt+E可進(jìn)入編輯菜單,假設(shè)再回車,則光標(biāo)出現(xiàn)在編輯窗口,

此時(shí)用戶可以進(jìn)展文本編輯。編輯方法基本與wordstar一樣,可用F1鍵獲得有關(guān)編輯方法的幫助信息。與編輯有關(guān)的功能鍵如下:F1

獲得TurboC2.0編輯命令的幫助信息;F5

擴(kuò)大編輯窗口到整個(gè)屏幕;F6

在編輯窗口與信息窗口之間進(jìn)展切換;F10

從編輯窗口轉(zhuǎn)到主菜單。編輯命令簡介:PageUp

向前翻頁P(yáng)ageDn

向后翻頁Home

將光標(biāo)移到所在行的開場End

將光標(biāo)移到所在行的結(jié)尾Ctrl+Y

刪除光標(biāo)所在的一行Ctrl+T

刪除光標(biāo)所在處的一個(gè)詞Ctrl+KB

設(shè)置塊開場Ctrl+KK

設(shè)置塊結(jié)尾Ctrl+KV

塊移動Ctrl+KC

塊拷貝Ctrl+KY

塊刪除Ctrl+KR

讀文件Ctrl+KW

存文件Ctrl+KP

塊文件打印Ctrl+F1

如果光標(biāo)所在處為TurboC2.0庫函數(shù),則獲得有關(guān)該函數(shù)的幫助信息Ctrl+Q[

查找TurboC2.0雙界符的后匹配符Ctrl+Q]

查找TurboC2.0雙界符的前匹配符說明:TurboC2.0的雙界符包括以下幾種符號:花括符

{和}尖括符

<和>圓括符

(和)方括符

[和]注釋符

/*和*/雙引號

"單引號

'TurboC2.0在編輯文件時(shí)還有一種功能,就是能夠自動縮進(jìn),即光標(biāo)定位和上一個(gè)非空字符對齊。在編輯窗口中,Ctrl+OL為自動縮進(jìn)開關(guān)的控制鍵。Run菜單按Alt+R可進(jìn)入Run菜單,該菜單有以下各項(xiàng),如以以下圖:Run:運(yùn)行由Project/Projectname項(xiàng)指定的文件名或當(dāng)前編輯區(qū)的文件。如果對上次編譯后的源代碼未做過修改,則直接運(yùn)行到下一個(gè)斷點(diǎn)(沒有斷點(diǎn)則運(yùn)行到完畢)。否則先進(jìn)展編譯、連接后才運(yùn)行,其熱鍵為Ctrl+F9。Programreset:中止當(dāng)前的調(diào)試,釋放分給程序的空間,其熱鍵為Ctrl+F2。Gotocursor::調(diào)試程序時(shí)使用,選擇該項(xiàng)可使程序運(yùn)行到光標(biāo)所在行。光標(biāo)所在行必須為一條可執(zhí)行語句,否則提示錯(cuò)誤。其熱鍵為F4。Traceinto:在執(zhí)行一條調(diào)用其它用戶定義的子函數(shù)時(shí),假設(shè)用Traceinto項(xiàng),則執(zhí)行長條將跟蹤到該子函數(shù)內(nèi)部去執(zhí)行,其熱鍵為F7。Stepover:執(zhí)行當(dāng)前函數(shù)的下一條語句,即使用戶函數(shù)調(diào)用,執(zhí)行長條也不會跟蹤進(jìn)函數(shù)內(nèi)部,其熱鍵為F8。Userscreen:顯示程序運(yùn)行時(shí)在屏幕上顯示的結(jié)果。其熱鍵為Alt+F5。Compile菜單按Alt+C可進(jìn)入Compile菜單,該菜單有以下幾個(gè)內(nèi)容,如以以下圖:CompiletoOBJ:將一個(gè)C源文件編譯生成.OBJ目標(biāo)文件,

同時(shí)顯示生成的文件名。其熱鍵為

Alt+F9。MakeEXEfile:此命令生成一個(gè).EXE的文件,并顯示生成的.EXE文件名。其中.EXE文件名是下面幾項(xiàng)之一:由Project/Projectname說明的工程文件名。假設(shè)沒有工程文件名,則由PrimaryCfile說明的源文件。假設(shè)以上兩項(xiàng)都沒有文件名,則為當(dāng)前窗口的文件名。LinkEXEfile:把當(dāng)前.OBJ文件及庫文件連接在一起生成.EXE文件。Buildall:重新編譯工程里的所有文件,并進(jìn)展裝配生成.EXE文件。該命令不作過時(shí)檢查

(上面的幾條命令要作過時(shí)檢查,

即如果目前工程里源文件的日期和時(shí)間與目標(biāo)文件一樣或更早,則拒絕對源文件進(jìn)展編譯)。PrimaryCfile:當(dāng)在該項(xiàng)中指定了主文件后,在以后的編譯中,如沒有工程文件名則編譯此項(xiàng)中規(guī)定的主C文件,如果編譯中有錯(cuò)誤,則將此文件調(diào)入編輯窗口,

不管目前窗口中是不是主C文件。Getinfo:獲得有關(guān)當(dāng)前路徑、源文件名、源文件字節(jié)大小、編譯中的錯(cuò)誤數(shù)目、可用空間等信息,如圖:Project菜單按Alt+P可進(jìn)入Project菜單,該菜單包括以下內(nèi)容,如以以下圖:Projectname:工程名具有.PRJ的擴(kuò)展名,其中包括將要編譯、連接的文件名。例如有一個(gè)程序由file1.c,file2.c,file3.c組成,要將這3個(gè)文件編譯裝配成一個(gè)file.exe的執(zhí)行文件,可以先建設(shè)一個(gè)file.prj的工程文件,其內(nèi)容如下:

file1.c

file2.c

file3.c此時(shí)將file.prj放入Projectname項(xiàng)中,以后進(jìn)展編譯時(shí)將自動對工程文件中規(guī)定的三個(gè)源文件分別進(jìn)展編譯。然后連接成file.exe文件。如果其中有些文件已經(jīng)編譯成.OBJ文件,而又沒有修改正,可直接寫上.OBJ擴(kuò)展名。此時(shí)將不再編譯而只進(jìn)展連接。例如:

file1.objfile2.cfile3.c將不對file1.c進(jìn)展編譯,而直接連接。說明:當(dāng)工程文件中的每個(gè)文件無擴(kuò)展名時(shí),均按源文件對待,另外,其中的文件也可以是庫文件,但必須寫上擴(kuò)展名.LIB。Breakmakeon:由用戶選擇是否在有Warining、Errors、FatalErrors時(shí)或Link之前退出Make編譯。Autodependencies:當(dāng)開關(guān)置為on,編譯時(shí)將檢查源文件與對應(yīng)的.OBJ文件日期和時(shí)間,否則不進(jìn)展檢查。Clearproject:去除Project/Projectname中的工程文件名。Removemessages:把錯(cuò)誤信息從信息窗口中去除掉。Options菜單按Alt+O可進(jìn)入Options菜單,該菜單對初學(xué)者來說要慎重使用,該菜單有以下幾個(gè)內(nèi)容,如以以下圖:Compiler:本項(xiàng)選擇又有許多子菜單,可以讓用戶選擇硬件配置、存儲模型、調(diào)試技術(shù)、代碼優(yōu)化、對話信息控制和宏定義。這些子菜單如以以下圖:Model:共有Tiny,small,medium,compact,large,huge六種不同模式可由同戶選擇。Define:翻開一個(gè)宏定義框,同戶可輸入宏定義。多重定義可同分號,賦值可用等號。Codegeneration:它又有許多任選項(xiàng),這些任選項(xiàng)告訴編譯器產(chǎn)生什么樣的目標(biāo)代碼。Callingconvention

可選擇C或Pascal方式傳遞參數(shù)。Instructionset

可選擇8088/8086或80186/80286指令系列。Floatingpoint

可選擇仿真浮點(diǎn)、數(shù)學(xué)協(xié)處理器浮點(diǎn)或無浮點(diǎn)運(yùn)算。Defaultchartype

規(guī)定char的類型。Alignonent

規(guī)定地址對準(zhǔn)原則。Mergeduplicatestrings作優(yōu)化用,將重復(fù)的字符串合并在一起。Standardstackframe產(chǎn)生一個(gè)標(biāo)準(zhǔn)的棧構(gòu)造。Teststackoverflow產(chǎn)生一段程序運(yùn)行時(shí)檢測堆棧溢出的代碼。Linenumber

在.OBJ文件中放進(jìn)展號以供調(diào)試時(shí)用。OBJdebuginformation在.OBJ文件中產(chǎn)生調(diào)試信息。Optimization:它又有許多任選項(xiàng)。Optimizefor選擇是對程序小型化還是對程序速度進(jìn)展優(yōu)化處理。Useregistervariable

用來選擇是否允許使用存放器變量。Registeroptimization盡可能使用存放器變量以減少過多的取數(shù)操作。Jumpoptimization通過去除多余的跳轉(zhuǎn)和調(diào)整循環(huán)與開關(guān)語句的方法,壓縮代碼。Source:它又有許多任選項(xiàng)。Indentifierlength說明標(biāo)識符有效字符的個(gè)數(shù),默認(rèn)為32個(gè)。Nestedcomments是否允許嵌套注釋。ANSIkeywordsonly是只允許ANSI關(guān)鍵字還是也允許TurboC2.0關(guān)鍵字。ErrorErrorstopafter多少個(gè)錯(cuò)誤時(shí)停頓編譯,默認(rèn)為25個(gè)。Warningstopafter多少個(gè)警告錯(cuò)誤時(shí)停頓編譯,默認(rèn)為100個(gè)。DisplaywarningPortabilitywarning移植性警告錯(cuò)誤。ANSIViolations侵犯了ANSI關(guān)鍵字的警告錯(cuò)誤。Commonerror常見的警告錯(cuò)誤。Lesscommonerror少見的警告錯(cuò)誤。Names

:用于改變段(segment)、組(group)和類(class)的名字,默認(rèn)值為CODE,DATA,BSS。Linker:本菜單設(shè)置有關(guān)連接的選擇項(xiàng),它有以下內(nèi)容,如以以下圖:Mapfilemenu

選擇是否產(chǎn)生.MAP文件。Initializesegments是否在連接時(shí)初始化沒有初始化的段。Devaultlibraries是否在連接其它編譯程序產(chǎn)生的目標(biāo)文件時(shí)去尋找其缺省庫。Graphicslibrary

是否連接graphics庫中的函數(shù)。Warnduplicatesymbols當(dāng)有重復(fù)符號時(shí)產(chǎn)生警告信息。Stackwarinig是否讓連接程序產(chǎn)生Nostack的警告信息。Case-sensitivelink是否區(qū)分大、小寫字。Environment:菜單規(guī)定是否對某些文件自動存盤及制表鍵和屏幕大小的設(shè)置,它有以下內(nèi)容,如以以下圖:Messagetracking:Currentfile

跟蹤在編輯窗口中的文件錯(cuò)誤。Allfiles跟蹤所有文件錯(cuò)誤。Off

不跟蹤。Keepmessage

:編譯前是否去除Message窗口中的信息。Configautosave:選on時(shí),在Run,Shell或退出集成開發(fā)環(huán)境之前,如果TurboC2.0的配置被改正,

則所做的改動將存入配置文件中。選off時(shí)不存。Editautosave:是否在Run或Shell之前,自動存儲編輯的源文件。Backupfile:是否在源文件存盤時(shí)產(chǎn)生后備文件(.BAK文件)。Tabsize:設(shè)置制表鍵大小,默認(rèn)為8。Zoomedwindows:將現(xiàn)行活動窗口放大到整個(gè)屏幕,其熱鍵為F5。Screensize設(shè)置屏幕文本大小。Directories:規(guī)定編譯、連接所需文件的路徑,有以下各項(xiàng),如以以下圖:Includedirectories:包含文件的路徑,多個(gè)子目錄用";"分開。Librarydirectories:庫文件路徑,多個(gè)子目錄用";"分開。Outputdirectoried:輸出文件(.OBJ,.EXE,.MAP文件)的目錄。TurboCdirectoried:TurboC所在的目錄。Pickfilename:定義加載的pick文件名,

如不定義則從currentpickfile中取。Arguments:允許用戶使用命令行參數(shù)。Saveoptions:保存所有選擇的編譯、連接、調(diào)試和工程到配置文件中,缺省的配置文件為TCCONFIG.TC。Retriveoptions裝入一個(gè)配置文件到TC中,TC將使用該文件的選擇項(xiàng)。Debug菜單按Alt+D可選擇Debug菜單,該菜單主要用于查錯(cuò),它包括以下內(nèi)容,如以以下圖:EvaluateExpression要計(jì)算結(jié)果的表達(dá)式。Result顯示表達(dá)式的計(jì)算結(jié)果。Newvalue賦給新值。Callstack:該項(xiàng)不可接觸。而在TurboCdebuger時(shí)用于檢查堆棧情況。Findfunction在運(yùn)行TurboCdebugger時(shí)用于顯示規(guī)定的函數(shù)。Refreshdisplay如果編輯窗口偶然被用戶窗口重寫了可用此恢復(fù)編輯窗口的內(nèi)容。Break/watch菜單按Alt+B可進(jìn)入Break/watch菜單,該菜單有以下內(nèi)容,如以以下圖:Addwatch:向監(jiān)視窗口插入一監(jiān)視表達(dá)式。Deletewatch:從監(jiān)視窗口中刪除當(dāng)前的監(jiān)視表達(dá)式。Editwatch:在監(jiān)視窗口中編輯一個(gè)監(jiān)視表達(dá)式。Removeall:watches從監(jiān)視窗口中刪除所有的監(jiān)視表達(dá)式。Togglebreakpoint:對光標(biāo)所在的行設(shè)置或去除斷點(diǎn)。Clearallbreakpoints:去除所有斷點(diǎn)。Viewnextbreakpoint:將光標(biāo)移動到下一個(gè)斷點(diǎn)處。TurboC2.0的配置文件所謂配置文件是包含TurboC2.0有關(guān)信息的文件,其中存有編譯、連接的選擇和路徑等信息??梢杂孟率龇椒ńㄔO(shè)TurboC2.0的配置:建設(shè)用戶自命名的配置文件:可以從Options菜單中選擇Options/Saveoptions命令,

將當(dāng)前集成開發(fā)環(huán)境的所有配置存入一個(gè)由用戶命名的配置文件中。下次啟動TC時(shí)只要在DOS下鍵入:tc/c<用戶命名的配置文件名>就會按這個(gè)配置文件中的內(nèi)容作為TurboC2.0的選擇。假設(shè)設(shè)置Options/Environment/Configautosave為on,則退出集成開發(fā)環(huán)境時(shí),當(dāng)前的設(shè)置會自動存放到TurboC2.0配置文件TCCONFIG.TC中。TurboC在啟動時(shí)會自動尋找這個(gè)配置文件。用TCINST設(shè)置TurboC的有關(guān)配置,并將結(jié)果存入TC.EXE中。TurboC在啟動時(shí),假設(shè)沒有找到配置文件,則取TC.EXE中的缺省值。TOC\o"1-3"\h\z13文件113.1C文件概述113.2文件指針213.3文件的翻開與關(guān)閉213.3.1文件的翻開(fopen函數(shù))213.3.2文件關(guān)閉函數(shù)〔fclose函數(shù)〕413.4文件的讀寫413.4.1字符讀寫函數(shù)fgetc和fputc413.4.2字符串讀寫函數(shù)fgets和fputs813.4.3數(shù)據(jù)塊讀寫函數(shù)fread和fwtrite913.4.4格式化讀寫函數(shù)fscanf和fprintf1113.5文件的隨機(jī)讀寫1213.5.1文件定位1213.5.2文件的隨機(jī)讀寫1313.6文件檢測函數(shù)1413.6.1文件完畢檢測函數(shù)feof函數(shù)1413.6.2讀寫文件出錯(cuò)檢測函數(shù)1413.6.3文件出錯(cuò)標(biāo)志和文件完畢標(biāo)志置0函數(shù)1413.7C庫文件1413.8本章小結(jié)15文件C文件概述所謂“文件〞是指一組相關(guān)數(shù)據(jù)的有序集合。這個(gè)數(shù)據(jù)集有一個(gè)名稱,叫做文件名。實(shí)際上在前面的各章中我們已經(jīng)屢次使用了文件,例如源程序文件、目標(biāo)文件、可執(zhí)行文件、庫文件(頭文件)等。文件通常是駐留在外部介質(zhì)(如磁盤等)上的,在使用時(shí)才調(diào)入內(nèi)存中來。從不同的角度可對文件作不同的分類。從用戶的角度看,文件可分為普通文件和設(shè)備文件兩種。普通文件是指駐留在磁盤或其它外部介質(zhì)上的一個(gè)有序數(shù)據(jù)集,可以是源文件、目標(biāo)文件、可執(zhí)行程序;也可以是一組待輸入處理的原始數(shù)據(jù),或者是一組輸出的結(jié)果。對于源文件、目標(biāo)文件、可執(zhí)行程序可以稱作程序文件,對輸入輸出數(shù)據(jù)可稱作數(shù)據(jù)文件。設(shè)備文件是指與主機(jī)相聯(lián)的各種外部設(shè)備,如顯示器、打印機(jī)、鍵盤等。在操作系統(tǒng)中,把外部設(shè)備也看作是一個(gè)文件來進(jìn)展管理,把它們的輸入、輸出等同于對磁盤文件的讀和寫。通常把顯示器定義為標(biāo)準(zhǔn)輸出文件,一般情況下在屏幕上顯示有關(guān)信息就是向標(biāo)準(zhǔn)輸出文件輸出。如前面經(jīng)常使用的printf,putchar函數(shù)就是這類輸出。鍵盤通常被指定標(biāo)準(zhǔn)的輸入文件,從鍵盤上輸入就意味著從標(biāo)準(zhǔn)輸入文件上輸入數(shù)據(jù)。scanf,getchar函數(shù)就屬于這類輸入。從文件編碼的方式來看,文件可分為ASCII碼文件和二進(jìn)制碼文件兩種。ASCII文件也稱為文本文件,這種文件在磁盤中存放時(shí)每個(gè)字符對應(yīng)一個(gè)字節(jié),用于存放對應(yīng)的ASCII碼。例如,數(shù)5678的存儲形式為:ASCII碼:00110101001101100011011100111000↓↓↓↓十進(jìn)制碼:5678共占用4個(gè)字節(jié)。ASCII碼文件可在屏幕上按字符顯示,例如源程序文件就是ASCII文件,用DOS命令TYPE可顯示文件的內(nèi)容。由于是按字符顯示,因此能讀懂文件內(nèi)容。二進(jìn)制文件是按二進(jìn)制的編碼方式來存放文件的。例如,數(shù)5678的存儲形式為:0001011000101110只占二個(gè)字節(jié)。二進(jìn)制文件雖然也可在屏幕上顯示,但其內(nèi)容無法讀懂。C系統(tǒng)在處理這些文件時(shí),并不區(qū)分類型,都看成是字符流,按字節(jié)進(jìn)展處理。輸入輸出字符流的開場和完畢只由程序控制而不受物理符號(如回車符)的控制。因此也把這種文件稱作“流式文件〞。本章討論流式文件的翻開、關(guān)閉、讀、寫、定位等各種操作。文件指針在C語言中用一個(gè)指針變量指向一個(gè)文件,這個(gè)指針稱為文件指針。通過文件指針就可對它所指的文件進(jìn)展各種操作。定義說明文件指針的一般形式為:FILE*指針變量標(biāo)識符;其中FILE應(yīng)為大寫,它實(shí)際上是由系統(tǒng)定義的一個(gè)構(gòu)造,該構(gòu)造中含有文件名、文件狀態(tài)和文件當(dāng)前位置等信息。在編寫源程序時(shí)不必關(guān)心FILE構(gòu)造的細(xì)節(jié)。例如:FILE*fp;表示fp是指向FILE構(gòu)造的指針變量,通過fp即可找存放某個(gè)文件信息的構(gòu)造變量,然后按構(gòu)造變量提供的信息找到該文件,實(shí)施對文件的操作。習(xí)慣上也籠統(tǒng)地把fp稱為指向一個(gè)文件的指針。文件的翻開與關(guān)閉文件在進(jìn)展讀寫操作之前要先翻開,使用完畢要關(guān)閉。所謂翻開文件,實(shí)際上是建設(shè)文件的各種有關(guān)信息,并使文件指針指向該文件,以便進(jìn)展其它操作。關(guān)閉文件則斷開指針與文件之間的聯(lián)系,也就制止再對該文件進(jìn)展操作。在C語言中,文件操作都是由庫函數(shù)來完成的。在本章內(nèi)將介紹主要的文件操作函數(shù)。文件的翻開(fopen函數(shù))fopen函數(shù)用來翻開一個(gè)文件,其調(diào)用的一般形式為:文件指針名=fopen(文件名,使用文件方式);其中,“文件指針名〞必須是被說明為FILE類型的指針變量;“文件名〞是被翻開文件的文件名;“使用文件方式〞是指文件的類型和操作要求?!拔募暿亲址A炕蜃址?dāng)?shù)組。例如:FILE*fp;fp=("filea","r");其意義是在當(dāng)前目錄下翻開文件filea,只允許進(jìn)展“讀〞操作,并使fp指向該文件。又如:FILE*fphzkfphzk=("c:\\hzk16","rb")其意義是翻開C驅(qū)動器磁盤的根目錄下的文件hzk16,這是一個(gè)二進(jìn)制文件,只允許按二進(jìn)制方式進(jìn)展讀操作。兩個(gè)反斜線“\\〞中的第一個(gè)表示轉(zhuǎn)義字符,第二個(gè)表示根目錄。使用文件的方式共有12種,下面給出了它們的符號和意義。文件使用方式意義“rt〞只讀翻開一個(gè)文本文件,只允許讀數(shù)據(jù)“wt〞只寫翻開或建設(shè)一個(gè)文本文件,只允許寫數(shù)據(jù)“at〞追加翻開一個(gè)文本文件,并在文件末尾寫數(shù)據(jù)“rb〞只讀翻開一個(gè)二進(jìn)制文件,只允許讀數(shù)據(jù)“wb〞只寫翻開或建設(shè)一個(gè)二進(jìn)制文件,只允許寫數(shù)據(jù)“ab〞追加翻開一個(gè)二進(jìn)制文件,并在文件末尾寫數(shù)據(jù)“rt+〞讀寫翻開一個(gè)文本文件,允許讀和寫“wt+〞讀寫翻開或建設(shè)一個(gè)文本文件,允許讀寫“at+〞讀寫翻開一個(gè)文本文件,允許讀,或在文件末追加數(shù)據(jù)“rb+〞讀寫翻開一個(gè)二進(jìn)制文件,允許讀和寫“wb+〞讀寫翻開或建設(shè)一個(gè)二進(jìn)制文件,允許讀和寫“ab+〞讀寫翻開一個(gè)二進(jìn)制文件,允許讀,或在文件末追加數(shù)據(jù)對于文件使用方式有以下幾點(diǎn)說明:文件使用方式由r,w,a,t,b,+六個(gè)字符拼成,各字符的含義是:r(read):讀w(write):寫a(append):追加t(text):文本文件,可省略不寫b(banary):二進(jìn)制文件+:讀和寫凡用“r〞翻開一個(gè)文件時(shí),該文件必須已經(jīng)存在,且只能從該文件讀出。用“w〞翻開的文件只能向該文件寫入。假設(shè)翻開的文件不存在,則以指定的文件名建設(shè)該文件,假設(shè)翻開的文件已經(jīng)存在,則將該文件刪去,重建一個(gè)新文件。假設(shè)要向一個(gè)已存在的文件追加新的信息,只能用“a〞方式翻開文件。但此時(shí)該文件必須是存在的,否則將會出錯(cuò)。在翻開一個(gè)文件時(shí),如果出錯(cuò),fopen將返回一個(gè)空指針值NULL。在程序中可以用這一信息來判別是否完成翻開文件的工作,并作相應(yīng)的處理。因此常用以下程序段翻開文件:if((fp=fopen("c:\\hzk16","rb")==NULL){printf("\nerroronopenc:\\hzk16file!");getch();exit(1);}這段程序的意義是,如果返回的指針為空,表示不能翻開C盤根目錄下的hzk16文件,則給出提示信息“erroronopenc:\hzk16file!〞,下一行g(shù)etch()的功能是從鍵盤輸入一個(gè)字符,但不在屏幕上顯示。在這里,該行的作用是等待,只有當(dāng)用戶從鍵盤敲任一鍵時(shí),程序才繼續(xù)執(zhí)行,因此用戶可利用這個(gè)等待時(shí)間閱讀出錯(cuò)提示。敲鍵后執(zhí)行exit(1)退出程序。把一個(gè)文本文件讀入內(nèi)存時(shí),要將ASCII碼轉(zhuǎn)換成二進(jìn)制碼,而把文件以文本方式寫入磁盤時(shí),也要把二進(jìn)制碼轉(zhuǎn)換成ASCII碼,因此文本文件的讀寫要花費(fèi)較多的轉(zhuǎn)換時(shí)間。對二進(jìn)制文件的讀寫不存在這種轉(zhuǎn)換。標(biāo)準(zhǔn)輸入文件(鍵盤),標(biāo)準(zhǔn)輸出文件(顯示器),標(biāo)準(zhǔn)出錯(cuò)輸出(出錯(cuò)信息)是由系統(tǒng)翻開的,可直接使用。文件關(guān)閉函數(shù)〔fclose函數(shù)〕文件一旦使用完畢,應(yīng)用關(guān)閉文件函數(shù)把文件關(guān)閉,以防止文件的數(shù)據(jù)喪失等錯(cuò)誤。fclose函數(shù)調(diào)用的一般形式是:fclose(文件指針);例如:fclose(fp);正常完成關(guān)閉文件操作時(shí),fclose函數(shù)返回值為0。如返回非零值則表示有錯(cuò)誤發(fā)生。文件的讀寫對文件的讀和寫是最常用的文件操作。在C語言中提供了多種文件讀寫的函數(shù):·字符讀寫函數(shù):fgetc和fputc·字符串讀寫函數(shù):fgets和fputs·數(shù)據(jù)塊讀寫函數(shù):freed和fwrite·格式化讀寫函數(shù):fscanf和fprinf下面分別予以介紹。使用以上函數(shù)都要求包含頭文件stdio.h。字符讀寫函數(shù)fgetc和fputc字符讀寫函數(shù)是以字符(字節(jié))為單位的讀寫函數(shù)。每次可從文件讀出或向文件寫入一個(gè)字符。讀字符函數(shù)fgetcfgetc函數(shù)的功能是從指定的文件中讀一個(gè)字符,函數(shù)調(diào)用的形式為:字符變量=fgetc(文件指針);例如:ch=fgetc(fp);其意義是從翻開的文件fp中讀取一個(gè)字符并送入ch中。對于fgetc函數(shù)的使用有以下幾點(diǎn)說明:在fgetc函數(shù)調(diào)用中,讀取的文件必須是以讀或讀寫方式翻開的。讀取字符的結(jié)果也可以不向字符變量賦值,例如:fgetc(fp);但是讀出的字符不能保存。在文件內(nèi)部有一個(gè)位置指針。用來指向文件的當(dāng)前讀寫字節(jié)。在文件翻開時(shí),該指針總是指向文件的第一個(gè)字節(jié)。使用fgetc函數(shù)后,該位置指針將向后移動一個(gè)字節(jié)。因此可連續(xù)屢次使用fgetc函數(shù),讀取多個(gè)字符。應(yīng)注意文件指針和文件內(nèi)部的位置指針不是一回事。文件指針是指向整個(gè)文件的,須在程序中定義說明,只要不重新賦值,文件指針的值是不變的。文件內(nèi)部的位置指針用以指示文件內(nèi)部的當(dāng)前讀寫位置,每讀寫一次,該指針均向后移動,它不需在程序中定義說明,而是由系統(tǒng)自動設(shè)置的?!纠?3.1】讀入文件c1.doc,在屏幕上輸出。#include<stdio.h>main(){FILE*fp;charch;if((fp=fopen("d:\\jrzh\\example\\c1.txt","rt"))==NULL){printf("\nCannotopenfilestrikeanykeyexit!");getch();exit(1);}ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp);}本例程序的功能是從文件中逐個(gè)讀取字符,在屏幕上顯示。程序定義了文件指針fp,以讀文本文件方式翻開文件“d:\\jrzh\\example\\ex1_1.c〞,并使fp指向該文件。如翻開文件出錯(cuò),給出提示并退出程序。程序第12行先讀出一個(gè)字符,然后進(jìn)入循環(huán),只要讀出的字符不是文件完畢標(biāo)志(每個(gè)文件末有一完畢標(biāo)志EOF)就把該字符顯示在屏幕上,再讀入下一字符。每讀一次,文件內(nèi)部的位置指針向后移動一個(gè)字符,文件完畢時(shí),該指針指向EOF。執(zhí)行本程序?qū)@示整個(gè)文件。寫字符函數(shù)fputcfputc函數(shù)的功能是把一個(gè)字符寫入指定的文件中,函數(shù)調(diào)用的形式為:fputc(字符量,文件指針);其中,待寫入的字符量可以是字符常量或變量,例如:fputc('a',fp);其意義是把字符a寫入fp所指向的文件中。對于fputc函數(shù)的使用也要說明幾點(diǎn):被寫入的文件可以用寫、讀寫、追加方式翻開,用寫或讀寫方式翻開一個(gè)已存在的文件時(shí)將去除原有的文件內(nèi)容,寫入字符從文件首開場。如需保存原有文件內(nèi)容,希望寫入的字符以文件末開場存放,必須以追加方式翻開文件。被寫入的文件假設(shè)不存在,則創(chuàng)立該文件。每寫入一個(gè)字符,文件內(nèi)部位置指針向后移動一個(gè)字節(jié)。fputc函數(shù)有一個(gè)返回值,如寫入成功則返回寫入的字符,否則返回一個(gè)EOF??捎么藖砼袛鄬懭胧欠癯晒??!纠?3.2】從鍵盤輸入一行字符,寫入一個(gè)文件,再把該文件內(nèi)容讀出顯示在屏幕上。#include<stdio.h>main(){FILE*fp;charch;if((fp=fopen("d:\\jrzh\\example\\string","wt+"))==NULL){printf("Cannotopenfilestrikeanykeyexit!");getch();exit(1);}printf("inputastring:\n");ch=getchar();while(ch!='\n'){fputc(ch,fp);ch=getchar();}rewind(fp);ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}printf("\n");fclose(fp);}程序中第6行以讀寫文本文件方式翻開文件string。程序第13行從鍵盤讀入一個(gè)字符后進(jìn)入循環(huán),當(dāng)讀入字符不為回車符時(shí),則把該字符寫入文件之中,然后繼續(xù)從鍵盤讀入下一字符。每輸入一個(gè)字符,文件內(nèi)部位置指針向后移動一個(gè)字節(jié)。寫入完畢,該指針已指向文件末。如要把文件從頭讀出,須把指針移向文件頭,程序第19行rewind函數(shù)用于把fp所指文件的內(nèi)部位置指針移到文件頭。第20至25行用于讀出文件中的一行內(nèi)容。【例13.3】把命令行參數(shù)中的前一個(gè)文件名標(biāo)識的文件,復(fù)制到后一個(gè)文件名標(biāo)識的文件中,如命令行中只有一個(gè)文件名則把該文件寫到標(biāo)準(zhǔn)輸出文件(顯示器)中。#include<stdio.h>main(intargc,char*argv[]){FILE*fp1,*fp2;charch;if(argc==1){printf("havenotenterfilenamestrikeanykeyexit");getch();exit(0);}if((fp1=fopen(argv[1],"rt"))==NULL){printf("Cannotopen%s\n",argv[1]);getch();exit(1);}if(argc==2)fp2=stdout;elseif((fp2=fopen(argv[2],"wt+"))==NULL){printf("Cannotopen%s\n",argv[1]);getch();exit(1);}while((ch=fgetc(fp1))!=EOF)fputc(ch,fp2);fclose(fp1);fclose(fp2);}本程序?yàn)閹⒌膍ain函數(shù)。程序中定義了兩個(gè)文件指針fp1和fp2,分別指向命令行參數(shù)中給出的文件。如命令行參數(shù)中沒有給出文件名,則給出提示信息。程序第18行表示如果只給出一個(gè)文件名,則使fp2指向標(biāo)準(zhǔn)輸出文件(即顯示器)。程序第25行至28行用循環(huán)語句逐個(gè)讀出文件1中的字符再送到文件2中。再次運(yùn)行時(shí),給出了一個(gè)文件名,故輸出給標(biāo)準(zhǔn)輸出文件stdout,即在顯示器上顯示文件內(nèi)容。第三次運(yùn)行,給出了二個(gè)文件名,因此把string中的內(nèi)容讀出,寫入到OK之中??捎肈OS命令type顯示OK的內(nèi)容。字符串讀寫函數(shù)fgets和fputs讀字符串函數(shù)fgets函數(shù)的功能是從指定的文件中讀一個(gè)字符串到字符數(shù)組中,函數(shù)調(diào)用的形式為:fgets(字符數(shù)組名,n,文件指針);其中的n是一個(gè)正整數(shù)。表示從文件中讀出的字符串不超過n-1個(gè)字符。在讀入的最后一個(gè)字符后加上串完畢標(biāo)志'\0'。例如:fgets(str,n,fp);的意義是從fp所指的文件中讀出n-1個(gè)字符送入字符數(shù)組str中?!纠?3.4】從string文件中讀入一個(gè)含10個(gè)字符的字符串。#include<stdio.h>main(){FILE*fp;charstr[11];if((fp=fopen("d:\\jrzh\\example\\string","rt"))==NULL){printf("\nCannotopenfilestrikeanykeyexit!");getch();exit(1);}fgets(str,11,fp);printf("\n%s\n",str);fclose(fp);}本例定義了一個(gè)字符數(shù)組str共11個(gè)字節(jié),在以讀文本文件方式翻開文件string后,從中讀出10個(gè)字符送入str數(shù)組,在數(shù)組最后一個(gè)單元內(nèi)將加上'\0',然后在屏幕上顯示輸出str數(shù)組。輸出的十個(gè)字符正是例13.1程序的前十個(gè)字符。對fgets函數(shù)有兩點(diǎn)說明:在讀出n-1個(gè)字符之前,如遇到了換行符或EOF,則讀出完畢。fgets函數(shù)也有返回值,其返回值是字符數(shù)組的首地址。寫字符串函數(shù)fputsfputs函數(shù)的功能是向指定的文件寫入一個(gè)字符串,其調(diào)用形式為:fputs(字符串,文件指針);其中字符串可以是字符串常量,也可以是字符數(shù)組名,或指針變量,例如:fputs(“abcd“,fp);其意義是把字符串“abcd〞寫入fp所指的文件之中。【例13.5】在例13.2中建設(shè)的文件string中追加一個(gè)字符串。#include<stdio.h>main(){FILE*fp;charch,st[20];if((fp=fopen("string","at+"))==NULL){printf("Cannotopenfilestrikeanykeyexit!");getch();exit(1);}printf("inputastring:\n");scanf("%s",st);fputs(st,fp);rewind(fp);ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}printf("\n");fclose(fp);}本例要求在string文件末加寫字符串,因此,在程序第6行以追加讀寫文本文件的方式翻開文件string。然后輸入字符串,并用fputs函數(shù)把該串寫入文件string。在程序15行用rewind函數(shù)把文件內(nèi)部位置指針移到文件首。再進(jìn)入循環(huán)逐個(gè)顯示當(dāng)前文件中的全部內(nèi)容。數(shù)據(jù)塊讀寫函數(shù)fread和fwtriteC語言還提供了用于整塊數(shù)據(jù)的讀寫函數(shù)??捎脕碜x寫一組數(shù)據(jù),如一個(gè)數(shù)組元素,一個(gè)構(gòu)造變量的值等。讀數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:fread(buffer,size,count,fp);寫數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:fwrite(buffer,size,count,fp);其中:buffer是一個(gè)指針,在fread函數(shù)中,它表示存放輸入數(shù)據(jù)的首地址。在fwrite函數(shù)中,它表示存放輸出數(shù)據(jù)的首地址。size表示數(shù)據(jù)塊的字節(jié)數(shù)。count表示要讀寫的數(shù)據(jù)塊塊數(shù)。fp表示文件指針。例如:fread(fa,4,5,fp);其意義是從fp所指的文件中,每次讀4個(gè)字節(jié)(一個(gè)實(shí)數(shù))送入實(shí)數(shù)組fa中,連續(xù)讀5次,即讀5個(gè)實(shí)數(shù)到fa中?!纠?3.6】從鍵盤輸入兩個(gè)學(xué)生數(shù)據(jù),寫入一個(gè)文件中,再讀出這兩個(gè)學(xué)生的數(shù)據(jù)顯示在屏幕上。#include<stdio.h>structstu{charname[10];intnum;intage;charaddr[15];}boya[2],boyb[2],*pp,*qq;main(){FILE*fp;charch;inti;pp=boya;qq=boyb;if((fp=fopen("d:\\jrzh\\example\\stu_list","wb+"))==NULL){printf("Cannotopenfilestrikeanykeyexit!");getch();exit(1);}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;fwrite(pp,sizeof(structstu),2,fp);rewind(fp);fread(qq,sizeof(structstu),2,fp);printf("\n\nname\tnumberageaddr\n");for(i=0;i<2;i++,qq++)printf("%s\t%5d%7d%s\n",qq->name,qq->num,qq->age,qq->addr);fclose(fp);}本例程序定義了一個(gè)構(gòu)造stu,說明了兩個(gè)構(gòu)造數(shù)組boya和boyb以及兩個(gè)構(gòu)造指針變量pp和qq。pp指向boya,qq指向boyb。程序第16行以讀寫方式翻開二進(jìn)制文件“stu_list〞,輸入二個(gè)學(xué)生數(shù)據(jù)之后,寫入該文件中,然后把文件內(nèi)部位置指針移到文件首,讀出兩塊學(xué)生數(shù)據(jù)后,在屏幕上顯示。格式化讀寫函數(shù)fscanf和fprintffscanf函數(shù),fprintf函數(shù)與前面使用的scanf和printf函數(shù)的功能相似,都是格式化讀寫函數(shù)。兩者的區(qū)別在于fscanf函數(shù)和fprintf函數(shù)的讀寫對象不是鍵盤和顯示器,而是磁盤文件。這兩個(gè)函數(shù)的調(diào)用格式為:fscanf(文件指針,格式字符串,輸入表列);fprintf(文件指針,格式字符串,輸出表列);例如:fscanf(fp,"%d%s",&i,s);fprintf(fp,"%d%c",j,ch);用fscanf和fprintf函數(shù)也可以完成例10.6的問題。修改后的程序如例10.7所示?!纠?3.7】用fscanf和fprintf函數(shù)成例10.6的問題。#include<stdio.h>structstu{charname[10];intnum;intage;charaddr[15];}boya[2],boyb[2],*pp,*qq;main(){FILE*fp;charch;inti;pp=boya;qq=boyb;if((fp=fopen("stu_list","wb+"))==NULL){printf("Cannotopenfilestrikeanykeyexit!");getch();exit(1);}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);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);}與例10.6相比,本程序中fscanf和fprintf函數(shù)每次只能讀寫一個(gè)構(gòu)造數(shù)組元素,因此采用了循環(huán)語句來讀寫全部數(shù)組元素。還要注意指針變量pp,qq由于循環(huán)改變了它們的值,因此在程序的25和32行分別對它們重新賦予了數(shù)組的首地址。文件的隨機(jī)讀寫前面介紹的對文件的讀寫方式都是順序讀寫,即讀寫文件只能從頭開場,順序讀寫各個(gè)數(shù)據(jù)。但在實(shí)際問題中常要求只讀寫文件中某一指定的局部。為了解決這個(gè)問題可移動文件內(nèi)部的位置指針到需要讀寫的位置,再進(jìn)展讀寫,這種讀寫稱為隨機(jī)讀寫。實(shí)現(xiàn)隨機(jī)讀寫的關(guān)鍵是要按要求移動位置指針,這稱為文件的定位。文件定位移動文件內(nèi)部位置指針的函數(shù)主要有兩個(gè),即rewind函數(shù)和fseek函數(shù)。rewind函數(shù)前面已屢次使用過,其調(diào)用形式為:rewind(文件指針);它的功能是把文件內(nèi)部的位置指針移到文件首。下面主要介紹fseek函數(shù)。fseek函數(shù)用來移動文件內(nèi)部位置指針,其調(diào)用形式為:fseek(文件指針,位移量,起始點(diǎn));其中:“文件指針〞指向被移動的文件?!拔灰屏卡暠硎疽苿拥淖止?jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長度大于64KB時(shí)不會出錯(cuò)。當(dāng)用常量表示位移量時(shí),要求加后綴“L〞?!捌鹗键c(diǎn)〞表示從何處開場計(jì)算位移量,規(guī)定的起始點(diǎn)有三種:文件首,當(dāng)前位置和文件尾。其表示方法如下表。起始點(diǎn)表示符號數(shù)字表示文件首SEEK_SET0當(dāng)前位置SEEK_CUR1文件末尾SEEK_END2例如:fseek(fp,100L,0);其意義是把位置指針移到離文件首100個(gè)字節(jié)處。還要說明的是fseek函數(shù)一般用于二進(jìn)制文件。在文本文件中由于要進(jìn)展轉(zhuǎn)換,故往往計(jì)算的位置會出現(xiàn)錯(cuò)誤。文件的隨機(jī)讀寫在移動位置指針之后,即可用前面介紹的任一種讀寫函數(shù)進(jìn)展讀寫。由于一般是讀寫一個(gè)數(shù)據(jù)據(jù)塊,因此常用fread和fwrite函數(shù)。下面用例題來說明文件的隨機(jī)讀寫。【例13.8】在學(xué)生文件stu_list中讀出第二個(gè)學(xué)生的數(shù)據(jù)。#include<stdio.h>structstu{charname[10];intnum;intage;charaddr[15];}boy,*qq;main(){FILE*fp;charch;inti=1;qq=&boy;if((fp=fopen("stu_list","rb"))==NULL){printf("Cannotopenfilestrikeanykeyexit!");getch();exit(1);}rewind(fp);fseek(fp,i*sizeof(structstu),0);fread(qq,sizeof(structstu),1,fp);printf("\n\nname\tnumberageaddr\n");printf("%s\t%5d%7d%s\n",qq->name,qq->num,qq->age,qq->addr);}文件stu_list已由例13.6的程序建設(shè),本程序用隨機(jī)讀出的方法讀出第二個(gè)學(xué)生的數(shù)據(jù)。程序中定義boy為stu類型變量,qq為指向boy的指針。以讀二進(jìn)制文件方式翻開文件,程序第22行移動文件位置指針。其中的i值為1,表示從文件頭開場,移動一個(gè)stu類型的長度,然后再讀出的數(shù)據(jù)即為第二個(gè)學(xué)生的數(shù)據(jù)。文件檢測函數(shù)C語言中常用的文件檢測函數(shù)有以下幾個(gè)。文件完畢檢測函數(shù)feof函數(shù)調(diào)用格式:feof(文件指針);功能:判斷文件是否處于文件完畢位置,如文件完畢,則返回值為1,否則為0。讀寫文件出錯(cuò)檢測函數(shù)ferror函數(shù)調(diào)用格式:ferror(文件指針);功能:檢查文件在用各種輸入輸出函數(shù)進(jìn)展讀寫時(shí)是否出錯(cuò)。如ferror返回值為0表示未出錯(cuò),否則表示有錯(cuò)。文件出錯(cuò)標(biāo)志和文件完畢標(biāo)志置0函數(shù)clearerr函數(shù)調(diào)用格式:clearerr(文件指針);功能:本函數(shù)用于去除出錯(cuò)標(biāo)志和文件完畢標(biāo)志,使它們?yōu)?值。C庫文件C系統(tǒng)提供了豐富的系統(tǒng)文件,稱為庫文件,C的庫文件分為兩類,一類是擴(kuò)展名為".h"的文件,稱為頭文件,在前面的包含命令中我們已屢次使用過。在".h"文件中包含了常量定義、類型定義、宏定義、函數(shù)原型以及各種編譯選擇設(shè)置等信息。另一類是函數(shù)庫,包括了各種函數(shù)的目標(biāo)代碼,供用戶在程序中調(diào)用。通常在程序中調(diào)用一個(gè)庫函數(shù)時(shí),要在調(diào)用之前包含該函數(shù)原型所在的".h"文件。下面給出TurboC的全部".h"文件。TurboC頭文件ALLOC.H說明內(nèi)存管理函數(shù)(分配、釋放等)。ASSERT.H定義assert調(diào)試宏。BIOS.H說明調(diào)用IBM—PCROMBIOS子程序的各個(gè)函數(shù)。CONIO.H說明調(diào)用DOS控制臺I/O子程序的各個(gè)函數(shù)。CTYPE.H包含有關(guān)字符分類及轉(zhuǎn)換的名類信息(如isalpha和toascii等)。DIR.H包含有關(guān)目錄和路徑的構(gòu)造、宏定義和函數(shù)。DOS.H定義和說明MSDOS和8086調(diào)用的一些常量和函數(shù)。ERRON.H定義錯(cuò)誤代碼的助記符。FCNTL.H定義在與open庫子程序連接時(shí)的符號常量。FLOAT.H包含有關(guān)浮點(diǎn)運(yùn)算的一些參數(shù)和函數(shù)。GRAPHICS.H說明有關(guān)圖形功能的各個(gè)函數(shù),圖形錯(cuò)誤代碼的常量定義,正對不同驅(qū)動程序的各種顏色值,及函數(shù)用到的一些特殊構(gòu)造。IO.H包含低級I/O子程序的構(gòu)造和說明。LIMIT.H包含各環(huán)境參數(shù)、編譯時(shí)間限制、數(shù)的范圍等信息。MATH.H說明數(shù)學(xué)運(yùn)算函數(shù),還定了HUGEVAL宏,說明了matherr和matherr子程序用到的特殊構(gòu)造。MEM.H說明一些內(nèi)存操作函數(shù)(其中大多數(shù)也在STRING.H中說明)。PROCESS.H說明進(jìn)程管理的各個(gè)函數(shù),spawn…和EXEC…函數(shù)的構(gòu)造說明。SETJMP.H定義longjmp和setjmp函數(shù)用到的jmpbuf類型,說明這兩個(gè)函數(shù)。SHARE.H定義文件共享函數(shù)的參數(shù)。SIGNAL.H定義SIG[ZZ(Z][ZZ)]IGN和SIG[ZZ(Z][ZZ)]DFL常量,說明rajse和signal兩個(gè)函數(shù)。STDARG.H定義讀函數(shù)參數(shù)表的宏。(如vprintf,vscarf函數(shù))。STDDEF.H定義一些公共數(shù)據(jù)類型和宏。STDIO.H定義Kernighan和Ritchie在UnixSystemV中定義的標(biāo)準(zhǔn)和擴(kuò)展的類型和宏。還定義標(biāo)準(zhǔn)I/O預(yù)定義流:stdin,stdout和stderr,說明I/O流子程序。STDLIB.H說明一些

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論