C語言程序設(shè)計與實訓(xùn) 課件 第11-13章 結(jié)構(gòu)和其他類型;文件;綜合案例設(shè)計_第1頁
C語言程序設(shè)計與實訓(xùn) 課件 第11-13章 結(jié)構(gòu)和其他類型;文件;綜合案例設(shè)計_第2頁
C語言程序設(shè)計與實訓(xùn) 課件 第11-13章 結(jié)構(gòu)和其他類型;文件;綜合案例設(shè)計_第3頁
C語言程序設(shè)計與實訓(xùn) 課件 第11-13章 結(jié)構(gòu)和其他類型;文件;綜合案例設(shè)計_第4頁
C語言程序設(shè)計與實訓(xùn) 課件 第11-13章 結(jié)構(gòu)和其他類型;文件;綜合案例設(shè)計_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計周屹第11章結(jié)構(gòu)和其他類型 11.1結(jié)構(gòu)概念

11.2結(jié)構(gòu)操作

11.2.1結(jié)構(gòu)引用和初始化

11.2.2結(jié)構(gòu)數(shù)組

11.2.3結(jié)構(gòu)指針變量

11.3結(jié)構(gòu)應(yīng)用

11.4動態(tài)結(jié)構(gòu)類型

11.5聯(lián)合

11.5.1聯(lián)合定義

11.5.2聯(lián)合變量賦值和引用

11.5.3聯(lián)合和結(jié)構(gòu)的差異

11.6枚舉類型

11.6.1枚舉類型定義

11.6.2枚舉類型的賦值和使用

11.7使用typedef 11.1結(jié)構(gòu)概念1.結(jié)構(gòu)定義“結(jié)構(gòu)”是一種構(gòu)造類型,它是由若干“成員”組成的。每一個成員可以是一個基本數(shù)據(jù)類型或者又是一個構(gòu)造類型。定義一個結(jié)構(gòu)的一般形式為:struct結(jié)構(gòu)名{成員表列

};注意:不要忽略最后的分號成員表由若干個成員組成,每個成員都是該結(jié)構(gòu)的一個組成部分。對每個成員也必須作類型說明,其形式為:類型說明符成員名;成員名的命名應(yīng)符合標(biāo)識符的書寫規(guī)定。2.結(jié)構(gòu)類型變量說明說明結(jié)構(gòu)變量有以下三種方法。(1)先定義結(jié)構(gòu),再說明結(jié)構(gòu)變量。如:structstu{intnum;charname[20];charsex;floatscore;};structstuboy1,boy2;說明結(jié)構(gòu)變量有以下三種方法。(2)在定義結(jié)構(gòu)類型的同時說明結(jié)構(gòu)變量。例如:structstu{intnum;charname[20];charsex;floatscore;}boy1,boy2;說明結(jié)構(gòu)變量有以下三種方法。(3)直接說明結(jié)構(gòu)變量。

例如:struct{intnum;charname[20];charsex;floatscore;}boy1,boy2;11.2結(jié)構(gòu)操作11.2.1結(jié)構(gòu)引用和初始化1.結(jié)構(gòu)的引用結(jié)構(gòu)分量又稱成員,表示結(jié)構(gòu)變量成員的一般形式是:結(jié)構(gòu)變量名.成員名運算符“.”是訪問結(jié)構(gòu)成員,其左操作數(shù)必須是結(jié)構(gòu)變量名,右操作數(shù)是結(jié)構(gòu)的成員名。根據(jù)結(jié)構(gòu)成員的表示方法。如果成員本身又是一個結(jié)構(gòu)則必須逐級找到最低級的成員才能使用。例如:boy1.birthday.month即第一個人出生的月份成員,可以在程序中單獨使用,與普通變量完全相同。如果結(jié)構(gòu)不包含指針類型成員和動態(tài)數(shù)據(jù)結(jié)構(gòu)成員,類型相同的結(jié)構(gòu)可賦值。#include<stdio.h>voidmain(){structstu{intnum;char*name;charsex;floatscore;}boy1,boy2;boy1.num=102;="Zhangping";printf("inputsexandscore\n");scanf("%c%f",&boy1.sex,&boy1.score);boy2=boy1;printf("Number=%d\nName=%s\n",boy2.num,);printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}2.結(jié)構(gòu)初始化如果結(jié)構(gòu)變量是靜態(tài)存儲類或外部存儲類,則初始化語句表達(dá)式應(yīng)為常量表達(dá)式。如果變量是自動存儲類或寄存器存儲類,則初始化語句表達(dá)式允許為任意表達(dá)式。例11-2外部結(jié)構(gòu)變量初始化。structstu/*定義結(jié)構(gòu)*/{intnum;char*name;charsex;floatscore;}boy2,boy1={102,"Zhangping",'M',78.5};voidmain(){boy2=boy1;printf("Number=%d\nName=%s\n",boy2.num,);printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}structstu{intnum;char*name;charsex;floatscore;}boy[5];11.2.2結(jié)構(gòu)數(shù)組

例如:structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping","M",45},{102,"Zhangping","M",62.5},{103,"Hefang","F",92.5},{104,"Chengling","F",87},{105,"Wangming","M",58};};例11-4計算學(xué)生的平均成績和不及格的人數(shù)。#include<stdio.h>structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping",'M',45},{102,"Zhangping",'M',62.5},{103,"Hefang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58},};voidmain(){inti,c=0;floatave,s=0;for(i=0;i<5;i++){s+=boy[i].score;if(boy[i].score<60)c+=1;}printf("s=%f\n",s);ave=s/5;printf("average=%f\ncount=%d\n",ave,c);}1.結(jié)構(gòu)指針變量的說明結(jié)構(gòu)指針變量說明的一般形式為:

struct結(jié)構(gòu)名*結(jié)構(gòu)指針變量名;結(jié)構(gòu)名和結(jié)構(gòu)變量是兩個不同的概念。結(jié)構(gòu)名只能表示一個結(jié)構(gòu)形式,編譯系統(tǒng)并不對它分配內(nèi)存空間。只有當(dāng)某變量被說明為這種類型的結(jié)構(gòu)時,才對該變量分配存儲空間。。其訪問的一般形式為:(*結(jié)構(gòu)指針變量).成員名或為:結(jié)構(gòu)指針變量->成員名

例如:(*pstu).num或:pstu->num應(yīng)該注意(*pstu)兩側(cè)的括號不可少,因為成員符“.”的優(yōu)先級高于“*”。如去掉括號寫作*pstu.num則等效于*(pstu.num),這樣,意義就完全不對了。下面通過例子來說明結(jié)構(gòu)指針變量的具體說明和使用方法。11.2.3結(jié)構(gòu)指針變量

結(jié)構(gòu)指針變量。#include"stdio.h"structstu{intnum;char*name;charsex;floatscore;}boy1={102,"Zhangping",'M',78.5},*pstu;voidmain(){pstu=&boy1;printf("Number=%d\nName=%s\n",boy1.num,);printf("Sex=%c\nScore=%f\n\n",boy1.sex,boy1.score);printf("Number=%d\nName=%s\n",(*pstu).num,(*pstu).name);printf("Sex=%c\nScore=%f\n\n",(*pstu).sex,(*pstu).score);printf("Number=%d\nName=%s\n",pstu->num,pstu->name);printf("Sex=%c\nScore=%f\n\n",pstu->sex,pstu->score);}11.3結(jié)構(gòu)應(yīng)用例11-7用結(jié)構(gòu)指針變量作函數(shù)參數(shù)編程,實現(xiàn)例11-7,計算一組學(xué)生的平均成績和不及格人數(shù)。#include"stdio.h"structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping",'M',45},{102,"Zhangping",'M',62.5},{103,"Hefang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58},};voidmain(){structstu*ps;voidave(structstu*ps);ps=boy;ave(ps);}voidave(structstu*ps){intc=0,i;floatave,s=0;for(i=0;i<5;i++,ps++){s+=ps->score;if(ps->score<60)c+=1;}printf("s=%f\n",s);ave=s/5;printf("average=%f\ncount=%d\n",ave,c);}例11-8輸入學(xué)生信息,統(tǒng)計總分后輸出學(xué)生信息。#include<stdio.h>structDATE/*日期結(jié)構(gòu)*/{ intyear;/*年*/ intmonth;/*月*/ intday;/*日*/};structStudent/*學(xué)生信息結(jié)構(gòu)*/{ charno[10];/*學(xué)號*/ charname[8];/*姓名*/ charsex[3];/*性別*/ structDATEbirthday;/*出生日期結(jié)構(gòu)嵌套定義*/ intscore[4];/*三門課的分?jǐn)?shù)和總分*/};例11-8輸入學(xué)生信息,統(tǒng)計總分后輸出學(xué)生信息。structStudentstscore(structStudentstud,intn);/*統(tǒng)計總分*/voidmain() {structStudentstud1={"A02053101","李偉","男",{1986,5,15},{75,90,83,0}};printf("學(xué)生信息:\n");printf("%s%s%s%4d%3d%3d%4d%4d%4d%4d\n",stud1.no,,stud1.sex,stud1.birthday.year,stud1.birthday.month,stud1.birthday.day,stud1.score[0],stud1.score[1],stud1.score[2],stud1.score[3]);stud1=stscore(stud1,3);printf("輸出學(xué)生信息:\n");printf("%s%s%s%4d%3d%3d%4d%4d%4d%4d\n",stud1.no,,stud1.sex,stud1.birthday.year,stud1.birthday.month,stud1.birthday.day,stud1.score[0],stud1.score[1],stud1.score[2],stud1.score[3]);}structStudentstscore(structStudentstud,intn)/*統(tǒng)計總分*/{inti;for(i=0;i<n;i++)stud.score[3]+=stud.score[i];

returnstud;}11.4動態(tài)結(jié)構(gòu)類型1.分配內(nèi)存空間函數(shù)malloc調(diào)用形式:(類型說明符*)malloc(size);功能:在內(nèi)存的動態(tài)存儲區(qū)中分配一塊長度為size字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址?!邦愋驼f明符”表示把該區(qū)域用于何種數(shù)據(jù)類型。(類型說明符*)表示把返回值強制轉(zhuǎn)換為該類型指針。size是一個無符號數(shù)。例如:pc=(char*)malloc(100);表示分配100個字節(jié)的內(nèi)存空間,并強制轉(zhuǎn)換為字符數(shù)組類型,函數(shù)的返回值為指向該字符數(shù)組的指針,把該指針賦予指針變量pc。2.分配內(nèi)存空間函數(shù)calloccalloc也用于分配內(nèi)存空間。調(diào)用形式:(類型說明符*)calloc(n,size);功能:在內(nèi)存動態(tài)存儲區(qū)中分配n塊長度為size字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。(類型說明符*)用于強制類型轉(zhuǎn)換。calloc函數(shù)與malloc函數(shù)的區(qū)別僅在于一次可以分配n塊區(qū)域。例如:ps=(struetstu*)calloc(2,sizeof(structstu));其中的sizeof(structstu)是求stu的結(jié)構(gòu)長度。因此該語句的意思是:按stu的長度分配2塊連續(xù)區(qū)域,強制轉(zhuǎn)換為stu類型,并把其首地址賦予指針變量ps。3.釋放內(nèi)存空間函數(shù)free調(diào)用形式:free(void*ptr);功能:釋放ptr所指向的一塊內(nèi)存空間,ptr是一個任意類型的指針變量,它指向被釋放區(qū)域的首地址。被釋放區(qū)應(yīng)是由malloc或calloc函數(shù)所分配的區(qū)域。例11-9輸入一個學(xué)生數(shù)據(jù)到分配區(qū)域。#include<stdio.h>#include<stdlib.h>/*或#include<malloc.h>*/voidmain(){structstu{intnum;char*name;charsex;floatscore;}*ps;ps=(structstu*)malloc(sizeof(structstu));ps->num=102;ps->name="Zhangping";ps->sex='M';ps->score=62.5;printf("Number=%d\nName=%s\n",ps->num,ps->name);printf("Sex=%c\nScore=%f\n",ps->sex,ps->score);free(ps);}11.5聯(lián)合11.5.1聯(lián)合定義定義一個聯(lián)合類型的一般形式為:union聯(lián)合名

{成員表;};成員表中含有若干成員,成員的一般形式為:類型說明符成員名;成員名的命名應(yīng)符合標(biāo)識符的規(guī)定。例如:

unionperdata{intclass;charoffice[10];};聯(lián)合變量說明聯(lián)合變量的說明和結(jié)構(gòu)變量的說明方式相同,也有三種形式。即先定義,再說明;定義同時說明和直接說明。以perdata類型為例,說明如下:

unionperdata{intclass;charofficae[10];};unionperdataa,b;/*說明a,b為perdata類型*/或者可同時說明為:

unionperdata{intclass;charoffice[10];}a,b;經(jīng)說明后的a、b變量均為perdata類型。a、b變量的長度應(yīng)等于perdata的成員中最長的長度,即等于office數(shù)組的長度,共10個字節(jié)。a、b變量如賦予整型值時,只使用了2個字節(jié),而賦予字符數(shù)組時,可用10個字節(jié)。11.5.2聯(lián)合變量賦值和引用

對聯(lián)合變量的賦值、使用都只能是對變量的成員進(jìn)行。

聯(lián)合變量的成員表示為:聯(lián)合變量名.成員名;

例如,a被說明為perdata類型的變量之后,可使用a.class、a.office不允許只用聯(lián)合變量名作賦值或其它操作。還要再強調(diào)說明的是,一個聯(lián)合變量,每次只能賦予一個成員值。換句話說,一個聯(lián)合變量的值就是聯(lián)合變員的某一個成員值。例11-11設(shè)有一個教師與學(xué)生通用的表格,教師數(shù)據(jù)有姓名、年齡、職業(yè)、教研室四項。學(xué)生有姓名、年齡、職業(yè)、班級四項。編程輸入人員數(shù)據(jù),再以表格輸出。voidmain(){struct{charname[10];intage;charjob;union{intclass;charoffice[10];}depa;}body[2];intn,i;for(i=0;i<2;i++){printf("inputname,age,jobanddepartment\n");scanf("%s%d%c",body[i].name,&body[i].age,&body[i].job);if(body[i].job=='s')scanf("%d",&body[i].depa.class);elsescanf("%s",body[i].depa.office);}例11-11設(shè)有一個教師與學(xué)生通用的表格,教師數(shù)據(jù)有姓名、年齡、職業(yè)、教研室四項。學(xué)生有姓名、年齡、職業(yè)、班級四項。編程輸入人員數(shù)據(jù),再以表格輸出。printf("name\tagejobclass/office\n");for(i=0;i<2;i++){if(body[i].job=='s')printf("%s\t%3d%3c%d\n",body[i].name,body[i].age,body[i].job,body[i].depa.class);elseprintf("%s\t%3d%3c%s\n",body[i].name,body[i].age,body[i].job,body[i].depa.office);}}11.5.3聯(lián)合和結(jié)構(gòu)的差異

“聯(lián)合”與“結(jié)構(gòu)”有一些相似之處。但兩者有本質(zhì)上的不同。在結(jié)構(gòu)中各成員有各自的內(nèi)存空間,一個結(jié)構(gòu)變量的總長度是各成員長度之和。

“聯(lián)合”中,各成員共享一段內(nèi)存空間,一個聯(lián)合變量的長度等于各成員中最長的長度。應(yīng)該說明的是,這里所謂的共享不是指把多個成員同時裝入一個聯(lián)合變量內(nèi),而是指該聯(lián)合變量可被賦予任一成員值,但每次只能賦一種值,賦入新值則沖去舊值。聯(lián)合類型必須經(jīng)過定義之后,才能把變量說明為該聯(lián)合類型。不能對聯(lián)合變量初始化,但可以對結(jié)構(gòu)變量初始化。不能把聯(lián)合變量作為函數(shù)參數(shù),但結(jié)構(gòu)變量可以作為函數(shù)參數(shù)。11.6枚舉類型11.6.1枚舉類型定義枚舉類型定義的一般格式:enum類型名{標(biāo)識符表};例如,定義一個顏色枚舉類型:enumCOLOR{red,yellow,blue,white,black};枚舉類型的值是常量,必須是標(biāo)識符。枚舉類型是有序類型,即red為0,yellow為1,blue為2,white為3,black為4等,是枚舉類型常量的值。enumCHARACTER{’A’,’B’,’C’,’D’}; /*錯誤*/enumINT{1,2,3,4,5}; /*錯誤*/枚舉類型常量的可以重新定義。例如:enumCOLOR{red,yellow=10,blue,white,black};COLOR的值,即red為0,yellow為10,blue為11,white為12,black為13。枚舉變量定義的一般格式:enum類型名變量表;例如,定義顏色枚舉類型變量:enumCOLORc1,c2;11.6枚舉類型11.6.2枚舉類型的賦值和使用1.枚舉型變量可賦枚舉值常量,但不能賦序號。2.枚舉型可進(jìn)行比較。enumCOLOR{red,yellow,blue,white,black};enumCOLORc1,c2,c3=blue;c1=red;c2=white;c1=0;c2=3; /*錯誤*/c1=(enumCOLOR)0; /*正確*/c2=(enumCOLOR)3; /*正確*/c1==c2,值為0c2>=c1,值為1c2!=c1,值為13.枚舉型數(shù)據(jù)不能直接輸入、輸出,需編一段程序?qū)崿F(xiàn)。枚舉型數(shù)據(jù)輸入:printf("輸入顏色代碼(0,1,2,3,4):");scanf("%d",&code);switch(code){case0:c1=red;break;case1:c1=yellow;break;case2:c1=blue;break; case3:c1=white;break; case4:c1=black;break;default:printf("輸入顏色代碼錯誤!\n");exit(1);}例11-12用枚舉數(shù)組輸出顏色。#include<stdio.h>voidmain() {enumCOLOR{red,yellow,blue,white,black}; /*顏色枚舉類型*/enumCOLORc[5]={(enumCOLOR)0,(enumCOLOR)1,(enumCOLOR)2,(enumCOLOR)3,(enumCOLOR)4}; /*顏色數(shù)組*/ inti; printf("輸出顏色:\n"); for(i=0;i<5;i++) switch(c[i]) {casered:printf("red\n");break; caseyellow:printf("yellow\n");break; caseblue:printf("blue\n");break; casewhite:printf("white\n");break; caseblack:printf("black\n");break;} }

11.7使用typedef結(jié)構(gòu)類型定義,也可應(yīng)用關(guān)鍵字typedef聲明定義一個結(jié)構(gòu)類型別名,其一般格式:typedef類型類型別名;類型別名不是一個新類型,僅僅是已有類型的一個別名。例如:typedefstructDate/*日期結(jié)構(gòu)*/{intyear;/*年*/intmonth;/*月*/intday;/*日*/}DATE;/*日期結(jié)構(gòu)類型別名*/typedefstructStudent/*學(xué)生信息結(jié)構(gòu)*/{charno[10];/*學(xué)號*/charname[9];/*姓名*/charsex[3];/*性別*/DATEbirthday;/*出生日期結(jié)構(gòu)嵌套定義*/intscore[4];/*三門課的分?jǐn)?shù)和總分*/}STUDENT;/*學(xué)生信息結(jié)構(gòu)類型別名*/11.7使用typedef結(jié)構(gòu)類型定義,還有兩種不常用的格式:struct結(jié)構(gòu)名 struct{ {

成員名表

成員名表}變量名表; }變量名表;注意,結(jié)構(gòu)類型名不是變量名,不分配內(nèi)存空間,僅僅是為結(jié)構(gòu)類型變量名分配內(nèi)存空間的一個樣板。本章小結(jié)

結(jié)構(gòu)和聯(lián)合是構(gòu)造類型的數(shù)據(jù),是用戶自定義的數(shù)據(jù)類型。結(jié)構(gòu)和聯(lián)合有很多的相似之處,它們都由成員組成。成員可以具有不同的數(shù)據(jù)類型,成員的表示方法相同,都可以使用三種方式作變量說明“.”是成員運算符,可用它表示成員項,成員還可用“->”運算符來表示。結(jié)構(gòu)變量可以作為函數(shù)參數(shù),函數(shù)也可返回指向結(jié)構(gòu)的指針變量。而聯(lián)合變量不能作為函數(shù)參數(shù),函數(shù)也不能返回指向聯(lián)合的指針變量,但可以使用指向聯(lián)合變量的指針,也可使用聯(lián)合數(shù)組。結(jié)構(gòu)定義允許嵌套,結(jié)構(gòu)中也可用聯(lián)合作為成員,形成結(jié)構(gòu)和聯(lián)合的嵌套。枚舉類型是一種基本數(shù)據(jù)類型。枚舉變量的取值是有限的,枚舉元素是常量,而不是變量。枚舉類型變量通常由賦值語句賦值,而不由動態(tài)輸入賦值。類型定義typedef向用戶提供了一種自定義類型說明符的別名手段。C語言程序設(shè)計周屹第12章文件 12.1文件概述

12.2文件類型指針

12.3文件打開與關(guān)閉

12.3.1文件打開(fopen函數(shù))

12.3.2文件關(guān)閉(fclose函數(shù)) 12.4文件讀寫

12.4.1字符讀寫函數(shù)

12.4.2字符串讀寫函數(shù)

12.4.3數(shù)據(jù)塊讀寫函數(shù)

12.4.4格式化讀寫函數(shù)

12.5文件定位

12.5.1rewind函數(shù)

12.5.2fseek函數(shù)

12.1文件概述所謂文件是指一組相關(guān)數(shù)據(jù)的有序集合。這個數(shù)據(jù)集有一個名稱,叫做文件名。實際上在前面的各章中已經(jīng)多次使用了文件,例如源程序文件、目標(biāo)文件、可執(zhí)行文件、庫文件(頭文件)等。文件通常是駐留在外部介質(zhì)(如磁盤等)上的,在使用時才調(diào)入內(nèi)存中來。從不同的角度可對文件作不同的分類。從用戶的角度看,文件可分為普通文件和設(shè)備文件兩種。在C語言中,文件是字符(字節(jié))的序列,稱字節(jié)流,或稱二進(jìn)制流。根據(jù)數(shù)據(jù)的組織形式,C文件可分為ASCII碼文件(又稱文本文件,或稱正文文件)和二進(jìn)制文件。例如整數(shù)inta=1025,這兩種文件的存儲形式是不同的,如圖所示。圖12-2打開文件、讀或?qū)?、關(guān)閉文件文件處理必須包含三個基本過程:打開文件,讀或?qū)懀P(guān)閉文件。流式文件分打開、關(guān)閉、讀、寫、定位等各種操作。文件指針在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進(jìn)行各種操作。文件緩沖區(qū)是一種結(jié)構(gòu)類型,在庫頭文件stdio.h中定義:typedefstruct{shortlevel;unsignedflags;charfd;unsignedcharhold;shortbsize;unsignedchar*buffer;unsignedchar*curp;unsignedistemp;shorttoken;}FILE;12.2文件類型指針

文件定義的一般格式:FILE文件指針;FILE是文件緩沖區(qū)的類型名,必須大寫。文件指針指向文件緩沖區(qū)的指針。例如:FILE*fp;文件緩沖區(qū)是一片內(nèi)存空間,存放著處理文件的有關(guān)信息,fp指向這片內(nèi)存空間。文件處理全由庫函數(shù)實現(xiàn)。其中FILE應(yīng)為大寫,它實際上是由系統(tǒng)定義的一個結(jié)構(gòu),該結(jié)構(gòu)中含有文件名、文件狀態(tài)和文件當(dāng)前位置等信息。在編寫源程序時不必關(guān)心FILE結(jié)構(gòu)的細(xì)節(jié)。12.3文件打開與關(guān)閉打開文件需調(diào)用庫fopen函數(shù)。

它的一般調(diào)用格式:fopen(文件說明符,模式);文件說明符指定打開的文件名,可以包含盤符、路徑、文件名,是字符串。模式指定打開的文件讀寫方式,是字符串,必須小寫。模式如下:文本文件(默認(rèn)參數(shù)t可以不寫): r(只讀)r+(讀寫) w(只寫)w+(讀寫) a(追加,寫)a+(追加,讀寫)二進(jìn)制文件(參數(shù)b表示二進(jìn)制): rb(只讀)rb+(讀寫) wb(只寫)wb+(讀寫) ab(追加,寫)ab+(追加,讀寫)12.3.1文件打開(fopen函數(shù))12.3.2文件關(guān)閉(fclose函數(shù))關(guān)閉文件需調(diào)用庫fclose函數(shù)。

它的一般調(diào)用格式:fclose(文件指針);例如:fclose(fp);

文件一旦使用完畢,應(yīng)用關(guān)閉文件函數(shù)把文件關(guān)閉,以避免文件的數(shù)據(jù)丟失等錯誤。

正常完成關(guān)閉文件操作時,fclose函數(shù)返回值為0。

如返回非零值則表示有錯誤發(fā)生。12.4文件讀寫12.4.1字符讀寫函數(shù)1.讀字符函數(shù)fgetcfgetc函數(shù)的功能是從指定的文件中讀一個字符,函數(shù)調(diào)用的形式為:字符變量=fgetc(文件指針);例如:ch=fgetc(fp);其意義是從打開的文件fp中讀取一個字符并送入ch中。對于fgetc函數(shù)的使用有以下幾點說明:(1)在fgetc函數(shù)調(diào)用中,讀取的文件必須是以讀或讀寫方式打開的。(2)讀取字符的結(jié)果也可以不向字符變量賦值,例如:fgetc(fp);但是讀出的字符不能保存。(3)在文件內(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è)置的。2.寫字符函數(shù)fputcfputc函數(shù)的功能是把一個字符寫入指定的文件中,函數(shù)調(diào)用的形式為:fputc(字符量,文件指針);其中,待寫入的字符量可以是字符常量或變量,例如:fputc('a',fp);其意義是把字符a寫入fp所指向的文件中。對于fputc函數(shù)的使用也要說明幾點:(1)被寫入的文件可以用、寫、讀寫、追加方式打開,用寫或讀寫方式打開一個已存在的文件時將清除原有的文件內(nèi)容,寫入字符從文件首開始。如需保留原有文件內(nèi)容,希望寫入的字符以文件末開始存放,必須以追加方式打開文件。被寫入的文件若不存在,則創(chuàng)建該文件。(2)每寫入一個字符,文件內(nèi)部位置指針向后移動一個字節(jié)。(3)fputc函數(shù)有一個返回值,如寫入成功則返回寫入的字符,否則返回一個EOF??捎么藖砼袛鄬懭胧欠癯晒?。12.4.2字符串讀寫函數(shù)

1.讀字符串函數(shù)fgets函數(shù)的功能是從指定的文件中讀一個字符串到字符數(shù)組中。函數(shù)調(diào)用的形式為:fgets(字符數(shù)組名,n,文件指針);

其中的n是一個正整數(shù)。表示從文件中讀出的字符串不超過n-1個字符。

在讀入的最后一個字符后加上串結(jié)束標(biāo)志'\0'。例如:fgets(str,n,fp);

意義是從fp所指的文件中讀出n-1個字符送入字符數(shù)組str中。2.寫字符串函數(shù)fputsfputs函數(shù)的功能是向指定的文件寫入一個字符串。

其調(diào)用形式為:

fputs(字符串,文件指針)

其中字符串可以是字符串常量,也可以是字符數(shù)組名,或指針變量。

例如:fputs("abcd",fp);其意義是把字符串"abcd"寫入fp所指的文件之中。12.4.3數(shù)據(jù)塊讀寫函數(shù)

C語言還提供了用于整塊數(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ù)的首地址。例如:fread(fa,4,5,fp);

其意義是從fp所指的文件中,每次讀4個字節(jié)(一個實數(shù))送入實數(shù)組fa中,連續(xù)讀5次,即讀5個實數(shù)到fa中。12.4.4格式化讀寫函數(shù)

fscanf函數(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);12.5文件定位文件定位移動文件內(nèi)部位置指針的函數(shù)主要有兩個,即rewind函數(shù)和fseek函數(shù)。(1)rewind函數(shù)前面已多次使用過,其調(diào)用形式為:rewind(文件指針);它的功能是把文件內(nèi)部的位置指針移到文件首。12.5.1rewind函數(shù)12.5.2fseek函數(shù)

fseek函數(shù)來移動文件內(nèi)部位置指針。其調(diào)用形式為:

fseek(文件指針,位移量,起始點);

其中:“文件指針”指向被移動的文件。“位移量”表示移動的字節(jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長度大于64KB時不會出錯。當(dāng)用常量表示位移量時,要求加后綴“L”?!捌鹗键c”表示從何處開始計算位移量,規(guī)定的起始點有三種:文件首、當(dāng)前位置和文件尾.

本章小結(jié)

文件是程序設(shè)計中的一個重要的概念。數(shù)據(jù)是以文件的形式存放在外部介質(zhì)(如磁盤)上的。

C文件按編碼方式分為二進(jìn)制文件和ASCII編碼文件,C系統(tǒng)把文件當(dāng)作一個“流”,按字節(jié)進(jìn)行處理;

文件指針標(biāo)識文件,當(dāng)一個文件被打開時,可取得該文件指針;文件在讀寫之前必須打開,讀寫結(jié)束必須關(guān)閉。

文件可按只讀、只寫、讀寫、追加四種操作方式打開,同時還必須指定文件的類型是二進(jìn)制文件還是文本文件;文件可按字節(jié),字符串,數(shù)據(jù)塊為單位讀寫,文件也可按指定的格式進(jìn)行讀寫;

文件內(nèi)部的位置指針可指示當(dāng)前的讀寫位置,移動該指針可以對文件實現(xiàn)隨機讀寫。C語言程序設(shè)計周屹第13章綜合案例設(shè)計13.1鏈表

13.2隊列

13.3棧

13.4存儲管理

13.5進(jìn)程調(diào)度

13.6簡單計算器實現(xiàn)

13.7算數(shù)表達(dá)式求值

13.8迷宮問題

13.9貪吃蛇游戲

13.10黑白棋游戲

13.1鏈表13.2隊列

13.3棧

棧是限定僅在表的一端進(jìn)行插入或刪除操作的線性表。

插入或刪除尾端稱為棧頂,另一端稱為棧底。

假設(shè)棧中元素按a1,a2,…,an的次序進(jìn)棧,退棧的第一個元素應(yīng)為棧頂元素an。

因此棧又稱為后進(jìn)先出的線性表。13.4存儲管理

13.5進(jìn)程調(diào)度

進(jìn)程管理是分時操作系統(tǒng)的核心算法。

進(jìn)程共有三個狀態(tài):就緒、運行和等待。

如果進(jìn)程已具備執(zhí)行條件,但是因為處理機已由其它進(jìn)程占用,暫時不能執(zhí)行而等待分配處理機,稱此種進(jìn)程處于就緒狀態(tài)。

當(dāng)一個進(jìn)程已分配到處理機,它的程序正由處理機執(zhí)行時,稱此進(jìn)程處于執(zhí)行狀態(tài)。

進(jìn)程因等待某一事件(如等待某一輸入或輸出操作完成)而暫時不能運行的狀態(tài)稱為等待狀態(tài)。

當(dāng)進(jìn)程由于時間片到期而被內(nèi)核中斷時,直接進(jìn)入就緒態(tài)狀態(tài)。13.6簡單計算器實現(xiàn)

從鍵盤上輸入數(shù)據(jù)進(jìn)行加、減、乘、除四則運算(以“a

溫馨提示

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

評論

0/150

提交評論