C語(yǔ)言程序設(shè)計(jì)(第3版)課件 第5、6章 復(fù)雜構(gòu)造數(shù)據(jù)類型、磁盤數(shù)據(jù)存儲(chǔ)_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第3版)課件 第5、6章 復(fù)雜構(gòu)造數(shù)據(jù)類型、磁盤數(shù)據(jù)存儲(chǔ)_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第3版)課件 第5、6章 復(fù)雜構(gòu)造數(shù)據(jù)類型、磁盤數(shù)據(jù)存儲(chǔ)_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第3版)課件 第5、6章 復(fù)雜構(gòu)造數(shù)據(jù)類型、磁盤數(shù)據(jù)存儲(chǔ)_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)(第3版)課件 第5、6章 復(fù)雜構(gòu)造數(shù)據(jù)類型、磁盤數(shù)據(jù)存儲(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩54頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

16十月2023C語(yǔ)言程序設(shè)計(jì)數(shù)據(jù)類型回顧基本數(shù)據(jù)類型整型實(shí)型字符型整型數(shù)組實(shí)型數(shù)組字符數(shù)組數(shù)組---構(gòu)造數(shù)據(jù)類型特點(diǎn):所有元素屬于同一種數(shù)據(jù)類型16十月2023C語(yǔ)言程序設(shè)計(jì)圖書(shū)館存儲(chǔ)一本圖書(shū)的信息時(shí),需要存儲(chǔ)書(shū)號(hào)、書(shū)名、作者、出版社、出版時(shí)間、價(jià)格等信息,它們屬于不全相同的數(shù)據(jù)類型。num711107116nameThinkinginC++author(美)BruceEckelpress機(jī)械工業(yè)出版社pubtime2000.1price39.00intnum;//

charnum[20];charname[50];charauthor[30];charpress[30];……?floatprice;這些數(shù)據(jù)屬于不全相同的數(shù)據(jù)類型,但它們組合在一起表達(dá)了一本圖書(shū)的信息。16十月2023C語(yǔ)言程序設(shè)計(jì)學(xué)校在記錄一名同學(xué)的信息時(shí),需要存儲(chǔ)學(xué)號(hào)、姓名、性別、年齡、成績(jī)、家庭地址等信息,它們也屬于不全相同的數(shù)據(jù)類型。num15001name張無(wú)忌sexMage19score99.5addrBeiJingintnum;//

charnum[20];charname[30];charsex;intage;floatsore;charaddr[50];這些數(shù)據(jù)也屬于不全相同的數(shù)據(jù)類型,但它們組合在一起表達(dá)了一個(gè)同學(xué)的信息。16十月2023C語(yǔ)言程序設(shè)計(jì)第五章復(fù)雜構(gòu)造數(shù)據(jù)類型5.1結(jié)構(gòu)體5.2共用體5.3枚舉類型5.4鏈表☆16十月2023C語(yǔ)言程序設(shè)計(jì)5.1結(jié)構(gòu)體在解決實(shí)際問(wèn)題時(shí),有時(shí)需要將多個(gè)不同類型的數(shù)據(jù)組合在一起表達(dá)一個(gè)整體的信息。例如:描述一個(gè)學(xué)生的完整信息時(shí),有學(xué)號(hào)、姓名、年齡、成績(jī)、家庭地址等項(xiàng)。numnamesexagescoreaddr15001LiMingM1999.5Beijingintnum;charname[30];charsex;intage;floatscore;charaddr[50];C語(yǔ)言提供了這種數(shù)據(jù)結(jié)構(gòu):允許用戶將不同類型的數(shù)據(jù)組合成一個(gè)有機(jī)的整體,這些數(shù)據(jù)互相聯(lián)系;這種數(shù)據(jù)結(jié)構(gòu)稱為結(jié)構(gòu)體(structure)。16十月2023C語(yǔ)言程序設(shè)計(jì)結(jié)構(gòu)體類型在使用之前應(yīng)先定義,然后再定義該類型變量,才能使用。定義一個(gè)結(jié)構(gòu)體類型的一般形式:struct結(jié)構(gòu)體名{};類型標(biāo)識(shí)符1成員名1;類型標(biāo)識(shí)符2成員名2;

……

……類型標(biāo)識(shí)符n成員名n;成員表列(域表)struct{};studentintnum;charname[30];charsex;intage;floatscore;charaddr[50];16十月2023C語(yǔ)言程序設(shè)計(jì)1定義結(jié)構(gòu)體類型變量的方法1、先定義結(jié)構(gòu)體類型再定義結(jié)構(gòu)體變量structstudent{

intnum;charname[20];floatscore;};structstudentstu1,stu2;結(jié)構(gòu)體類型名變量表列定義了結(jié)構(gòu)體變量后,系統(tǒng)會(huì)為之分配內(nèi)存單元。結(jié)構(gòu)體變量占有的內(nèi)存單元等于各成員占有的內(nèi)存單元之和。sizeof(stu1)=?4+20+4=28┊4B20B4B┊4B20B┊4Bnumnamescorenumnamescorestu1stu216十月2023C語(yǔ)言程序設(shè)計(jì)2、在定義結(jié)構(gòu)體類型的同時(shí)定義變量struct

student{intnum;charname[20];floatscore;}stu1,stu2;3、直接定義結(jié)構(gòu)體類型變量struct{intnum;charname[20];floatscore;}stu1,stu2;(不出現(xiàn)結(jié)構(gòu)體名)struct{intnum;charname[20];floatscore;}stu3;則如下賦值:stu2=stu1;√stu3=stu1;×//類型不一致因此不建議使用這種形式定義結(jié)構(gòu)體變量。也不建議使用!16十月2023C語(yǔ)言程序設(shè)計(jì)編寫程序時(shí)使用方法:#include…#define…structstudent //全局結(jié)構(gòu)體類型{intnum;charname[20];floatscore;};intmain(){

structstudent

stu1,stu2;//局部變量

……}intfun(…){

structstudentstu3;//正確

…}16十月2023C語(yǔ)言程序設(shè)計(jì)4、說(shuō)明①、類型與變量是不同的概念,不要混淆:只能對(duì)變量賦值、存取或運(yùn)算,而不能對(duì)一個(gè)類型賦值、存取或運(yùn)算;在編譯時(shí),對(duì)類型不分配內(nèi)存空間,只對(duì)變量分配空間。

②、結(jié)構(gòu)體變量可以嵌套定義;structdate{intyear;intmonth;intday;};structstudent{intnum;charname[20];

structdatebirth;charaddr[30];};sizeof(structstudent)=?4+20+12+30=66形式一:先定義類型,再定義變量16十月2023C語(yǔ)言程序設(shè)計(jì)structstudent{intnum;charname[20];

structdate{intyear;intmonth;intday;}birth;charaddr[30];};structstudent{intnum;charname[20];

struct{intyear,month,day;}birth;charaddr[30];};問(wèn)題:如何定義本章開(kāi)頭表示圖書(shū)出版年月(不含日)的時(shí)期類型?形式二:定義類型時(shí)定義變量形式三:直接定義變量16十月2023C語(yǔ)言程序設(shè)計(jì)③、成員也可以是指向本結(jié)構(gòu)體類型的指針變量。structstudent{intnum;charname[20];floatscore;

structstudent

*next;};structstudentstu1,stu2,stu3,stu4;stu115001Li87.0stu215002Wang92.5stu315003Zhang90.0stu415004Zhao99.5&stu2&stu3&stu4NULL鏈表16十月2023C語(yǔ)言程序設(shè)計(jì)2結(jié)構(gòu)體變量的引用1、引用形式:結(jié)構(gòu)體變量名.成員名成員運(yùn)算符,優(yōu)先級(jí)為1structstudent{

intnum;charname[20];floatscore;};structstudentstu1,stu2;stu1.num=10001;strcpy(stu1.name,"LiMing");stu1.score=95;16十月2023C語(yǔ)言程序設(shè)計(jì)2、不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體進(jìn)行輸入輸出;printf("%d%s%f",stu1);×scanf("%d%s%f",&stu1);×只能對(duì)結(jié)構(gòu)體中的各個(gè)成員分別進(jìn)行輸入輸出。scanf("%d",&stu1.num);gets();printf("%d,%s,%f\n",stu1.num,,stu1.score);structdate{intyear;intmonth;intday;};structstudent{intnum;charname[20];charsex;structdatebirth;charaddr[30];}stu;stu.birth.year=2002;scanf("%d",&stu.birth.day);printf("%d\n",stu.num);printf("%s\n",);16十月2023C語(yǔ)言程序設(shè)計(jì)例1定義一個(gè)結(jié)構(gòu)體student,成員包括學(xué)號(hào)、姓名和成績(jī),請(qǐng)輸入并輸出該學(xué)生的信息。分析:如何定義結(jié)構(gòu)體student?結(jié)構(gòu)體類型定義在何處?(函數(shù)內(nèi)還是函數(shù)外?若放在函數(shù)外,是放在所有函數(shù)之前還是函數(shù)之間或最后?)①放在函數(shù)內(nèi)外都可以,但一般放在函數(shù)外面,類似全局變量與局部變量;放在函數(shù)內(nèi)則其它函數(shù)不可以使用②放在所有函數(shù)之前,預(yù)處理命令之后,則所有函數(shù)都可以使用如何輸入和輸出學(xué)生信息?定義相應(yīng)的結(jié)構(gòu)體變量,操作該變量的成員如何輸入輸出結(jié)構(gòu)體變量?逐個(gè)輸入輸出其成員EG501.C16十月2023C語(yǔ)言程序設(shè)計(jì)#include<stdio.h>structstudent{intnum;charname[20];floatscore;};intmain(){return0;}structstudents;printf("num:");scanf("%d",&s.num);printf("name:");scanf("%s",);printf("score:");scanf("%f",&s.score);printf("num:%d\n",s.num);printf("name:%s\n",);printf("score:%g\n",s.score);printf("num:");scanf("%d",&s.num);getchar();printf("name:");gets();說(shuō)明:在使用gets函數(shù)前使用getchar函數(shù),把上次的回車符讀走EG501.Cscanf("%d%s%f",&s.num,,&s.score);printf("%d,%s,%f\n",s.num,,s.score);16十月2023C語(yǔ)言程序設(shè)計(jì)3、相同類型的結(jié)構(gòu)體變量可以進(jìn)行整體賦值stu2.num=stu1.num;strcpy(,);stu2.score=stu1.score;stu2=stu1;因此,結(jié)構(gòu)體變量可以作為函數(shù)的參數(shù)。函數(shù)定義:voidfun(structstudentstu

){……}函數(shù)調(diào)用:fun(stu1);16十月2023C語(yǔ)言程序設(shè)計(jì)例2在例1中,請(qǐng)編寫函數(shù)print輸出學(xué)生的信息。intmain(){structstudents;…printf("num:%d\n",s.num);printf("name:%s\n",);printf("score:%g\n",s.score);return0;}函數(shù)定義:voidfun(structstudentstu){……}函數(shù)調(diào)用:fun(stu1);____print(_____________){}structstudentstuvoidprintf("num:%d\n",stu.num);printf("name:%s\n",);printf("score:%g\n",stu.score);print(s);EG502.C16十月2023C語(yǔ)言程序設(shè)計(jì)3結(jié)構(gòu)體變量的初始化在定義結(jié)構(gòu)體變量的同時(shí),對(duì)結(jié)構(gòu)體變量賦初值。structstudent{intnum;charname[20];floatscore;}stu1={15001,"宋紅",89.5};structstudentstu2={15001,"宋紅",89.5};structstudentstu3;stu3={15001,"宋紅",89.5};這是賦值,錯(cuò)誤!C不允許這樣做16十月2023C語(yǔ)言程序設(shè)計(jì)4結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組即基類型是結(jié)構(gòu)體的數(shù)組,數(shù)組中的每個(gè)元素都是結(jié)構(gòu)體變量。定義結(jié)構(gòu)體數(shù)組1、先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體數(shù)組structstudent{intnum;charname[20];floatscore;};structstudentstu[30];16十月2023C語(yǔ)言程序設(shè)計(jì)2、定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體數(shù)組structstudent{intnum;charname[20];floatscore;}stu[30];3、直接定義結(jié)構(gòu)體數(shù)組struct{intnum;charname[20];floatscore;}stu[30];(不建議采用)(不建議采用)16十月2023C語(yǔ)言程序設(shè)計(jì)結(jié)構(gòu)體數(shù)組的初始化structstudent{intnum;charname[20];floatscore;};structstudentstu[]={{10101,"LiMing",95},{10102,"LiuXia",89},{10103,"WangMin",98}};/*給全部數(shù)組元素賦初值時(shí),可以省略數(shù)組大小*/16十月2023C語(yǔ)言程序設(shè)計(jì)5結(jié)構(gòu)體與指針結(jié)構(gòu)體變量的指針就是該變量所占據(jù)的內(nèi)存段的起始地址。1、指向結(jié)構(gòu)體變量指針的定義:structstudent{intnum;charname[20];floatscore;};structstudentstu,*p;p=&stu;注意:不能用指向結(jié)構(gòu)體變量的指針指向該結(jié)構(gòu)體變量(其它類型)的某個(gè)成員。p=&stu.num;int*ip;ip=&stu.num;//正確16十月2023C語(yǔ)言程序設(shè)計(jì)2、訪問(wèn)結(jié)構(gòu)體成員變量的三種方法:①、stu.num、stu.name、stu.score②、(*p).num、(*p).name、(*p).score3、說(shuō)明:①、成員運(yùn)算符"."的優(yōu)先級(jí)高于指針運(yùn)算符"*",因此采用"(*p).成員名"形式時(shí),括號(hào)不能省略;③、p->num、p->name、p->score②、"->"為指向運(yùn)算符,是優(yōu)先級(jí)最高的運(yùn)算符。EG508.C16十月2023C語(yǔ)言程序設(shè)計(jì)#include<stdio.h>structstudent{intnum;charname[20];floatscore;};intmain(){structstudentstu={95101,"LiMing",89.5},*p=&stu;return0;}printf("No.:%d\nName:%s\nScore:%g\n\n",stu.num,

stu.name,stu.score);printf("No.:%d\nName:%s\nScore:%g\n\n",(*p).num,

(*p).name,(*p).score);printf("No.:%d\nName:%s\nScore:%g\n\n",p->num,

p->name,p->score);EG508.C16十月2023C語(yǔ)言程序設(shè)計(jì)5.2共用體所謂“共用體(union)”是指使幾個(gè)不同的變量共占同一段內(nèi)存的數(shù)據(jù)類型。2001200220032004chifcharch;shortinti;//2Bfloatf;EG510.C把變量ch、變量i、變量f放在同一個(gè)地址開(kāi)始的內(nèi)存單元中。即使幾個(gè)不同的變量共占同一段內(nèi)存空間。16十月2023C語(yǔ)言程序設(shè)計(jì)1共用體變量的定義1、先定義共用體類型標(biāo)識(shí)符,再定義變量union

共用體類型標(biāo)識(shí)符{

類型標(biāo)識(shí)符1成員名1;類型標(biāo)識(shí)符2成員名2;

……

……

類型標(biāo)識(shí)符n成員名n;};uniondata{inti;charch;floatf;};union共用體類型標(biāo)識(shí)符

變量名表;uniondataa,b,c;16十月2023C語(yǔ)言程序設(shè)計(jì)2、直接定義共用體變量union

共用體類型標(biāo)識(shí)符{

類型標(biāo)識(shí)符1成員名1;類型標(biāo)識(shí)符2成員名2;

……

……

類型標(biāo)識(shí)符n成員名n;}變量名表;uniondata{inti;charch;floatf;}a,b,c;union{inti;charch;floatf;}a,b,c;3、共用體與結(jié)構(gòu)體的定義形式相似,但含義不同:結(jié)構(gòu)體變量所占的內(nèi)存長(zhǎng)度等于各成員所占的內(nèi)存長(zhǎng)度之和。(每個(gè)成員分別占有自己的內(nèi)存)共用體變量所占的內(nèi)存長(zhǎng)度等于最長(zhǎng)的成員的長(zhǎng)度。(每個(gè)成員占用相同的內(nèi)存)sizeof(uniondata)=416十月2023C語(yǔ)言程序設(shè)計(jì)1、引用形式為:共用體變量名.成員名uniondata{inti;charch;floatf;}a,b,c;a.i引用共用體變量a中的整型變量ia.ch引用共用體變量a中的字符變量cha.f引用共用體變量a中的實(shí)型變量f2、注意:

不能直接引用共用體變量,而只能引用共用體變量的成員printf("%d",a);printf("%d",a.i);printf("%d",a.ch);3、共用體類型數(shù)據(jù)的特點(diǎn):①、同一內(nèi)存段可以用來(lái)存放幾種不同類型的成員,但在某一時(shí)刻只能存放其中一種,而不是同時(shí)存放幾種;2共用體變量的引用16十月2023C語(yǔ)言程序設(shè)計(jì)5.3枚舉類型所謂“枚舉”是指將變量的所有取值一一列舉出來(lái),變量的值只限于列舉出來(lái)的值的范圍內(nèi)。枚舉類型變量的定義:1、先定義枚舉類型標(biāo)識(shí)符,再定義變量enum枚舉類型標(biāo)識(shí)符{枚舉元素1,枚舉元素2,……,枚舉元素n};enum枚舉類型標(biāo)識(shí)符變量列表;enumperson{Man,Woman};enumpersonwang;enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};enumweekdayworkday,weekend;16十月2023C語(yǔ)言程序設(shè)計(jì)2、直接定義枚舉變量enum

枚舉類型標(biāo)識(shí)符{枚舉元素1,枚舉元素2,……,

枚舉元素n}變量列表;enumperson{Man,Woman}wang;enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}workday,weekend;enum

BOOL{FALSE,TRUE};3、說(shuō)明:

Sun、Mon、……、Sat等稱為枚舉元素或枚舉常量。16十月2023C語(yǔ)言程序設(shè)計(jì)枚舉變量的引用1、在C編譯時(shí),對(duì)枚舉元素按常量處理,故稱枚舉常量。它們不是變量,不能對(duì)它們賦值。Sun=0;//錯(cuò)誤TRUE=1;//錯(cuò)誤2、枚舉元素作為常量,它們是有值的。C語(yǔ)言編譯時(shí)按定義時(shí)的順序使它們的值為0、1、2、……enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}workday;workday=Mon;printf("%d\n",workday);3、可以在定義時(shí)改變枚舉元素的值enumweekday{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat}workday;enumweekday{Sun=7,Mon,Tue,Wed=0,Thu,Fri,Sat};EG511.C16十月2023C語(yǔ)言程序設(shè)計(jì)前面程序的特點(diǎn):⑴要想再次看到結(jié)果:必須重新運(yùn)行程序⑵再次運(yùn)行程序時(shí):即使相同的數(shù)據(jù)也必須重新輸入存在的問(wèn)題:⑴運(yùn)行結(jié)果不能保存⑵輸入的數(shù)據(jù)也不能保存能不能把運(yùn)行結(jié)果和運(yùn)行需要的數(shù)據(jù)保存起來(lái)?如何解決?利用文件將數(shù)據(jù)或結(jié)果存儲(chǔ)在磁盤上16十月2023C語(yǔ)言程序設(shè)計(jì)什么是文件?文件的分類:

C語(yǔ)言中,根據(jù)數(shù)據(jù)的組織形式,分為文本文件和二進(jìn)制文件。文件的定義:根據(jù)特定目的而收集在一起并存儲(chǔ)在外部介質(zhì)上的相關(guān)數(shù)據(jù)的集合。16十月2023C語(yǔ)言程序設(shè)計(jì)如:整數(shù)10000

文本文件:把數(shù)據(jù)看成是字符的序列,每一個(gè)字節(jié)存放著一個(gè)字符的ASCII碼,因此又稱為ASCII碼文件,內(nèi)存中存儲(chǔ)形式0010011100010000文本文件:0011000100110000001100000011000000110000

二進(jìn)制文件:把數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣存放二進(jìn)制文件:16十月2023C語(yǔ)言程序設(shè)計(jì)怎么使用文件?如何把程序運(yùn)行結(jié)果保存到文件中?如何把程序運(yùn)行需要的數(shù)據(jù)從文件中取出來(lái)?寫文件文件的兩種操作:讀、寫讀文件16十月2023C語(yǔ)言程序設(shè)計(jì)第六章磁盤數(shù)據(jù)存儲(chǔ)6.1將數(shù)據(jù)寫入文件6.2文件讀/寫函數(shù)分類6.3文件定位函數(shù)☆☆本章在本課程中的地位:一般性了解16十月2023C語(yǔ)言程序設(shè)計(jì)6.1將數(shù)據(jù)寫入文件例6.1將一串字符'A'-'Z'寫入文件d:\letter.txt保存起來(lái)。#include<stdio.h>#include<stdlib.h>intmain(){charch;

FILE*fp;fp=fopen("d:\\letter.txt","w");for(ch='A';ch<='Z';ch++)

fputc(ch,fp);fputc('\n',fp);

fclose(fp);return0;}//定義文件指針,文件操作的步驟1

//新建并打開(kāi)文件,文件操作的步驟2//將數(shù)據(jù)寫入文件,文件操作的步驟3*///關(guān)閉文件,文件操作的步驟4*/EG601.Cif(fp==NULL)/*判斷文件是否打開(kāi)成功*/{printf("Openningfileerror.\n");

exit(0);}//輸出到顯示器上#include<stdio.h>intmain(){charch;for(ch='A';ch<='Z';ch++)putchar(ch);putchar('\n');return0;}16十月2023C語(yǔ)言程序設(shè)計(jì)文件操作的步驟:⑴定義文件類型指針文件類型FILE在頭文件stdio.h中聲明FILE*fp;⑵打開(kāi)文件使用文件,不論是寫入數(shù)據(jù)還是讀出數(shù)據(jù),不論是對(duì)一個(gè)已有的文件進(jìn)行讀寫還是對(duì)新文件進(jìn)行操作,首先都是使用fopen函數(shù)打開(kāi)文件。fp=fopen("letter.txt","w");⑶向文件寫入數(shù)據(jù),或從文件讀取數(shù)據(jù)寫入和讀取的數(shù)據(jù)方式不同,需使用不同的讀寫文件函數(shù);這是最關(guān)鍵的一步。fputc(ch,fp);⑷關(guān)閉文件使用完畢必須關(guān)閉文件,才能徹底的將文件緩沖區(qū)的數(shù)據(jù)寫入文件,并釋放系統(tǒng)分配的文件緩沖區(qū)。fclose(fp);16十月2023C語(yǔ)言程序設(shè)計(jì)一、文件類型指針

文件類型指針的定義格式為:

FILE

*指針變量名;如:FILE*fp;FILE*fp1,*fp2;注意:1.只有通過(guò)文件指針變量才能調(diào)用相應(yīng)的文件

2.FILE必須大寫16十月2023C語(yǔ)言程序設(shè)計(jì)二、文件的打開(kāi)(fopen函數(shù))1.fopen函數(shù)的使用格式:

FILE*fopen(文件名,打開(kāi)方式);

例:FILE

*fp;fp

=fopen("a.txt","w");說(shuō)明:①文件名常以字符串的形式給出;文件名可以帶路徑;

fp=fopen("c:\\Test\\a.txt","r");②如果文件名存放在數(shù)組中,則給出數(shù)組名即可,此時(shí)不能加雙引號(hào);

charstr[30]="c:\\Test\\a.txt";fp=fopen(str,"r");//與①等價(jià)

③打開(kāi)方式是指對(duì)該文件進(jìn)行什么操作。2.文件的打開(kāi)方式:16十月2023C語(yǔ)言程序設(shè)計(jì)使用方式含義文件類型說(shuō)明"r"只讀文本文件為從文件中讀出數(shù)據(jù)而打開(kāi)文件"w"只寫文本文件為往文件中寫入數(shù)據(jù)而打開(kāi)文件"a"追加文本文件為向文件尾部增加數(shù)據(jù)而打開(kāi)文件"r+"讀寫文本文件為讀/寫而打開(kāi)文件"w+"讀寫文本文件為讀/寫而建立一個(gè)新文件"a+"讀寫文本文件為讀/寫而打開(kāi)文件"rb"只讀二進(jìn)制文件為從文件中讀出數(shù)據(jù)而打開(kāi)文件"wb"只寫二進(jìn)制文件為往文件中寫入數(shù)據(jù)而打開(kāi)文件"ab"追加二進(jìn)制文件為向文件尾部增加數(shù)據(jù)而打開(kāi)文件"rb+"讀寫二進(jìn)制文件為讀/寫而打開(kāi)文件"wb+"讀寫二進(jìn)制文件為讀/寫而建立一個(gè)新文件"ab+"讀寫二進(jìn)制文件為讀/寫而打開(kāi)文件fp1=fopen("student.txt","r");fp2=fopen("score.dat","wb+");16十月2023C語(yǔ)言程序設(shè)計(jì)3、說(shuō)明:①、用"r"方式打開(kāi)的文件,要求文件已經(jīng)存在;不能打開(kāi)一個(gè)并不存在的文件,否則出錯(cuò)。②、用"w"方式打開(kāi)文件時(shí):如果指定的文件不存在,則以指定的文件名建立新文件;如果指定的文件存在,則先刪除原來(lái)的文件,再建立新文件。③、用"a"方式打開(kāi)文件時(shí),指定的文件一定要存在,否則出錯(cuò);且自動(dòng)將數(shù)據(jù)寫入文件末尾;16十月2023C語(yǔ)言程序設(shè)計(jì)④、用"r+"、"w+"、"a+"方式打開(kāi)的文件,可以用來(lái)進(jìn)行讀/寫數(shù)據(jù);"r+"方式:……?"w+"方式:……?"a+"方式:……?⑤、如果文件打開(kāi)時(shí)出錯(cuò),如:用"r"方式打開(kāi)一個(gè)并不存在的文件;寫文件時(shí)磁盤有寫保護(hù);磁盤已滿無(wú)法建立新文件等此時(shí)fopen函數(shù)將返回空指針NULL16十月2023C語(yǔ)言程序設(shè)計(jì)常用下面的方法打開(kāi)文件:fp=fopen("score.txt","r");if(fp==NULL){printf("Cannotopenscore.txt!\n");exit(0);}或:if((fp=fopen("score.txt","r"))==NULL){printf("Cannotopenscore.txt!\n");exit(0);}說(shuō)明:exit函數(shù)的作用是關(guān)閉所有文件,結(jié)束程序頭文件:stdlib.h16十月2023C語(yǔ)言程序設(shè)計(jì)三、關(guān)閉文件函數(shù)fclose

使用完一個(gè)文件后應(yīng)該將它關(guān)閉,關(guān)閉后文件指針變量不再指向該文件(此后不能再通過(guò)該指針對(duì)文件進(jìn)行讀/寫操作)fclose的函數(shù)原型為:

int

fclose(FILE*fp)返回值:若正常關(guān)閉,返回0;若關(guān)閉失敗,返回非0例:fp=fopen("f1.c","r");……fclose(fp);關(guān)閉文件的重要性:寫文件時(shí),在"輸出緩沖區(qū)"裝滿后,才將數(shù)據(jù)一起寫入文件。當(dāng)程序結(jié)束時(shí),緩沖區(qū)可能還未滿,如未關(guān)閉文件就結(jié)束程序,則緩沖區(qū)的數(shù)據(jù)不能寫入文件,會(huì)丟失數(shù)據(jù)。使用fclose函數(shù),不論緩沖區(qū)是否已滿,都會(huì)將緩沖區(qū)的數(shù)據(jù)寫入文件,再關(guān)閉文件。16十月2023C語(yǔ)言程序設(shè)計(jì)四、檢測(cè)文件是否結(jié)束函數(shù)feof作用:檢測(cè)對(duì)fp所指向文件的操作是否已經(jīng)達(dá)到了文件尾部feof的函數(shù)原型為:

int

feof(FILE*fp)返回值:非0表示已到文件尾部;0表示未到文件尾部例:while(feof(fp)==0){

……}或:while(!feof(fp)){

……}16十月2023C語(yǔ)言程序設(shè)計(jì)6.2文件讀寫分類函數(shù)1、字符讀寫函數(shù)fputc、fgetc2、字符串讀寫函數(shù)fputs、fgets3、"數(shù)據(jù)塊"讀寫函數(shù)fread、fwrite4、格式化輸入輸出函數(shù)fprintf、fscanf文本文件二進(jìn)制文件均可16十月2023C語(yǔ)言程序設(shè)計(jì)1、字符讀寫函數(shù)⑴fputc()函數(shù):int

fputc(charch,FILE*fp)

作用:將ch中的字符輸出到fp所指向的文件中返回值:輸出成功則返回所輸出的字符,失敗則返回EOF

通常,fputc函數(shù)用于往文本文件中寫入一個(gè)字符。#defineEOF-1例:FILE*fp;charch;fp=fopen("file1.txt","w");if(fp==NULL){printf("Cannotopenfile1.txt!\n");exit(0);}fputc('s',fp);//將字符's'寫入fp指向的文件file1.txtch=getchar();fputc(ch,fp);//將變量ch中的字符寫入文件file1.txtfclose(fp)EG602.C16十月2023C語(yǔ)言程序設(shè)計(jì)⑵fgetc()函數(shù):int

fgetc(FILE*fp)

作用:從fp所指向的文件中讀入一個(gè)字符返回值:返回所讀的字符,如發(fā)生錯(cuò)誤或讀到文件結(jié)束符則返回EOF

……ch=fgetc(fp);while(ch!=EOF){putchar(ch);ch=fgetc(fp);}

注意:EOF是一個(gè)符號(hào)常量,在stdio.h中定義,其值為–1,一般用EOF作為文件結(jié)束符16十月2023C語(yǔ)言程序設(shè)計(jì)2、字符串讀寫函數(shù)⑴fgets函數(shù)格式:fgets(str,n,fp)

說(shuō)明:str:字符數(shù)組名;n:整數(shù)值;fp:文件指針變量作用:從fp所指向的文件中讀(n-1)個(gè)字符,將它們存放到str數(shù)組中,并在其后自動(dòng)加一個(gè)'\0';如果讀入(n-1)個(gè)字符前遇到換行符或文件結(jié)束符EOF,則結(jié)束讀入。返回值:成功返回str數(shù)組的首地址,失敗返回NULL⑵fputs函數(shù)格式:fputs(str,fp)

說(shuō)明:str:字符串常量或字符數(shù)組名或字符指針變量

fp:文件指針變量作用:將str字符串寫到fp所指向的文件中,但'\0'不寫入返回值:成功返回0,出錯(cuò)返回非0值16十月2023C語(yǔ)言程序設(shè)計(jì)例:從鍵盤輸入一行字符,以'\n'結(jié)束,將這行字符保存到磁盤文件"d:\test.txt"中。#include<stdio.h>#include

<stdlib.h>intmain(){

return0;}EG603.CFILE*fp;charstr1[30],str2[30];if((fp=fopen("d:\\test.txt","w"))==NULL){printf("cannotopend:\\test.txt!\n");exit(0);}gets(str1);fputs(str1,fp);fclose(fp);fp=fopen("d:\\test.txt","r");

fgets(str2,30,fp);puts(str2);fclose(fp);16十月2023C語(yǔ)言程序設(shè)計(jì)3、"數(shù)據(jù)塊"讀寫函數(shù)格式: fread(buffer,size,count,fp) fwrite(buffer,size,count,fp)作用:對(duì)fp指向的文件讀/寫count個(gè)大小為size的數(shù)據(jù)項(xiàng)說(shuō)明:(1)buffer:是一個(gè)地址;通常是一個(gè)數(shù)組名對(duì)fread,是從文件中讀取的數(shù)據(jù)要存放的存儲(chǔ)區(qū)的首地址對(duì)fwrite,是向文件中寫入數(shù)據(jù)時(shí)存儲(chǔ)變量的地址(2)size:要讀寫的每個(gè)數(shù)據(jù)項(xiàng)所占用的字節(jié)數(shù)(3)count:要讀寫數(shù)據(jù)項(xiàng)的個(gè)數(shù)(4)fp:文件指針變量注意:用fread,fwrite必須采用二進(jìn)制方式打開(kāi)文件structstudentstu[30];for(i=0;i<30;i++)//從fp指向的文件中讀出30個(gè)學(xué)生的信息

fread(&stu[i],sizeof(stu),1,fp);16十月2023C語(yǔ)言程序設(shè)計(jì)#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;inti,a[10],b[10];if((fp=fopen("datafile.dat","wb+"))==NULL){ printf("Cannotopendatafile.dat!\n"); exit(0);}for(i=0;i<10;i++){ scanf("%d",&a[i]); fwrite(&a[i],sizeof(int),1,fp);}rewind(fp); //使文件指針fp重新指向文件開(kāi)頭

for(i=0;i<10;i++){ fread(&b[i],sizeof(int),1,fp); printf("%4d",b[i]);}fclose(fp);return0;}例:從鍵盤輸入10個(gè)整數(shù),把它們保存到文件“datafile.dat”中,再?gòu)奈募凶x取這些整數(shù),并輸出到顯示器上。EG604.C16十月2023C語(yǔ)言程序設(shè)計(jì)也可以采用下面的形式:#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;inta[10],b[10],i;for(i=0;i<10;i++)scanf("%d",&a[i]);fp=fopen("datafile.dat","wb+");if(fp==NULL){printf("Cannotopenfiledatafile.dat!\n");exit(0);}fwrite(a,sizeof(int),10,fp);

rewind(fp);

fread(b,sizeof(int),10,fp);for(i=0;i<10;i++)printf("%4d",b[i]);fclose(fp);return0;}//或:fwr

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論