譚浩強C語言教程電子版_第1頁
譚浩強C語言教程電子版_第2頁
譚浩強C語言教程電子版_第3頁
譚浩強C語言教程電子版_第4頁
譚浩強C語言教程電子版_第5頁
已閱讀5頁,還剩210頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

錄下安裝TurboC2.0系統(tǒng)的。TC下還建立了兩個了目錄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文件,然后用鼠標雙擊該文件名也可進入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)境的基礎(chǔ)上增加了查錯功能,并可以在Tiny模式下直接生成.COM(數(shù)據(jù)、代碼、堆棧處在同一64K內(nèi)存中)文件。還可對數(shù)學(xué)協(xié)處理器(支持8087/80287/80387等)進行仿真。Borland公司后來又推出了面向?qū)ο蟮某绦蜍浖黅urboC++,它繼承發(fā)展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ū),并將光標置在上次修改過的地方。其熱健為Alt-F3。New:新建文件,缺省文件名為NONAME.C,存盤時可改名。Save:將編輯區(qū)中的文件存盤,若文件名是NONAME.C時,將詢問是否更改文件名,其熱鍵為F2。Writeto:可由用戶給出文件名將編輯區(qū)中的文件存盤,若該文件已存在,則詢問要不要

覆蓋。Directory:顯示目錄及目錄中的文件,并可由用戶選擇。Changedir:顯示當前默認目錄,用戶可以改變默認目錄。Osshell:暫時退出TurboC2.0到DOS提示符下,

此時可以運行DOS命令,

若想回到

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

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

此時用戶可以

進行文本編輯。編輯方法基本與wordstar相同,可用F1鍵獲得有關(guān)編輯方法的幫助信息。與編輯有關(guān)的功能鍵如下:F1

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

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

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

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

向前翻頁PageDn

向后翻頁Home

將光標移到所在行的開始End

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

刪除光標所在的一行Ctrl+T

刪除光標所在處的一個詞Ctrl+KB

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

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

塊移動Ctrl+KC

塊拷貝Ctrl+KY

塊刪除Ctrl+KR

讀文件Ctrl+KW

存文件Ctrl+KP

塊文件打印Ctrl+F1

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

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

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

{和}尖括符

<和>圓括符

(和)方括符

[和]注釋符

/*和*/雙引號

"單引號

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

內(nèi)部,其熱鍵為F8。Userscreen:顯示程序運行時在屏幕上顯示的結(jié)果。其熱鍵為Alt+F5。

Compile菜單按Alt+C可進入Compile菜單,該菜單有以下幾個內(nèi)容,如圖所示:CompiletoOBJ:將一個C源文件編譯生成.OBJ目標文件,

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

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

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

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

不管目前窗口

中是不是主C文件。Getinfo:獲得有關(guān)當前路徑、源文件名、源文件字節(jié)大小、編譯中的錯誤數(shù)目、可用空間等信息,如圖:Project菜單按Alt+P可進入Project菜單,該菜單包括以下內(nèi)容,如圖所示:Projectname:項目名具有.PRJ的擴展名,其中包括將要編譯、連接的文件名。例如有一個程

序由file1.c,file2.c,file3.c組成,要將這3個文件編譯裝配成一個file.exe的執(zhí)行文件,可以先建立一個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進行編譯,而直接連接。說明:當項目文件中的每個文件無擴展名時,均按源文件對待,另外,其中的文件也可以是庫文件,但必須寫上擴展名.LIB。Breakmakeon:由用戶選擇是否在有Warining、Errors、FatalErrors時或Link之前退出Make編譯。Autodependencies:當開關(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)生什么樣的目標代碼。Callingconvention

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

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

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

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

規(guī)定地址對準原則。Mergeduplicatestrings作優(yōu)化用,將重復(fù)的字符串合并在一起。Standardstackframe產(chǎn)生一個標準的棧結(jié)構(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說明標識符有效字符的個數(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)生的目標文件時去尋找其缺省庫。Graphicslibrary

是否連接graphics庫中的函數(shù)。Warnduplicatesymbols當有重復(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)視窗口中刪除當前的監(jiān)視表達式。Editwatch:在監(jiān)視窗口中編輯一個監(jiān)視表達式。Removeall:watches從監(jiān)視窗口中刪除所有的監(jiān)視表達式。Togglebreakpoint:對光標所在的行設(shè)置或清除斷點。Clearallbreakpoints:清除所有斷點。Viewnextbreakpoint:將光標移動到下一個斷點處。TurboC2.0的配置文件所謂配置文件是包含TurboC2.0有關(guān)信息的文件,其中存有編譯、連接的選擇和路徑等信息。可以用下述方法建立TurboC2.0的配置:建立用戶自命名的配置文件:可以從Options菜單中選擇Options/Saveoptions命令,

將當前集成開發(fā)環(huán)境的所有配置存入一個由用戶命名的配置文件中。下次啟動TC時只要在DOS下鍵入:tc/c<用戶命名的配置文件名>就會按這個配置文件中的內(nèi)容作為TurboC2.0的選擇。若設(shè)置Options/Environment/Configautosave為on,則退出集成開發(fā)環(huán)境時,當前的設(shè)置會自動存放到TurboC2.0配置文件TCCONFIG.TC中。TurboC在啟動時會自動尋找這個配置文件。用TCINST設(shè)置TurboC的有關(guān)配置,并將結(jié)果存入TC.EXE中。TurboC在啟動時,若沒有找到配置文件,則取TC.EXE中的缺省值。

TOC\o"1-3"\h\z13 文件 113.1 C文件概述 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和fputc 413.4.2 字符串讀寫函數(shù)fgets和fputs 813.4.3 數(shù)據(jù)塊讀寫函數(shù)fread和fwtrite 913.4.4 格式化讀寫函數(shù)fscanf和fprintf 1113.5 文件的隨機讀寫 1213.5.1 文件定位 1213.5.2 文件的隨機讀寫 1313.6 文件檢測函數(shù) 1413.6.1 文件結(jié)束檢測函數(shù)feof函數(shù) 1413.6.2 讀寫文件出錯檢測函數(shù) 1413.6.3 文件出錯標志和文件結(jié)束標志置0函數(shù) 1413.7 C庫文件 1413.8 本章小結(jié) 15文件C文件概述所謂“文件”是指一組相關(guān)數(shù)據(jù)的有序集合。這個數(shù)據(jù)集有一個名稱,叫做文件名。實際上在前面的各章中我們已經(jīng)多次使用了文件,例如源程序文件、目標文件、可執(zhí)行文件、庫文件(頭文件)等。文件通常是駐留在外部介質(zhì)(如磁盤等)上的,在使用時才調(diào)入內(nèi)存中來。從不同的角度可對文件作不同的分類。從用戶的角度看,文件可分為普通文件和設(shè)備文件兩種。普通文件是指駐留在磁盤或其它外部介質(zhì)上的一個有序數(shù)據(jù)集,可以是源文件、目標文件、可執(zhí)行程序;也可以是一組待輸入處理的原始數(shù)據(jù),或者是一組輸出的結(jié)果。對于源文件、目標文件、可執(zhí)行程序可以稱作程序文件,對輸入輸出數(shù)據(jù)可稱作數(shù)據(jù)文件。設(shè)備文件是指與主機相聯(lián)的各種外部設(shè)備,如顯示器、打印機、鍵盤等。在操作系統(tǒng)中,把外部設(shè)備也看作是一個文件來進行管理,把它們的輸入、輸出等同于對磁盤文件的讀和寫。通常把顯示器定義為標準輸出文件,一般情況下在屏幕上顯示有關(guān)信息就是向標準輸出文件輸出。如前面經(jīng)常使用的printf,putchar函數(shù)就是這類輸出。鍵盤通常被指定標準的輸入文件,從鍵盤上輸入就意味著從標準輸入文件上輸入數(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é)進行處理。輸入輸出字符流的開始和結(jié)束只由程序控制而不受物理符號(如回車符)的控制。因此也把這種文件稱作“流式文件”。本章討論流式文件的打開、關(guān)閉、讀、寫、定位等各種操作。文件指針在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進行各種操作。定義說明文件指針的一般形式為:FILE*指針變量標識符;其中FILE應(yīng)為大寫,它實際上是由系統(tǒng)定義的一個結(jié)構(gòu),該結(jié)構(gòu)中含有文件名、文件狀態(tài)和文件當前位置等信息。在編寫源程序時不必關(guān)心FILE結(jié)構(gòu)的細節(jié)。例如:FILE*fp;表示fp是指向FILE結(jié)構(gòu)的指針變量,通過fp即可找存放某個文件信息的結(jié)構(gòu)變量,然后按結(jié)構(gòu)變量提供的信息找到該文件,實施對文件的操作。習慣上也籠統(tǒng)地把fp稱為指向一個文件的指針。文件的打開與關(guān)閉文件在進行讀寫操作之前要先打開,使用完畢要關(guān)閉。所謂打開文件,實際上是建立文件的各種有關(guān)信息,并使文件指針指向該文件,以便進行其它操作。關(guān)閉文件則斷開指針與文件之間的聯(lián)系,也就禁止再對該文件進行操作。在C語言中,文件操作都是由庫函數(shù)來完成的。在本章內(nèi)將介紹主要的文件操作函數(shù)。文件的打開(fopen函數(shù))fopen函數(shù)用來打開一個文件,其調(diào)用的一般形式為:文件指針名=fopen(文件名,使用文件方式);其中,“文件指針名”必須是被說明為FILE類型的指針變量;“文件名”是被打開文件的文件名;“使用文件方式”是指文件的類型和操作要求。“文件名”是字符串常量或字符串數(shù)組。例如:FILE*fp;fp=("filea","r");其意義是在當前目錄下打開文件filea,只允許進行“讀”操作,并使fp指向該文件。又如:FILE*fphzkfphzk=("c:\\hzk16","rb")其意義是打開C驅(qū)動器磁盤的根目錄下的文件hzk16,這是一個二進制文件,只允許按二進制方式進行讀操作。兩個反斜線“\\”中的第一個表示轉(zhuǎn)義字符,第二個表示根目錄。使用文件的方式共有12種,下面給出了它們的符號和意義。文件使用方式意義“rt”只讀打開一個文本文件,只允許讀數(shù)據(jù)“wt”只寫打開或建立一個文本文件,只允許寫數(shù)據(jù)“at”追加打開一個文本文件,并在文件末尾寫數(shù)據(jù)“rb”只讀打開一個二進制文件,只允許讀數(shù)據(jù)“wb”只寫打開或建立一個二進制文件,只允許寫數(shù)據(jù)“ab”追加打開一個二進制文件,并在文件末尾寫數(shù)據(jù)“rt+”讀寫打開一個文本文件,允許讀和寫“wt+”讀寫打開或建立一個文本文件,允許讀寫“at+”讀寫打開一個文本文件,允許讀,或在文件末追加數(shù)據(jù)“rb+”讀寫打開一個二進制文件,允許讀和寫“wb+”讀寫打開或建立一個二進制文件,允許讀和寫“ab+”讀寫打開一個二進制文件,允許讀,或在文件末追加數(shù)據(jù)對于文件使用方式有以下幾點說明:文件使用方式由r,w,a,t,b,+六個字符拼成,各字符的含義是:r(read):讀w(write):寫a(append):追加t(text):文本文件,可省略不寫b(banary):二進制文件+:讀和寫凡用“r”打開一個文件時,該文件必須已經(jīng)存在,且只能從該文件讀出。用“w”打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經(jīng)存在,則將該文件刪去,重建一個新文件。若要向一個已存在的文件追加新的信息,只能用“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()的功能是從鍵盤輸入一個字符,但不在屏幕上顯示。在這里,該行的作用是等待,只有當用戶從鍵盤敲任一鍵時,程序才繼續(xù)執(zhí)行,因此用戶可利用這個等待時間閱讀出錯提示。敲鍵后執(zhí)行exit(1)退出程序。把一個文本文件讀入內(nèi)存時,要將ASCII碼轉(zhuǎn)換成二進制碼,而把文件以文本方式寫入磁盤時,也要把二進制碼轉(zhuǎn)換成ASCII碼,因此文本文件的讀寫要花費較多的轉(zhuǎn)換時間。對二進制文件的讀寫不存在這種轉(zhuǎ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)部有一個位置指針。用來指向文件的當前讀寫字節(jié)。在文件打開時,該指針總是指向文件的第一個字節(jié)。使用fgetc函數(shù)后,該位置指針將向后移動一個字節(jié)。因此可連續(xù)多次使用fgetc函數(shù),讀取多個字符。應(yīng)注意文件指針和文件內(nèi)部的位置指針不是一回事。文件指針是指向整個文件的,須在程序中定義說明,只要不重新賦值,文件指針的值是不變的。文件內(nèi)部的位置指針用以指示文件內(nèi)部的當前讀寫位置,每讀寫一次,該指針均向后移動,它不需在程序中定義說明,而是由系統(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),只要讀出的字符不是文件結(jié)束標志(每個文件末有一結(jié)束標志EOF)就把該字符顯示在屏幕上,再讀入下一字符。每讀一次,文件內(nèi)部的位置指針向后移動一個字符,文件結(jié)束時,該指針指向EOF。執(zhí)行本程序?qū)@示整個文件。寫字符函數(shù)fputcfputc函數(shù)的功能是把一個字符寫入指定的文件中,函數(shù)調(diào)用的形式為:fputc(字符量,文件指針);其中,待寫入的字符量可以是字符常量或變量,例如:fputc('a',fp);其意義是把字符a寫入fp所指向的文件中。對于fputc函數(shù)的使用也要說明幾點:被寫入的文件可以用寫、讀寫、追加方式打開,用寫或讀寫方式打開一個已存在的文件時將清除原有的文件內(nèi)容,寫入字符從文件首開始。如需保留原有文件內(nèi)容,希望寫入的字符以文件末開始存放,必須以追加方式打開文件。被寫入的文件若不存在,則創(chuàng)建該文件。每寫入一個字符,文件內(nèi)部位置指針向后移動一個字節(jié)。fputc函數(shù)有一個返回值,如寫入成功則返回寫入的字符,否則返回一個EOF??捎么藖砼袛鄬懭胧欠癯晒?。【例13.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),當讀入字符不為回車符時,則把該字符寫入文件之中,然后繼續(xù)從鍵盤讀入下一字符。每輸入一個字符,文件內(nèi)部位置指針向后移動一個字節(jié)。寫入完畢,該指針已指向文件末。如要把文件從頭讀出,須把指針移向文件頭,程序第19行rewind函數(shù)用于把fp所指文件的內(nèi)部位置指針移到文件頭。第20至25行用于讀出文件中的一行內(nèi)容?!纠?3.3】把命令行參數(shù)中的前一個文件名標識的文件,復(fù)制到后一個文件名標識的文件中,如命令行中只有一個文件名則把該文件寫到標準輸出文件(顯示器)中。#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指向標準輸出文件(即顯示器)。程序第25行至28行用循環(huán)語句逐個讀出文件1中的字符再送到文件2中。再次運行時,給出了一個文件名,故輸出給標準輸出文件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個字符。在讀入的最后一個字符后加上串結(jié)束標志'\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,則讀出結(jié)束。fgets函數(shù)也有返回值,其返回值是字符數(shù)組的首地址。寫字符串函數(shù)fputsfputs函數(shù)的功能是向指定的文件寫入一個字符串,其調(diào)用形式為:fputs(字符串,文件指針);其中字符串可以是字符串常量,也可以是字符數(shù)組名,或指針變量,例如:fputs(“abcd“,fp);其意義是把字符串“abcd”寫入fp所指的文件之中?!纠?3.5】在例13.2中建立的文件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)逐個顯示當前文件中的全部內(nèi)容。數(shù)據(jù)塊讀寫函數(shù)fread和fwtriteC語言還提供了用于整塊數(shù)據(jù)的讀寫函數(shù)。可用來讀寫一組數(shù)據(jù),如一個數(shù)組元素,一個結(jié)構(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);}本例程序定義了一個結(jié)構(gòu)stu,說明了兩個結(jié)構(gòu)數(shù)組boya和boyb以及兩個結(jié)構(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ù)每次只能讀寫一個結(jié)構(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時不會出錯。當用常量表示位移量時,要求加后綴“L”?!捌鹗键c”表示從何處開始計算位移量,規(guī)定的起始點有三種:文件首,當前位置和文件尾。其表示方法如下表。起始點表示符號數(shù)字表示文件首SEEK_SET0當前位置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的程序建立,本程序用隨機讀出的方法讀出第二個學(xué)生的數(shù)據(jù)。程序中定義boy為stu類型變量,qq為指向boy的指針。以讀二進制文件方式打開文件,程序第22行移動文件位置指針。其中的i值為1,表示從文件頭開始,移動一個stu類型的長度,然后再讀出的數(shù)據(jù)即為第二個學(xué)生的數(shù)據(jù)。文件檢測函數(shù)C語言中常用的文件檢測函數(shù)有以下幾個。文件結(jié)束檢測函數(shù)feof函數(shù)調(diào)用格式:feof(文件指針);功能:判斷文件是否處于文件結(jié)束位置,如文件結(jié)束,則返回值為1,否則為0。讀寫文件出錯檢測函數(shù)ferror函數(shù)調(diào)用格式:ferror(文件指針);功能:檢查文件在用各種輸入輸出函數(shù)進行讀寫時是否出錯。如ferror返回值為0表示未出錯,否則表示有錯。文件出錯標志和文件結(jié)束標志置0函數(shù)clearerr函數(shù)調(diào)用格式:

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論