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

下載本文檔

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

文檔簡介

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

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

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

……

……類型標識符n成員名n;成員表列(域表)struct{};studentintnum;charname[30];charsex;intage;floatscore;charaddr[50];16十月2023C語言程序設計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)會為之分配內(nèi)存單元。結(jié)構(gòu)體變量占有的內(nèi)存單元等于各成員占有的內(nèi)存單元之和。sizeof(stu1)=?4+20+4=28┊4B20B4B┊4B20B┊4Bnumnamescorenumnamescorestu1stu216十月2023C語言程序設計2、在定義結(jié)構(gòu)體類型的同時定義變量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語言程序設計編寫程序時使用方法:#include…#define…structstudent //全局結(jié)構(gòu)體類型{intnum;charname[20];floatscore;};intmain(){

structstudent

stu1,stu2;//局部變量

……}intfun(…){

structstudentstu3;//正確

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

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

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

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

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

structstudent

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

intnum;charname[20];floatscore;};structstudentstu1,stu2;stu1.num=10001;strcpy(stu1.name,"LiMing");stu1.score=95;16十月2023C語言程序設計2、不能將一個結(jié)構(gòu)體變量作為一個整體進行輸入輸出;printf("%d%s%f",stu1);×scanf("%d%s%f",&stu1);×只能對結(jié)構(gòu)體中的各個成員分別進行輸入輸出。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語言程序設計例1定義一個結(jié)構(gòu)體student,成員包括學號、姓名和成績,請輸入并輸出該學生的信息。分析:如何定義結(jié)構(gòu)體student?結(jié)構(gòu)體類型定義在何處?(函數(shù)內(nèi)還是函數(shù)外?若放在函數(shù)外,是放在所有函數(shù)之前還是函數(shù)之間或最后?)①放在函數(shù)內(nèi)外都可以,但一般放在函數(shù)外面,類似全局變量與局部變量;放在函數(shù)內(nèi)則其它函數(shù)不可以使用②放在所有函數(shù)之前,預處理命令之后,則所有函數(shù)都可以使用如何輸入和輸出學生信息?定義相應的結(jié)構(gòu)體變量,操作該變量的成員如何輸入輸出結(jié)構(gòu)體變量?逐個輸入輸出其成員EG501.C16十月2023C語言程序設計#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();說明:在使用gets函數(shù)前使用getchar函數(shù),把上次的回車符讀走EG501.Cscanf("%d%s%f",&s.num,,&s.score);printf("%d,%s,%f\n",s.num,,s.score);16十月2023C語言程序設計3、相同類型的結(jié)構(gòu)體變量可以進行整體賦值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語言程序設計例2在例1中,請編寫函數(shù)print輸出學生的信息。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語言程序設計3結(jié)構(gòu)體變量的初始化在定義結(jié)構(gòu)體變量的同時,對結(jié)構(gòu)體變量賦初值。structstudent{intnum;charname[20];floatscore;}stu1={15001,"宋紅",89.5};structstudentstu2={15001,"宋紅",89.5};structstudentstu3;stu3={15001,"宋紅",89.5};這是賦值,錯誤!C不允許這樣做16十月2023C語言程序設計4結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組即基類型是結(jié)構(gòu)體的數(shù)組,數(shù)組中的每個元素都是結(jié)構(gòu)體變量。定義結(jié)構(gòu)體數(shù)組1、先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體數(shù)組structstudent{intnum;charname[20];floatscore;};structstudentstu[30];16十月2023C語言程序設計2、定義結(jié)構(gòu)體類型的同時定義結(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語言程序設計結(jié)構(gòu)體數(shù)組的初始化structstudent{intnum;charname[20];floatscore;};structstudentstu[]={{10101,"LiMing",95},{10102,"LiuXia",89},{10103,"WangMin",98}};/*給全部數(shù)組元素賦初值時,可以省略數(shù)組大小*/16十月2023C語言程序設計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)體變量(其它類型)的某個成員。p=&stu.num;int*ip;ip=&stu.num;//正確16十月2023C語言程序設計2、訪問結(jié)構(gòu)體成員變量的三種方法:①、stu.num、stu.name、stu.score②、(*p).num、(*p).name、(*p).score3、說明:①、成員運算符"."的優(yōu)先級高于指針運算符"*",因此采用"(*p).成員名"形式時,括號不能省略;③、p->num、p->name、p->score②、"->"為指向運算符,是優(yōu)先級最高的運算符。EG508.C16十月2023C語言程序設計#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語言程序設計5.2共用體所謂“共用體(union)”是指使幾個不同的變量共占同一段內(nèi)存的數(shù)據(jù)類型。2001200220032004chifcharch;shortinti;//2Bfloatf;EG510.C把變量ch、變量i、變量f放在同一個地址開始的內(nèi)存單元中。即使幾個不同的變量共占同一段內(nèi)存空間。16十月2023C語言程序設計1共用體變量的定義1、先定義共用體類型標識符,再定義變量union

共用體類型標識符{

類型標識符1成員名1;類型標識符2成員名2;

……

……

類型標識符n成員名n;};uniondata{inti;charch;floatf;};union共用體類型標識符

變量名表;uniondataa,b,c;16十月2023C語言程序設計2、直接定義共用體變量union

共用體類型標識符{

類型標識符1成員名1;類型標識符2成員名2;

……

……

類型標識符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)存長度等于各成員所占的內(nèi)存長度之和。(每個成員分別占有自己的內(nèi)存)共用體變量所占的內(nèi)存長度等于最長的成員的長度。(每個成員占用相同的內(nèi)存)sizeof(uniondata)=416十月2023C語言程序設計1、引用形式為:共用體變量名.成員名uniondata{inti;charch;floatf;}a,b,c;a.i引用共用體變量a中的整型變量ia.ch引用共用體變量a中的字符變量cha.f引用共用體變量a中的實型變量f2、注意:

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

枚舉類型標識符{枚舉元素1,枚舉元素2,……,

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

BOOL{FALSE,TRUE};3、說明:

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

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

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

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

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

exit(0);}//輸出到顯示器上#include<stdio.h>intmain(){charch;for(ch='A';ch<='Z';ch++)putchar(ch);putchar('\n');return0;}16十月2023C語言程序設計文件操作的步驟:⑴定義文件類型指針文件類型FILE在頭文件stdio.h中聲明FILE*fp;⑵打開文件使用文件,不論是寫入數(shù)據(jù)還是讀出數(shù)據(jù),不論是對一個已有的文件進行讀寫還是對新文件進行操作,首先都是使用fopen函數(shù)打開文件。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語言程序設計一、文件類型指針

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

FILE

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

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

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

例:FILE

*fp;fp

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

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

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

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

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

int

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

int

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

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

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

fputc(charch,FILE*fp)

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

通常,fputc函數(shù)用于往文本文件中寫入一個字符。#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語言程序設計⑵fgetc()函數(shù):int

fgetc(FILE*fp)

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

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

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

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

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

fp:文件指針變量作用:將str字符串寫到fp所指向的文件中,但'\0'不寫入返回值:成功返回0,出錯返回非0值16十月2023C語言程序設計例:從鍵盤輸入一行字符,以'\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語言程序設計3、"數(shù)據(jù)塊"讀寫函數(shù)格式: fread(buffer,size,count,fp) fwrite(buffer,size,count,fp)作用:對fp指向的文件讀/寫count個大小為size的數(shù)據(jù)項說明:(1)buffer:是一個地址;通常是一個數(shù)組名對fread,是從文件中讀取的數(shù)據(jù)要存放的存儲區(qū)的首地址對fwrite,是向文件中寫入數(shù)據(jù)時存儲變量的地址(2)size:要讀寫的每個數(shù)據(jù)項所占用的字節(jié)數(shù)(3)count:要讀寫數(shù)據(jù)項的個數(shù)(4)fp:文件指針變量注意:用fread,fwrite必須采用二進制方式打開文件structstudentstu[30];for(i=0;i<30;i++)//從fp指向的文件中讀出30個學生的信息

fread(&stu[i],sizeof(stu),1,fp);16十月2023C語言程序設計#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重新指向文件開頭

for(i=0;i<10;i++){ fread(&b[i],sizeof(int),1,fp); printf("%4d",b[i]);}fclose(fp);return0;}例:從鍵盤輸入10個整數(shù),把它們保存到文件“datafile.dat”中,再從文件中讀取這些整數(shù),并輸出到顯示器上。EG604.C16十月2023C語言程序設計也可以采用下面的形式:#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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論