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

下載本文檔

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

文檔簡介

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

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

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

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

BASIC,

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

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

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

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

此時可以運行DOS命令,

假設(shè)想回到

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

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

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

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

擴大編輯窗口到整個屏幕;F6

在編輯窗口與信息窗口之間進展切換;F10

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

向前翻頁PageDn

向后翻頁Home

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

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

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

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

同時顯示生成的文件名。其熱鍵為

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

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

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

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

file1.c

file2.c

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

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

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

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

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

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

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

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

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

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

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

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

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

不跟蹤。Keepmessage

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

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

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

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

評論

0/150

提交評論