C語言程序設(shè)計實例教程(慕課版)(第3版)課件 常中華 第9、10章 函數(shù);結(jié)構(gòu)體、共用體、枚舉、鏈表_第1頁
C語言程序設(shè)計實例教程(慕課版)(第3版)課件 常中華 第9、10章 函數(shù);結(jié)構(gòu)體、共用體、枚舉、鏈表_第2頁
C語言程序設(shè)計實例教程(慕課版)(第3版)課件 常中華 第9、10章 函數(shù);結(jié)構(gòu)體、共用體、枚舉、鏈表_第3頁
C語言程序設(shè)計實例教程(慕課版)(第3版)課件 常中華 第9、10章 函數(shù);結(jié)構(gòu)體、共用體、枚舉、鏈表_第4頁
C語言程序設(shè)計實例教程(慕課版)(第3版)課件 常中華 第9、10章 函數(shù);結(jié)構(gòu)體、共用體、枚舉、鏈表_第5頁
已閱讀5頁,還剩104頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

單元9結(jié)構(gòu)體和共用體摘要9.1結(jié)構(gòu)體類型9.1.1結(jié)構(gòu)體類型的定義9.1.2結(jié)構(gòu)體變量的定義9.1.3結(jié)構(gòu)體變量的初始化9.1.4結(jié)構(gòu)體變量的引用9.2結(jié)構(gòu)體數(shù)組9.3結(jié)構(gòu)體指針9.4結(jié)構(gòu)體與函數(shù)9.5鏈表9.5.1鏈表的概念9.5.2鏈表的實現(xiàn)9.5.3鏈表的操作9.6構(gòu)造數(shù)據(jù)類型-共用體9.6.1共用體類型的定義9.6.2共用體變量的定義9.6.3共用體變量的初始化和引用9.7枚舉類型9.7.1枚舉類型的定義9.7.2枚舉變量的定義9.8使用typedef聲明新類型實例分析與實現(xiàn)9.1結(jié)構(gòu)體類型9.1.1結(jié)構(gòu)體類型的定義學(xué)生:學(xué)號 intsno;姓名 charname[20];班級 charclassname[20];課程成績

intgrade[3];將多個不同類型的數(shù)據(jù)組成一個“整體”9.1.1結(jié)構(gòu)體類型的定義struct結(jié)構(gòu)體類型名稱{

數(shù)據(jù)類型成員名1;

數(shù)據(jù)類型成員名2; …

數(shù)據(jù)類型成員名n;};【例】structstudent{ intsno; //學(xué)號 charname[20]; //姓名 charclassname[20];//班級

intgrade[3];//成績};9.1結(jié)構(gòu)體類型9.1.2結(jié)構(gòu)體變量的定義9.1.2結(jié)構(gòu)體變量的定義結(jié)構(gòu)體類型變量:structstudent{ intsno; charname[20]; charclassname[20]; intgrade[3];};structstudentstu1;基本數(shù)據(jù)類型變量 int x; float y; char c;數(shù)據(jù)類型名變量名數(shù)據(jù)類型名變量名9.1.2結(jié)構(gòu)體變量的定義2.在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量structstudent{ intsno; charname[20]; charclassname[20]; intgrade[3];};stu1;1.先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量structstudent{ intsno;

charname[20]; charclassname[20]; intgrade[3];};structstudentstu1;3.直接定義結(jié)構(gòu)體變量struct{ intsno; charname[20];

charclassname[20]; intgrade[3];};stu1;9.1.2結(jié)構(gòu)體變量的定義structstudent{ intsno; charname[20]; charclassname[20]; intgrade[3];};stu1;

結(jié)構(gòu)體變量定義后,編譯器就會為其分配內(nèi)存。它所占用的實際字節(jié)數(shù),就是其各個“成員”所占用字節(jié)數(shù)的總和。本例中變量stu1中各成員所占用內(nèi)存:9.1結(jié)構(gòu)體類型9.1.3結(jié)構(gòu)體變量的初始化9.1.3結(jié)構(gòu)體變量的初始化在定義結(jié)構(gòu)體類型和結(jié)構(gòu)體變量的同時,對結(jié)構(gòu)體變量初始化?!纠縮tructstudent{ intsno; charname[20]; charclassname[20]; intgrade[3]}stu1{201601,"李磊","軟件16級1班",{90,85,80}};9.1結(jié)構(gòu)體類型9.1.4結(jié)構(gòu)體變量的引用9.1.4結(jié)構(gòu)體變量的引用如何引用結(jié)構(gòu)體變量中的一個成員,其語法結(jié)構(gòu)是:結(jié)構(gòu)體變量名.成員名【例】stu1.sno=20160101;="李磊";stu1.classname="軟件16級1班";stu1.grade[0]=90;stu1.grade[1]=85;stu1.grade[2]=80;“.”是一個運算符,表示對結(jié)構(gòu)體變量的成員進(jìn)行訪問9.1.4結(jié)構(gòu)體變量的引用【例】要求通過鍵盤輸入一個學(xué)生信息,并且輸出這個學(xué)生的所有信息。

分析:1、定義結(jié)構(gòu)體類型student描述學(xué)生信息。其成員包括學(xué)號、姓名、班級、三門課程成績。

2、通過鍵盤輸入每個成員的數(shù)據(jù)。9.1.4結(jié)構(gòu)體變量的引用【例】從鍵盤輸入學(xué)生信息,計算該學(xué)生的成績平均分,并輸出該學(xué)生的信息。

分析:1、定義結(jié)構(gòu)體類型student描述學(xué)生信息。

2、學(xué)生的成績是該結(jié)構(gòu)體類型中的一個成員,使用數(shù)組類型存儲數(shù)據(jù),通過遍歷數(shù)組中的數(shù)組元素,經(jīng)過累加求和,就可以計算成績的平均分。9.2結(jié)構(gòu)體數(shù)組structstudent{ intsno; charname[20];

charclassname[20]; doublegrade[3]};structstudentstu;如何描述30個學(xué)生信息?9.2結(jié)構(gòu)體數(shù)組【例】structstudent{ intsno; charname[20]; charclassname[20]; doublegrade[3]};structstudentstu[30];9.2結(jié)構(gòu)體數(shù)組【例】要求通過鍵盤輸入兩個學(xué)生信息,并且輸出這兩個學(xué)生的所有信息。分析:1、定義一個包含2個元素的數(shù)組,數(shù)組元素的類型是結(jié)構(gòu)體類型。2、使用循環(huán)結(jié)構(gòu)遍歷訪問數(shù)組元素。9.3結(jié)構(gòu)體指針9.3結(jié)構(gòu)體指針【例】structstudent{ intsno; charname[20]; charclassname[20]; doublegrade[3]};structstudents

={201601,"李磊","軟件16級1班",{90,85,80}};;structstudent*p;p=&s;9.3結(jié)構(gòu)體指針*(結(jié)構(gòu)體指針變量).成員名(*p).sno=20160101;(*p).name="李磊";(*p).grade[0]=90;p->.sno=20160101;p->.name="李磊";p->.grade[0]=90;結(jié)構(gòu)體指針變量->.成員名【例】要求通過鍵盤輸入一個學(xué)生信息,并且輸出這個學(xué)生的所有信息。(用指針變量引用結(jié)構(gòu)體變量的成員。)9.3結(jié)構(gòu)體指針9.4結(jié)構(gòu)體與函數(shù)結(jié)構(gòu)體與函數(shù)的關(guān)系主要分為三種:結(jié)構(gòu)體變量作為函數(shù)參數(shù)結(jié)構(gòu)體指針作為函數(shù)參數(shù)函數(shù)的返回值是結(jié)構(gòu)體類型。9.4結(jié)構(gòu)體與函數(shù)

#include<stdio.h>structstudent{ intsno; charname[20];

doublegrade[3];};voidshowStuInfo(structstudentstu){ printf("學(xué)號:%d\n",stu.sno); printf("姓名:%s\n",); printf("課程1:%lf\n",stu.grade[0]); printf("課程2:%lf\n",stu.grade[1]); printf("課程3:%lf\n",stu.grade[2]);}intmain(){ structstudentstu1={20160101,"李磊",{90,85,80}};

showStuInfo(stu1); return0;}值傳遞#include<stdio.h>structstudent{ intsno; charname[20]; doublegrade[3];};voidshowStuInfo(structstudent*p)//結(jié)構(gòu)體指針作函數(shù)參數(shù){ printf("學(xué)號:%d\n",(*p).sno); printf("姓名:%s\n",(*p).name);

printf("課程1:%lf\n",(*p).grade[0]); printf("課程2:%lf\n",(*p).grade[1]); printf("課程3:%lf\n",(*p).grade[2]);}intmain(){ structstudentstu1={20160101,"李磊",{90,85,80}};

showStuInfo(&stu1); return0;}地址傳遞函數(shù)的參數(shù)是結(jié)構(gòu)體變量

值傳遞函數(shù)的參數(shù)是結(jié)構(gòu)體指針

地址傳遞9.5鏈表頭指針:存儲的是第一個結(jié)點的首地址。結(jié)點:鏈表中的每一個元素。

數(shù)據(jù)域:存儲用戶需要的數(shù)據(jù)

指針域:存儲下一個結(jié)點的地址9.5.1鏈表的概念鏈表

在執(zhí)行過程中根據(jù)需要動態(tài)申請空間,結(jié)點的個數(shù)可以根據(jù)需要增加或減少。

占用不連續(xù)的存儲空間。數(shù)組

定義時必須指定數(shù)組長度,所占用的內(nèi)存空間大小固定。

占用連續(xù)的存儲空間。9.5.1鏈表的概念結(jié)點的定義structnode{ intdata;

structnode*next;};9.5.2鏈表的實現(xiàn)1、初始化鏈表2、在尾結(jié)點后插入新結(jié)點9.5.2鏈表的實現(xiàn)structnode*h,*s;h=NULL;//建立“空”鏈表s=(structnode*)malloc(sizeof(structnode));//建立首結(jié)點s->next=NULL;h=s; 1、初始化鏈表9.5.2鏈表的實現(xiàn)p=(structnode*)malloc(sizeof(structnode));p->data=1;

p->next=NULL;s->next=p;s=p;2、在尾結(jié)點后插入新結(jié)點9.5.2鏈表的實現(xiàn)p=h->next;//指針指向第一個結(jié)點while(p!=NULL){

printf("%d\n",p->data);

p=p->next;//指針指向下一個結(jié)點}

9.5.3鏈表的操作9.6共用體類型9.6.1共用體類型的定義union結(jié)構(gòu)體類型名稱{

數(shù)據(jù)類型成員名1;

數(shù)據(jù)類型成員名2; …

數(shù)據(jù)類型成員名n;};【例】uniondata{ intx; doubley; charz;};9.6.2共用體變量的定義共用體類型變量:uniondata{ intx; doubley; charz;};uniondatad1;數(shù)據(jù)類型名變量名【例】#include<stdio.h>uniondata{ intx; doubley; charz;};intmain(){ uniondatad1; printf("%d\n",sizeof(d1)); return0;}9.6.2共用體變量的定義【例】#include<stdio.h>uniondata{ intx; doubley; charz;};intmain(){ uniondatad1; printf("%d\n",sizeof(d1)); return0;}編譯器為共用體變量分配空間是是按照其成員中字節(jié)數(shù)最大的數(shù)目分配9.6.3共用體變量的初始化

在定義共用體變量的同時,只能對其中一個成員進(jìn)行初始化操作,這與它的內(nèi)存分配方式是對應(yīng)的。【例】uniondata{ intx; doubley; charz;};uniondatad1={8};9.6.3共用體變量的引用【例】#include<stdio.h>uniondata{ intx; charz;};intmain(){ uniondatad1; d1.x=8; d1.z='a'; printf("d1.x=%d\n",d1.x); printf("d1.z=%c\n",d1.z); return0;}9.7枚舉類型9.7.1枚舉類型的定義enum枚舉類型名稱{

枚舉元素列表};【例】enumSeason{Spring,Summer,Autumn,Winter};9.7.2枚舉變量的定義枚舉變量的定義和結(jié)構(gòu)體變量的定義類似,可以采用3種方式。本小節(jié)中僅就“先定義枚舉類型,再定義枚舉變量”方式進(jìn)行說明。【例】enumSeason{Spring,Summer,Autumn,Winter};enumSeasons;s=Summer;類型定義C語言允許用戶使用typedef語句定義新的數(shù)據(jù)類型名代替已有的數(shù)據(jù)類型名。類型定義的一般形式為:typedef類型名新類型名9.8使用tyepdef聲明新類型

【例】typedefstructstudent{ intsno; charname[20]; charclassname[20]; intgrade[3]}STU;其中,STU就是新類型名。使用typedef只是定義了一個新的類型名稱,代替已有的類型名,并沒有建立一個新的數(shù)據(jù)類型。實例分析與實現(xiàn)編程實現(xiàn)學(xué)生成績的匯總統(tǒng)計。要求實現(xiàn)的功能包括:從鍵盤錄入學(xué)生成績信息,包括學(xué)號、姓名、班級、課程成績。計算每位學(xué)生的總成績和平均成績。分析:1、使用模塊化程序設(shè)計思想,用函數(shù)實現(xiàn)每一個功能模塊。2、使用結(jié)構(gòu)體數(shù)組做函數(shù)參數(shù)。voidinput(structstudentstu[],intlen)intsum(structstudentstu[],intlen)structstudent{

intsno; charname[20]; charclassname[20];

intgrade[3];};第10單元文件摘要10.1文件概述10.1.1文件分類10.1.2文件指針10.2文件的打開和關(guān)閉10.3文件的讀寫數(shù)10.3.1字符讀寫函10.3.2字符串讀寫函數(shù)10.3.3數(shù)據(jù)塊讀寫函數(shù)10.3.4格式化讀寫函數(shù)10.4文件的定位實例分析與實現(xiàn)10.1文件概述10.1.1文件分類什么是文件?所謂“文件”是指一組相關(guān)數(shù)據(jù)的有序集合。這個數(shù)據(jù)集有一個名稱,叫做文件名。實際上在前面的各章中我們已經(jīng)多次使用了文件,例如源程序文件、目標(biāo)文件、可執(zhí)行文件、庫文件(頭文件)等。文件通常是駐留在外部介質(zhì)(如磁盤等)上的,在使用時才調(diào)入內(nèi)存中來。什么是文件?文件分類1.從用戶的角度看,文件可分為普通文件和設(shè)備文件兩種。普通文件是指駐留在磁盤或其它外部介質(zhì)上的一個有序數(shù)據(jù)集,可以是源文件、目標(biāo)文件、可執(zhí)行程序。設(shè)備文件是指與主機相聯(lián)的各種外部設(shè)備,如顯示器、打印機、鍵盤等。文件分類2.從文件編碼的方式來看,文件可分為ASCII碼文件和二進(jìn)制碼文件兩種。ASCII文件也稱為文本文件,這種文件在磁盤中存放時每個字符對應(yīng)一個字節(jié),用于存放對應(yīng)的ASCII碼??勺x。文件分類二進(jìn)制文件是按二進(jìn)制的編碼方式來存放文件的。不可讀。例如,數(shù)5678的存儲形式為:

00010110

00101110文件分類3.從文件的邏輯結(jié)構(gòu)看,文件可分為流式文件和記錄文件。流式文件:由一個個字符(字節(jié))數(shù)據(jù)順序組成,如視頻流

記錄文件:有具有一定結(jié)構(gòu)的記錄組成,如word文件,pdf文件本章討論流式文件的打開、關(guān)閉、讀、寫、定位等各種操作。10.1文件概述10.1.2文件指針文件指針在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進(jìn)行各種操作。定義說明文件指針的一般形式為:

FILE*指針變量標(biāo)識符;文件指針其中FILE應(yīng)為大寫,它實際上是由系統(tǒng)定義的一個結(jié)構(gòu),該結(jié)構(gòu)中含有文件名、文件狀態(tài)和文件當(dāng)前位置等信息。在編寫源程序時不必關(guān)心FILE結(jié)構(gòu)的細(xì)節(jié)。例如:FILE*fp;fp稱為指向一個文件的指針。10.2文件的打開和關(guān)閉所謂打開文件,實際上是建立文件的各種有關(guān)信息,并使文件指針指向該文件,以便進(jìn)行其它操作。關(guān)閉文件則斷開指針與文件之間的聯(lián)系,也就禁止再對該文件進(jìn)行操作。文件的打開(fopen函數(shù))fopen用來打開一個文件,其調(diào)用形式為:文件指針名=fopen(文件名,使用文件方式);其中,“文件指針名”必須是被說明為FILE類型的指針變量;“文件名”是被打開文件的文件名,是字符串常量或字符串?dāng)?shù)組;“使用文件方式”是指文件的類型和操作要求。文件的打開(fopen函數(shù))例如:

1.FILE*fp;fp=(“file_a”,“r”);//當(dāng)前目錄打開文件file_a,只“讀”

2.FILE*fphzkfphzk=(“c:\\hzk16”,“rb”);//二進(jìn)制只讀兩個反斜線“\\”中的第一個表示轉(zhuǎn)義字符,第二個表示根目錄。文件使用方式文件使用方式意

義“rt”只讀打開一個文本文件,只允許讀數(shù)據(jù)“wt”只寫打開或建立一個文本文件,只允許寫數(shù)據(jù)“at”追加打開一個文本文件,并在文件末尾寫數(shù)據(jù)“rb”只讀打開一個二進(jìn)制文件,只允許讀數(shù)據(jù)“wb”只寫打開或建立一個二進(jìn)制文件,只允許寫數(shù)據(jù)“ab”追加打開一個二進(jìn)制文件,并在文件末尾寫數(shù)據(jù)“rt+”讀寫打開一個文本文件,允許讀和寫“wt+”讀寫打開或建立一個文本文件,允許讀寫“at+”讀寫打開一個文本文件,允許讀,或在文件末追加數(shù)據(jù)“rb+”讀寫打開一個二進(jìn)制文件,允許讀和寫“wb+”讀寫打開或建立一個二進(jìn)制文件,允許讀和寫“ab+”讀寫打開一個二進(jìn)制文件,允許讀,或在文件末追加數(shù)據(jù)

說明:(1)文件使用方式由r,w,a,t,b,+六個字符拼成,各字符的含義是:

r(read):

w(write):

a(append):

追加

t(text):

文本文件,可省略不寫

b(banary):

二進(jìn)制文件+:

讀和寫

說明:(2)凡用“r”打開一個文件時,該文件必須已經(jīng)存在,且只能從該文件讀出。(3)用“w”打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經(jīng)存在,則將該文件刪去,重建一個新文件。(4)若要向一個已存在的文件追加新的信息,只能用“a”方式打開文件。但此時該文件必須是存在的,否則將會出錯。

打開文件常用以下方法方式一if((fp=fopen("file","r"))==NULL){ printf("不能打開該文件。\n"); exit(0);}

打開文件常用以下方法方式二

if((fp=fopen("c:\\hzk16","rb")==NULL)

{

printf("erroronopenc:\\hzk16file!");

getch();

exit(1);}文件關(guān)閉函數(shù)(fclose函數(shù))文件使用完畢,用關(guān)閉文件函數(shù)把文件關(guān)閉,以避免文件的數(shù)據(jù)丟失等錯誤。fclose函數(shù)調(diào)用的一般形式是:fclose(文件指針);例如:fclose(fp);正常關(guān)閉時,fclose返回值為0。返回非零表示有錯誤發(fā)生。10.3文件的讀寫數(shù)10.3.1字符讀寫函讀字符函數(shù)fgetcfgetc函數(shù)的功能是從指定的文件中讀一個字符,函數(shù)調(diào)用的形式為:字符變量=fgetc(文件指針);例如:ch=fgetc(fp);其意義是從打開的文件fp中讀取一個字符并送入ch中。fgetc函數(shù)的使用有以下幾點說明(1)讀取的文件必須是以讀或讀寫方式打開的。(2)讀取字符的結(jié)果可以不賦值,但讀出的字符不能保存。(3)在文件內(nèi)部有一個位置指針。用來指向文件的當(dāng)前讀寫字節(jié)。在文件打開時,該指針總是指向文件的第一個字節(jié)。使用fgetc函數(shù)后,該位置指針將向后移動一個字節(jié)。因此可連續(xù)多次使用fgetc函數(shù),讀取多個字符。fgetc函數(shù)的使用有以下幾點說明文件指針和文件內(nèi)部的位置指針。文件指針是指向整個文件的,須在程序中定義說明,只要不重新賦值,文件指針的值是不變的。文件內(nèi)部的位置指針用以指示文件內(nèi)部的當(dāng)前讀寫位置,每讀寫一次,該指針均向后移動,它不需在程序中定義說明,而是由系統(tǒng)自動設(shè)置的。IloveCprogramming!…fpfgetc(fp)實例【例10.1】讀入文件d:\\cproj\\myfile.txt,在屏幕上輸出。IloveCprogramming!…fpfgetc(fp)

寫字符函數(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??捎么藖砼袛鄬懭胧欠癯晒?。實例【例10.2】從鍵盤輸入一行字符,寫入一個文件,再把該文件內(nèi)容讀出顯示在屏幕上?!纠?0.3】把命令行參數(shù)中的前一個文件名標(biāo)識的文件,復(fù)制到后一個文件名標(biāo)識的文件中,如命令行中只有一個文件名則把該文件寫到標(biāo)準(zhǔn)輸出文件(顯示器)中。10.3文件的讀寫數(shù)10.3.2字符串讀寫函數(shù)讀字符串函數(shù)fgets功能是從指定的文件中讀一個字符串到字符數(shù)組中,函數(shù)調(diào)用的形式為:

fgets(字符數(shù)組名,n,文件指針);其中的n是一個正整數(shù)。從文件中讀出不超過n-1個字符。最后加上一個串結(jié)束標(biāo)志'\0'。例如: fgets(str,n,fp);從fp所指的文件中讀出n-1個字符送入字符數(shù)組str中。實例【例10.4】從myfile.txt文件中讀入一個含10個字符的字符串。對fgets函數(shù)有兩點說明:(1)在讀出n-1個字符之前,如遇到了換行符或EOF,則讀出結(jié)束。(2)fgets函數(shù)也有返回值,其返回值是字符數(shù)組的首地址。寫字符串函數(shù)fputsfputs函數(shù)的功能是向指定的文件寫入一個字符串,其調(diào)用形式為:

fputs(字符串,文件指針);其中字符串可以是字符串常量,也可以是字符數(shù)組名,或指針變量,例如:fputs(“abcd“,fp);其意義是把字符串“abcd”寫入fp所指的文件之中。實例【例10.5】在例13.2中建立的文件string中追加一個字符串。10.3文件的讀寫數(shù)10.3.3數(shù)據(jù)塊讀寫函數(shù)C語言還提供了用于整塊數(shù)據(jù)的讀寫函數(shù)??捎脕碜x寫一組數(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);數(shù)據(jù)塊讀寫函數(shù)其中: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中。數(shù)據(jù)塊讀寫函數(shù)實例【例10.6】從鍵盤輸入兩個學(xué)生數(shù)據(jù),寫入一個文件中,再讀出這兩個學(xué)生的數(shù)據(jù)顯示在屏幕上。structstu{

charname[10];

intnum;

intage;

charaddr[15];}boya[2],boyb[2],*pp,*qq;10.3文件的讀寫數(shù)10.3.4格式化讀寫函數(shù)fscanf函數(shù),fprintf函數(shù)與前面使用的scanf和printf函數(shù)的功能相似,都是格式化讀寫函數(shù)。兩者的區(qū)別在于fscanf函數(shù)和fprintf函數(shù)的讀寫對象不是鍵盤和顯示器,而是磁盤文件。這兩個函數(shù)的調(diào)用格式為:fscanf(文件指針,格式字符串,輸入表列);fprintf(文件指針,格式字符串,輸出表列);格式化讀寫函數(shù)例如:

fscanf(fp,"%d%s",i,s);fprintf(fp,"%d%c",j,ch);格式化讀寫函數(shù)實例【例10.7】用fscanf和fprintf函數(shù)完成例10.6的問題。【例10.6】從鍵盤輸入兩個學(xué)生數(shù)據(jù),寫入一個文件中,再讀出這兩個學(xué)生的數(shù)據(jù)顯示在屏幕上。structstu{

charname[10];

intnum;

intage;

charaddr[15];}boya[2],boyb[2],*pp,*qq;10.4文件的定位前面介紹的對文件的讀寫方式都是順序讀寫,即讀寫文件只能從頭開始,順序讀寫各個數(shù)據(jù)。但在實際問題中常要求只讀寫文件中某一指定的部分。為了解決這個問題可移動文件內(nèi)部的位置指針到需要讀寫的位置,再進(jìn)行讀寫,這種讀寫稱為隨機讀寫。實現(xiàn)隨機讀寫的關(guān)鍵是要按要求移動位置指針,這稱為文件的定位。文件定位移動文件內(nèi)部位置指針的函數(shù)主要有兩個,即rewind函數(shù)和fseek函數(shù)。文件的定位文件的定位IloveCprogramming!…fpRewind()/fseek()rewind(fp),它的功能是把文件內(nèi)部的位置指針移到文件首。fseek函數(shù)用來移動文件內(nèi)部位置指針,其調(diào)用形式為:fseek(文件指針,位移量,起始點);其中:“文件指針”指向被移動的文件?!拔灰屏俊北硎疽苿拥淖止?jié)數(shù),要求位移量是long型數(shù)據(jù),以便在文件長度大于64KB時不會出錯。當(dāng)用常量表示位移量時,要求加后綴“L”。“起始點”表示從何處開始計算位移量,規(guī)定的起始點有三種:文件首,當(dāng)前位置和文件尾。文件的定位起始點

表示符號

數(shù)字表示───────────────────文件首SEEK—SET0當(dāng)前位置SEEK—CUR1文件末尾SEEK—END2例如:fseek(fp,100L,0);其意義是把位置指針移到離文件首100個字節(jié)處。fseek函數(shù)一般用于二進(jìn)制文件。文件的定位【小提示】在文本文件中由于要進(jìn)行轉(zhuǎn)換,故往往計算的位置會出現(xiàn)錯誤。文件的隨機讀寫在移動位置指針之后,即可用前面介紹的任一種讀寫函數(shù)進(jìn)行讀寫。由于一般是讀寫一個數(shù)據(jù)據(jù)塊,因此常用fread和fwrite函數(shù)。文件的定位實例【例10.8】在學(xué)生文件myfile中讀出第二個學(xué)生的數(shù)據(jù)。structstu{

charname[10];

intnum;

intage;

charaddr[15];}boy,*qq;10.5文件的檢錯與處理函數(shù)

常用的文件的檢錯與處理函數(shù)為ferror函數(shù)與clearerr函數(shù):

1.ferror函數(shù)ferror函數(shù)是讀寫文件出錯檢測函數(shù),其調(diào)用格式為:ferror(文件指針);

功能:檢查文件在用各種輸入和輸出函數(shù)進(jìn)行讀寫時是否出錯,如ferror返回值為0表示未出錯,否則表示有錯。

溫馨提示

  • 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

提交評論