C語言程序設(shè)計 課件 (張惠濤 )第7、8章 結(jié)構(gòu)體、共用體和枚舉類型;文件_第1頁
C語言程序設(shè)計 課件 (張惠濤 )第7、8章 結(jié)構(gòu)體、共用體和枚舉類型;文件_第2頁
C語言程序設(shè)計 課件 (張惠濤 )第7、8章 結(jié)構(gòu)體、共用體和枚舉類型;文件_第3頁
C語言程序設(shè)計 課件 (張惠濤 )第7、8章 結(jié)構(gòu)體、共用體和枚舉類型;文件_第4頁
C語言程序設(shè)計 課件 (張惠濤 )第7、8章 結(jié)構(gòu)體、共用體和枚舉類型;文件_第5頁
已閱讀5頁,還剩56頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1234結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型變量結(jié)構(gòu)體類型數(shù)組共用體第7章結(jié)構(gòu)體、共用體和枚舉類型5枚舉類型結(jié)構(gòu)體類型7.17.1.1結(jié)構(gòu)體類型定義用途:把不同類型的數(shù)據(jù)組合成一個整體——自定義數(shù)據(jù)類型。結(jié)構(gòu)體是一種復(fù)合數(shù)據(jù)類型。結(jié)構(gòu)體類型定義的一般形式struct

結(jié)構(gòu)體類型名

{

數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;……….數(shù)據(jù)類型n成員名n;};7.1.1結(jié)構(gòu)體類型定義實(shí)例:定義結(jié)構(gòu)體類型,描述下列數(shù)據(jù)

(1)學(xué)生情況:包含學(xué)生的學(xué)號、姓名、性別、年齡、成績,住址:

structstudent{intnum;

charname[20];

charsex;

intage;

floatscore;

charaddr[60];};

注:‘;’不能省7.1.1結(jié)構(gòu)體類型定義(2)個人數(shù)據(jù):包含姓名、性別、年齡、身高、體重、住址:structperson{charname[20];//姓名charsex;//性別intage;//年齡floatheight;//身高floatweight;//體重charaddr[60];//住址};

7.1.1結(jié)構(gòu)體類型定義(3)日期結(jié)構(gòu)體類型包括年、月、日:structdate{intyear;intmonth;intday;};(4)如職工信息結(jié)構(gòu)體類型:structperson{charname[20];//姓名charaddress[60];//地址floatsalary;//工資floatcost;//扣款structdatehiredate;//入職日期};結(jié)構(gòu)體類型定義描述結(jié)構(gòu)的組織形式,不分配內(nèi)存7.1.2

結(jié)構(gòu)體類型變量

structstudent{int

num;charname[20];charsex;

intage;floatscore;charaddr[40];};structstudentstu1,stu2;

1.結(jié)構(gòu)體變量的定義(1)先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量7.1.2

結(jié)構(gòu)體類型變量(2)定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量例:structstudent{int

num;charname[20];charsex;

intage;floatscore;charaddr[40];}stu1,stu2;struct結(jié)構(gòu)體名{

成員說明列表;

}變量名列表;

1.結(jié)構(gòu)體變量的定義7.1.2

結(jié)構(gòu)體類型變量例

struct{int

num;charname[20];charsex;

intage;floatscore;charaddr[40];}stu1,stu2;struct{

成員說明表列;

}變量名表列;

1.結(jié)構(gòu)體變量的定義(3)直接定義結(jié)構(gòu)體變量注:這種方式后續(xù)無法再定義這個類型的其他變量7.1.2

結(jié)構(gòu)體類型變量注

意結(jié)構(gòu)體類型與結(jié)構(gòu)體變量概念不同1.類型:不分配內(nèi)存;變量:分配內(nèi)存。2.類型:不能賦值、存取、運(yùn)算;變量:可以。3.結(jié)構(gòu)體可嵌套。4.結(jié)構(gòu)體成員名與程序中變量名可相同,不會混淆。

structstudent{int

num;charname[20];charsex;

intage;floatscore;structdatabirthday;charaddr[40];}stu1,stu2;structdate{intyear;intmonth;intday;};7.1.2

結(jié)構(gòu)體類型變量

2.結(jié)構(gòu)體變量的初始化structstudent/*定義結(jié)構(gòu)數(shù)據(jù)體類型*/{charnum[8];charname[20];charsex;charaddr[40];}stu1={"202203001","zhangsan",'M',"zhufengstreet"};//定義結(jié)構(gòu)體變量stu1,并賦初值例:或者studentstu2={"202203002","lisi",'M',"zhufengstreet"};//定義結(jié)構(gòu)體變量stu2,并賦初值

3.結(jié)構(gòu)體變量的使用(1)結(jié)構(gòu)體變量的引用一般形式為:

結(jié)構(gòu)體變量名.成員名例如,stu1.num表示引用結(jié)構(gòu)體類型structstudent變量stu1中的num成員,因該成員的類型為int型,所以可以對它施行任何int型變量可以施行的運(yùn)算。例如:stu1.num=20312;7.1.2

結(jié)構(gòu)體類型變量還有一種引用形式為:

指針變量名->成員名例如,如下變量定義:structnode{floatx;node*next;}p,u,*pt;7.1.2

結(jié)構(gòu)體類型變量

3.結(jié)構(gòu)體變量的使用(1)結(jié)構(gòu)體變量的引用pt=&p;p.x=12.2;p.next=&u;p.next->x=-23.7;u.next=NULL;12.2&u-23.7NULLpu&ppt

3.結(jié)構(gòu)體變量的使用7.1.2

結(jié)構(gòu)體類型變量(2)結(jié)構(gòu)體變量的輸入與輸出C語言不能把一個結(jié)構(gòu)體變量作為一個整體進(jìn)行輸入或輸出,應(yīng)該按成員變量輸入輸出。例如,若有一個結(jié)構(gòu)體變量:

struct

{charnum[8];charname[20];intage;

charaddr[40];

}stu1={″2022001″,″WangWei″,″18″,″ZhufengStreet288″};應(yīng)該如何輸出stu1變量?

輸出stu1變量,應(yīng)該使用如下方式:

printf(″%s,%s,%d,%s\n″,stu1.num,,stu1.age,stu1.addr);

輸入stu1變量的各成員值,則用:

scanf(″%s%s%d%s″,stu1.num,,&stu1.age,stu1.addr);結(jié)構(gòu)體類型數(shù)組7.2

與定義普通數(shù)組一樣,在結(jié)構(gòu)體數(shù)組名之后指定元素個數(shù),就能定義結(jié)構(gòu)體數(shù)組。例如:

structstudentstu[30];

structpersonemployee[100];

struct

{charname[20];

intnum;

floatprice;

floatquantity;

}part[100];訪問結(jié)構(gòu)體數(shù)組元素的成員的標(biāo)記方法為:

結(jié)構(gòu)體數(shù)組名[元素下標(biāo)].結(jié)構(gòu)體成員名7.2.1結(jié)構(gòu)體類型數(shù)組的定義例如:part[10].price=8.99;printf(“%s”,part[3].name);例

structstudent{charnum[8];charname[20];charsex;intage;}stu[5]={{“2022101”,“張三”,‘M’,18},{“2022102”,“李四”,‘F’,18},{“2022103”,“王五”,‘M’,19},{“2022104”,“周六”,‘F’,19},{“2022105”,“張三”,‘M’,18}};全部初始化時數(shù)組維數(shù)可以省略。7.2.2

結(jié)構(gòu)體類型數(shù)組的初始化例

structstudent{intnum;charname[20];charsex;intage;}stu[5]={{……},{……},{……}};部分初始化,如上所示,只對數(shù)組前三個元素賦初值。7.2.2

結(jié)構(gòu)體類型數(shù)組的初始化(1)引用結(jié)構(gòu)體數(shù)組元素的成員。例如:students[i].num這是序號為i的數(shù)組元素中的num成員。如果數(shù)組已如上初始化,且i=2,則相當(dāng)于students[2].num,其值為”2022103”。(2)可以將一個結(jié)構(gòu)體數(shù)組元素賦給同一結(jié)構(gòu)體類型數(shù)組中的另一個元素,或賦給同一類型的變量。例如:structstudentstudent[3],stu1;現(xiàn)在定義了一個結(jié)構(gòu)體數(shù)組student,它有3個元素,又定義了一個結(jié)構(gòu)體變量stu1,則下面的賦值合法。stu1=student[0];student[2]=student[1];student[1]=stu1;7.2.3

結(jié)構(gòu)體數(shù)組的使用(3)結(jié)構(gòu)體數(shù)組元素的輸入與輸出不能把結(jié)構(gòu)體數(shù)組元素作為一個整體直接進(jìn)行輸入或輸出,只能以單個成員對象進(jìn)行輸入輸出。例如:scanf(“%s”,student[0].name);printff(“%s”,&student[0].num);7.2.3

結(jié)構(gòu)體數(shù)組的使用結(jié)構(gòu)體類型指針7.37.3.1指向結(jié)構(gòu)體變量的指針指向結(jié)構(gòu)體變量的指針的定義形式:struct類型名*指針變量名;例如structdate*pd,date3;pd=&date3;使用結(jié)構(gòu)體指針變量引用成員形式(*結(jié)構(gòu)體指針名).成員名結(jié)構(gòu)體指針名->成員名structdate{intyear;intmonth;intday;};(*pd).monthpd->monthdate3.month7.3.1指向結(jié)構(gòu)體變量的指針總結(jié):結(jié)構(gòu)體成員變量引用方式①結(jié)構(gòu)體變量.成員名②(*p).成員名③p->成員名其中,->稱為指向運(yùn)算符。7.3.2指向結(jié)構(gòu)體數(shù)組元素的指針一個指針變量可以指向一個結(jié)構(gòu)體數(shù)組元素,也就是將該結(jié)構(gòu)體數(shù)組的數(shù)組元素地址賦給此指針變量。例如:struct{inta;floatb;}arr[3],*p;p=arr;此時使p指向arr數(shù)組的第一個元素,“p=arr;”等價于“p=&arr[0];”。若執(zhí)行“p++;”則此時指針變量p此時指向arr[1],指針指向關(guān)系如圖所示。pp++arr[0]arr[1]arr[2]共

型9.47.4.1共用體類型共用體也稱為聯(lián)合體數(shù)據(jù)類型,可把不同類型的數(shù)據(jù)項組成一個整體,這些不同類型的數(shù)據(jù)項可以共用一個共同體空間,且在內(nèi)存中所占用的起始單元是相同的。

1.共用體類型定義

共用體類型的定義形式與結(jié)構(gòu)體類型的定義形式相同,只是其類型關(guān)鍵字不同,共用體的關(guān)鍵字為union。一般形式為union共用體類型名{

成員說明列表};7.4.1共用體類型的定義例如:unionresult{chargrade;floatscore;};共用體是多種數(shù)據(jù)值覆蓋存儲,幾種不同類型的數(shù)據(jù)值從同一地址開始存儲,但任意時刻只存儲其中一種數(shù)據(jù),而不是同時存放多種數(shù)據(jù)。

注意:

2.共用體變量定義

(1)先定義共用體類型,再定義共用體類型變量。例如:unionresult{chargrade;floatscore;};unionresultstu1,stu2;7.4.1共用體類型的定義

(2)在定義共用體類型的同時定義共用體類型變量。例如:

unionresult{chargrade;floatscore;}stu1,stu2;(3)定義共用體類型時,省略共用體類型名,同時定義共用體類型變量。例如:union{

chargrade;floatscore;}stu1,stu2;7.4.1共用體類型的定義

可以引用該共用體變量的某個成員,引用方式與引用結(jié)構(gòu)體變量中的成員相似。例如,

stu1.grade,

stu1.score,一個共用體變量不能同時存放多個成員的值,而只能存放其中的一個值,這就是最后賦給它的值。例如:

stu1.grade=′D′;

stu1.score=61.00;共用體變量中最后的值是61.00。

注意:7.4.2共用體類型變量的使用

(1)共用體變量stu1所占的內(nèi)存單元的字節(jié)數(shù)不是2個成員的字節(jié)數(shù)之和,而是等于2個成員中最長字節(jié)的成員所占內(nèi)存空間的字節(jié)數(shù),也就是說,stu1的2個成員共享4個字節(jié)的內(nèi)存空間。7.4.2共用體類型變量的使用gradescore共用體成員所占空間示意圖

(2)變量stu1中不能同時存在2個成員,只是可以根據(jù)需要用stu1存放一個字符數(shù)據(jù),或存放一個浮點(diǎn)數(shù)。例如:stu1.grade=’A’;

stu1.score=100.00;7.4.2共用體類型變量的使用字符’A’占用了stu1的1個字節(jié)。2條賦值語句,如果按順序執(zhí)行,只有最后一個語句“stu1.score=100.00;“的結(jié)果保留下來,前面的字符’A’被100.00覆蓋了。

(3)共用體一般不單獨(dú)使用,通常作為結(jié)構(gòu)體的成員,這樣結(jié)構(gòu)體可根據(jù)不同情況放不同類型的數(shù)據(jù)。7.4.2共用體類型變量的使用例如,需要把學(xué)生和教師的數(shù)據(jù)放在一起處理。學(xué)生和教師的數(shù)據(jù)相同的分量有:姓名、編號和身份。但也有不同的部分:學(xué)生需要保存10門課程的分?jǐn)?shù),分?jǐn)?shù)用浮點(diǎn)數(shù)表示,教師則保存工作情況簡介,用字符串表示。教師和學(xué)生的不同部分可以用共用體描述。例如:程序示例:unioncondition{floatscore[10];

charsituation[80];};structperson{charname[20];

charnum[10];

charkind;

unionconditionstate;}personnel[30];7.4.2共用體類型變量的使用例:利用共用體變量表示學(xué)生的期末成績。#include<stdio.h>unionresult{ chargrade; floatscore;};structstudent{ char*num; char*name; unionresultr;}stu1,stu2;voidmain(){ stu1.num="202203001"; ="zhangjun"; stu1.r.score=86; stu1.r.grade='B';//覆蓋了前面的分?jǐn)?shù)賦值,stu1輸出等級 stu2.num="202203002"; ="liming"; stu2.r.grade='C'; stu2.r.score=78;//覆蓋了前面的等級賦值,stu2輸出分?jǐn)?shù) printf("%s%s%c\n",stu1.num,,stu1.r.grade); printf("%s%s%.2f\n",stu2.num,,stu2.r.score);}枚

型7.57.5

枚舉類型用枚舉方法列舉一組標(biāo)識符作為枚舉類型的值的集合。當(dāng)一個變量具有這種枚舉類型時,它就能取枚舉類型的標(biāo)識符值。枚舉類型定義的一般形式為:

enum

枚舉類型名{標(biāo)識符1,標(biāo)識符2,…,標(biāo)識符n};定義一個枚舉類型和枚舉變量如下:enumcolorname{red,yellow,blue,white,black};enumcolornamecolor;變量color是枚舉類型enumcolorname,它的值只能是red、yellow、blue、white、black。7.5

枚舉類型同結(jié)構(gòu)體和共用體類似,枚舉類型變量的定義也有3種。(1)先定義枚舉類型,再定義變量(2)定義枚舉類型的同時定義變量(3)直接定義枚舉類型變量7.5

枚舉類型注

意枚舉元素不是變量,不能改變其值。枚舉元素作為常量,它們的值就是從0的序號。但不能將一個整數(shù)賦給枚舉變量。枚舉常量可以進(jìn)行比較運(yùn)算。枚舉常量不是字符串。本章小結(jié)構(gòu)造數(shù)據(jù)類型將多種不同數(shù)據(jù)類型、且相互關(guān)聯(lián)的一組數(shù)據(jù),組合成一個有機(jī)的整體來使用,構(gòu)造數(shù)據(jù)類型的內(nèi)存空間分配遵循前面所講數(shù)據(jù)存儲類型的規(guī)則,是C語言進(jìn)行復(fù)雜數(shù)據(jù)處理的基礎(chǔ)。本章是C語言程序設(shè)計的提高部分,要求重點(diǎn)掌握結(jié)構(gòu)體類型、共用體類型和枚舉數(shù)據(jù)類型的概念,掌握各自的定義、初始化及其引用方式,它們在程序設(shè)計中的應(yīng)用。感謝觀看第八章文件文件68.1文件基本概念及分類8.2文件類型指針8.3文件的打開與關(guān)閉8.4文件的讀寫8.5文件的定位8.6C語言學(xué)習(xí)之路8.7本章小結(jié)8.1文件基本概念及分類文件在計算機(jī)領(lǐng)域是一個重要的概念,它其實(shí)是指存儲在計算機(jī)外存上的一組相關(guān)數(shù)據(jù)的有序集合。數(shù)據(jù)集合的名稱就叫文件名,在系統(tǒng)當(dāng)中是唯一的,是其本身的操作標(biāo)志。前面的各章中涉及到的源程序文件、目標(biāo)文件、可執(zhí)行文件、庫文件等等都可以叫作文件。C語言提供了強(qiáng)大的機(jī)制支持文件的各類操作。本章重點(diǎn)圍繞ASCII碼文件和二進(jìn)制碼文件進(jìn)行學(xué)習(xí)。ASCII文件也叫文本文件,它在磁盤中存放時每個字節(jié)存儲一個ASCII表示的字符。文本文件是可以直接閱讀的,可使用記事本打開,其擴(kuò)展名為.txt。二進(jìn)制文件是按內(nèi)存中的二進(jìn)制的存儲形式原樣輸出到磁盤上來保存,因此這類文件一般不能使用記事本直接打開來閱讀其中內(nèi)容。C系統(tǒng)在處理文件時,就把文件看成是字節(jié)流或二進(jìn)制流,按字節(jié)進(jìn)行處理。本章將重點(diǎn)講解ANSIC規(guī)定文件系統(tǒng)及其標(biāo)準(zhǔn)輸入輸出函數(shù)。8.2文件類型指針?biāo)^文件指針,實(shí)際上是指向結(jié)構(gòu)體類型的指針變量,這個結(jié)構(gòu)體中包含文件的信息,如緩沖區(qū)的地址,在緩沖區(qū)中當(dāng)前存取的字符的位置,對文件是“讀”還是“寫”,是否出錯,是否已經(jīng)遇到文件結(jié)束標(biāo)志等信息。此結(jié)構(gòu)體類型名為FILE,可以由此類型來定義文件指針。定義文件類型指針變量的一般形式為: FILE*指針變量標(biāo)識符;例如: FILE*fp;fp被定義為指向文件類型的指針變量,稱為文件指針。文件指針用于指向多個文件,實(shí)際上是用于存放文件緩沖區(qū)的地址。在緩沖文件系統(tǒng)中可以進(jìn)行文件的打開、關(guān)閉、讀、寫、定位等操作。結(jié)構(gòu)類型名“FILE”必須大寫。一般情況下對文件操作有3個步驟:打開文件,即在計算機(jī)內(nèi)存中開辟緩沖區(qū),用于存放被打開文件的相關(guān)信息;文件處理,包括讀寫、定位等操作;關(guān)閉文件,將緩沖區(qū)中的內(nèi)容寫回到磁盤,然后釋放緩沖區(qū)。8.3文件的打開與關(guān)閉8.3.1文件打開函數(shù)fopen()fopen()函數(shù)用來打開一個文件,其調(diào)用的一般形式為:

文件指針名=fopen(文件名,打開文件方式)其中,“文件指針名”必須是被說明為FILE類型的指針變量;“文件名”是被打開文件的文件名,

以字符串常量或字符串?dāng)?shù)組的形式出現(xiàn);“打開文件方式”是指文件的類型和操作要求。例如: FILE*fp; fp=("C:\\myfile.txt","wt");其意義是在C盤根目錄下只寫打開或建立一個文本文件myfile,只允許寫數(shù)據(jù)操作,并使文件指針fp指向該文件。文件名字符串中兩個反斜線“\\”中的第一個表示轉(zhuǎn)義字符,第二個表示根目錄。8.3文件的打開與關(guān)閉8.3.1文件打開函數(shù)fopen()打開文件的方式有12種,如下表所示打開方式文件類型含義“r”文本文件只讀打開一個文本文件,只允許讀數(shù)據(jù)“w”文本文件只寫打開或建立一個文本文件,只允許寫數(shù)據(jù)“a”文本文件追加打開一個文本文件,并在文件末尾寫數(shù)據(jù)“r+”文本文件讀寫打開一個文本文件,允許讀和寫“w+”文本文件讀寫打開或建立一個文本文件,允許讀寫“a+”文本文件讀寫打開一個文本文件,允許讀,或在文件末追加數(shù)據(jù)“rb”二進(jìn)制文件只讀打開一個二進(jìn)制文件,只允許讀數(shù)據(jù)“wb”二進(jìn)制文件只寫打開或建立一個二進(jìn)制文件,只允許寫數(shù)據(jù)“ab”二進(jìn)制文件追加打開一個二進(jìn)制文件,并在文件末尾寫數(shù)據(jù)“rb+”二進(jìn)制文件讀寫打開一個二進(jìn)制文件,允許讀和寫“wb+”二進(jìn)制文件讀寫打開或建立一個二進(jìn)制文件,允許讀和寫“ab+”二進(jìn)制文件讀寫打開一個二進(jìn)制文件,允許讀,或在文件末追加數(shù)據(jù)8.3文件的打開與關(guān)閉8.3.2文件關(guān)閉函數(shù)fclose()文件一旦使用完畢,要用關(guān)閉文件函數(shù)fclose()把文件關(guān)閉,以避免文件的數(shù)據(jù)丟失等情況發(fā)生。fclose()函數(shù)調(diào)用的一般形式是: fclose(文件指針);例如: fclose(fp);正常完成關(guān)閉文件操作時,fclose()函數(shù)返回值為0;返回非零值表示有錯誤發(fā)生。8.3文件的打開與關(guān)閉例8.1演示打開和關(guān)閉文本文件#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;if((fp=fopen("c:\\myfile.txt","wt"))==NULL){printf("打開文件失敗\n");exit(0);}printf("打開文件成功!");//此處可替換為對文件的讀寫操作語句

if(fclose(fp)==0)printf("\n成功關(guān)閉文件!\n");elseprintf("\n未成功關(guān)閉文件!\n");system("pause");return0;}本程序演示了文件打開和關(guān)閉的過程。如果文件未成功打開,則打印“不能打開文件”,否則打印“文件被成功打開!”;如果文件成功關(guān)閉,則打印“成功關(guān)閉文件!”。正常情況下,該程序會在C盤根目錄下以讀寫的方式建立myfile.txt文件,然后再把它關(guān)閉。8.4文件的讀寫8.4.1字符讀寫函數(shù):fgetc()和fputc()1、fputc()功能是將多個字符寫到文件中,一般形式為:fputc(字符數(shù)據(jù),文件指針);例如:charc=‘a(chǎn)’;fput(c,fp);//其中fp是已經(jīng)正確打開的可寫文件的指針該語句將變量c的值寫入fp所指向的文件中。2、fgetc()功能是從文件中讀取多個字符,一般形式為:fgetc(文件指針);例如:charch;ch=fgetc(fp);表示從文件fp中讀取多個字符,賦給變量ch,而fp的位置指針向前移動到下一個字符。8.4文件的讀寫8.4.1字符讀寫函數(shù):fgetc()和fputc()例8.2演示向打開的文本文件中寫入或讀取一個字符#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;charch='a';charch1='b';//ch1初始值設(shè)置為’b’if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打開文件失??!\n");exit(0);}

printf("打開文件成功!\n");fputc(ch,fp);rewind(fp);//將文件指針重新指向文件開頭

printf("ch1初始值為:%c\n",ch1);ch1=fgetc(fp);printf("ch1現(xiàn)在的值為:%c\n",ch1);

if(fclose(fp)==0)printf("關(guān)閉文件成功!\n");elseprintf("關(guān)閉文件失??!\n");system("pause");return0;}8.4文件的讀寫8.4.2字符串讀寫函數(shù):fgets()和fputs()1、fputs()功能是向指定文件輸出字符串,一般形式為:fputs(字符串,文件指針);2、fgets()功能是從文件中讀字符串,一般形式為:fgets(字符串起始地址,字符數(shù)量,文件指針);例8.3演示向打開的文本文件中寫入或讀取字符串#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;charch[]=”helloworld”;charch1[30]=”abcdefg”;if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打開文件失?。n");exit(0);

}printf("打開文件成功!\n");fputs(ch,fp);rewind(fp);//將文件指針重新指向文件開頭printf("ch1初始值為:%s\n",ch1);fgets(ch1,4,fp);//從文件中取4-1=3個字符,留一個字節(jié)存放’\0’printf("ch1現(xiàn)在的值為:%s\n",ch1);

if(fclose(fp)==0)printf("關(guān)閉文件成功!\n");elseprintf("關(guān)閉文件失敗!\n");system("pause");return0;}8.4文件的讀寫8.4.3數(shù)據(jù)塊讀寫函數(shù):freed()和fwrite()1、fread()函數(shù)的功能是從文件中讀取數(shù)據(jù)塊,一般形式為: fread(buffer,size,count,fp);關(guān)于fread()的幾點(diǎn)說明:(1)fp是文件指針;buffer是一個指針,用來存放輸出數(shù)據(jù)塊的地址;size表示數(shù)據(jù)塊的字節(jié)數(shù);count表示要讀取的數(shù)據(jù)塊塊數(shù);(2)fread()函數(shù)的功能是從fp所指向文件的當(dāng)前位置開始,一次讀取size個字節(jié),重復(fù)count次,并將讀取的數(shù)據(jù)存放到從buffer開始的內(nèi)存中;同時,將位置指針向前移動size*count個字節(jié);(3)如果調(diào)用fread()函數(shù)成功,則函數(shù)返回值等于count。2、fwrite函數(shù)的功能是向文件寫數(shù)據(jù)塊,其調(diào)用的一般形式為: fwrite(buffer,size,count,fp);關(guān)于fwrite()的幾點(diǎn)說明:(1)fp是文件指針;buffer是一個指針,用來存放將要讀取數(shù)據(jù)塊的地址;size表示一個數(shù)據(jù)塊的字節(jié)數(shù);count表示要寫的數(shù)據(jù)塊個數(shù);(2)fwrite()函數(shù)功能是從buffer指定的地址開始,一次輸出size個字節(jié),重復(fù)count次,并將輸出的數(shù)據(jù)存放到fp所指向的文件中;同時,將位置指針向前移動size*count個字節(jié)。(3)如果調(diào)用fwrite函數(shù)成功,則函數(shù)返回值等于count。8.4文件的讀寫8.4.3數(shù)據(jù)塊讀寫函數(shù):freed()和fwrite()例8.4演示向打開的文本文件中寫入或讀取若干數(shù)據(jù)塊#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;charch[]="Helloeveryone,howareyou?";charch1[30]="1234567890";if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打開文件失??!\n");exit(0);}

printf("打開文件成功!\n");fwrite(ch,5,3,fp);//從ch字符串中取3*5=15個字符的

//數(shù)據(jù)存入fp中rewind(fp);//將文件指針重新指向文件開頭printf("ch1初始值為:%s\n",ch1);

fread(ch1,4,2,fp);//從fp中取2*4=8個字符的

//數(shù)據(jù)存入ch1字符數(shù)組中printf("ch1現(xiàn)在的值為:%s\n",ch1);

if(fclose(fp)==0)printf("關(guān)閉文件成功!\n");elseprintf("關(guān)閉文件失敗!\n");system("pause");return0;}8.4文件的讀寫8.4.4格式化讀寫函數(shù):fscanf()和fprinf()1、fprintf()函數(shù)只能向文本文件中輸出數(shù)據(jù)。fprintf()函數(shù)和printf()函數(shù)相似,只是輸出的內(nèi)容將按指定格式存放到磁盤的文本文件中,而不是屏幕上。fprintf()函數(shù)的調(diào)用形式如下: fprintf(文件指針,格式控制字符串,輸出項表);//參考printf()函數(shù) fprintf(fp,"%d%d",x,y);//fp為以寫入的方式正確打開的文件指針2、fscanf()函數(shù)只能從文本文件中按格式輸出。fscanf()函數(shù)和scanf()函數(shù)相似,其輸出的對象是磁盤上文本文件中的數(shù)據(jù),而不是鍵盤的輸入數(shù)據(jù)。fscanf()函數(shù)的調(diào)用形式如下: fscanf(文件指針,格式控制字符串,輸出項表);//參考scanf()函數(shù) fscanf(fp,"%d%d",&a,&b);

8.4文件的讀寫8.4.4格式化讀寫函數(shù):fscanf()和fprinf()例8.5演示按指定格式向打開的文本文件中寫入或讀取一個字符#include"stdio.h"#include"stdlib.h"intmain(){FILE*fp;charch=’x’;charch1=’a’;if((fp=fopen("c:\\myfile.txt","w+"))==NULL){printf("打開文件失??!\n");exit(0);}printf("打開文件成功!\n");fprintf(fp,”%c”,ch);//向打開的文件中輸出ch中的值’x’rewind(fp);//將文件指針重新指向文件開頭printf("ch1初始值為:%c\n",ch1);fscanf(fp,”%c”,&ch1);//從打開的文件中輸入一個字符,保存到ch1中

//與scanf()用法一樣,參數(shù)要使用&表示地址printf("ch1現(xiàn)在的值為:%c\n",ch1);if(fclose(fp)==0)printf("關(guān)閉文件成功!\n");elseprintf("關(guān)閉文件失?。n");

溫馨提示

  • 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

提交評論