C語(yǔ)言程序設(shè)計(jì)實(shí)例教程(慕課版)(第3版)課件 常中華 第9、10章 函數(shù);結(jié)構(gòu)體、共用體、枚舉、鏈表_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)實(shí)例教程(慕課版)(第3版)課件 常中華 第9、10章 函數(shù);結(jié)構(gòu)體、共用體、枚舉、鏈表_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)實(shí)例教程(慕課版)(第3版)課件 常中華 第9、10章 函數(shù);結(jié)構(gòu)體、共用體、枚舉、鏈表_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)實(shí)例教程(慕課版)(第3版)課件 常中華 第9、10章 函數(shù);結(jié)構(gòu)體、共用體、枚舉、鏈表_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)實(shí)例教程(慕課版)(第3版)課件 常中華 第9、10章 函數(shù);結(jié)構(gòu)體、共用體、枚舉、鏈表_第5頁(yè)
已閱讀5頁(yè),還剩104頁(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)介

單元9結(jié)構(gòu)體和共用體摘要9.1結(jié)構(gòu)體類(lèi)型9.1.1結(jié)構(gòu)體類(lèi)型的定義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鏈表的實(shí)現(xiàn)9.5.3鏈表的操作9.6構(gòu)造數(shù)據(jù)類(lèi)型-共用體9.6.1共用體類(lèi)型的定義9.6.2共用體變量的定義9.6.3共用體變量的初始化和引用9.7枚舉類(lèi)型9.7.1枚舉類(lèi)型的定義9.7.2枚舉變量的定義9.8使用typedef聲明新類(lèi)型實(shí)例分析與實(shí)現(xiàn)9.1結(jié)構(gòu)體類(lèi)型9.1.1結(jié)構(gòu)體類(lèi)型的定義學(xué)生:學(xué)號(hào) intsno;姓名 charname[20];班級(jí) charclassname[20];課程成績(jī)

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

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

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

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

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

分析:1、定義結(jié)構(gòu)體類(lèi)型student描述學(xué)生信息。其成員包括學(xué)號(hào)、姓名、班級(jí)、三門(mén)課程成績(jī)。

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

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

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

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

={201601,"李磊","軟件16級(jí)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)體指針變量->.成員名【例】要求通過(guò)鍵盤(pán)輸入一個(gè)學(xué)生信息,并且輸出這個(gè)學(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)體類(lèi)型。9.4結(jié)構(gòu)體與函數(shù)

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

doublegrade[3];};voidshowStuInfo(structstudentstu){ printf("學(xué)號(hào):%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é)號(hào):%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鏈表頭指針:存儲(chǔ)的是第一個(gè)結(jié)點(diǎn)的首地址。結(jié)點(diǎn):鏈表中的每一個(gè)元素。

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

指針域:存儲(chǔ)下一個(gè)結(jié)點(diǎn)的地址9.5.1鏈表的概念鏈表

在執(zhí)行過(guò)程中根據(jù)需要?jiǎng)討B(tài)申請(qǐng)空間,結(jié)點(diǎn)的個(gè)數(shù)可以根據(jù)需要增加或減少。

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

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

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

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

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

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

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

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

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

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

數(shù)據(jù)類(lèi)型成員名n;};【例】uniondata{ intx; doubley; charz;};9.6.2共用體變量的定義共用體類(lèi)型變量:uniondata{ intx; doubley; charz;};uniondatad1;數(shù)據(jù)類(lèi)型名變量名【例】#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共用體變量的初始化

在定義共用體變量的同時(shí),只能對(duì)其中一個(gè)成員進(jìn)行初始化操作,這與它的內(nèi)存分配方式是對(duì)應(yīng)的?!纠縰niondata{ 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枚舉類(lèi)型9.7.1枚舉類(lèi)型的定義enum枚舉類(lèi)型名稱{

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

【例】typedefstructstudent{ intsno; charname[20]; charclassname[20]; intgrade[3]}STU;其中,STU就是新類(lèi)型名。使用typedef只是定義了一個(gè)新的類(lèi)型名稱,代替已有的類(lèi)型名,并沒(méi)有建立一個(gè)新的數(shù)據(jù)類(lèi)型。實(shí)例分析與實(shí)現(xiàn)編程實(shí)現(xiàn)學(xué)生成績(jī)的匯總統(tǒng)計(jì)。要求實(shí)現(xiàn)的功能包括:從鍵盤(pán)錄入學(xué)生成績(jī)信息,包括學(xué)號(hào)、姓名、班級(jí)、課程成績(jī)。計(jì)算每位學(xué)生的總成績(jī)和平均成績(jī)。分析:1、使用模塊化程序設(shè)計(jì)思想,用函數(shù)實(shí)現(xiàn)每一個(gè)功能模塊。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文件分類(lèi)10.1.2文件指針10.2文件的打開(kāi)和關(guān)閉10.3文件的讀寫(xiě)數(shù)10.3.1字符讀寫(xiě)函10.3.2字符串讀寫(xiě)函數(shù)10.3.3數(shù)據(jù)塊讀寫(xiě)函數(shù)10.3.4格式化讀寫(xiě)函數(shù)10.4文件的定位實(shí)例分析與實(shí)現(xiàn)10.1文件概述10.1.1文件分類(lèi)什么是文件?所謂“文件”是指一組相關(guān)數(shù)據(jù)的有序集合。這個(gè)數(shù)據(jù)集有一個(gè)名稱,叫做文件名。實(shí)際上在前面的各章中我們已經(jīng)多次使用了文件,例如源程序文件、目標(biāo)文件、可執(zhí)行文件、庫(kù)文件(頭文件)等。文件通常是駐留在外部介質(zhì)(如磁盤(pán)等)上的,在使用時(shí)才調(diào)入內(nèi)存中來(lái)。什么是文件?文件分類(lèi)1.從用戶的角度看,文件可分為普通文件和設(shè)備文件兩種。普通文件是指駐留在磁盤(pán)或其它外部介質(zhì)上的一個(gè)有序數(shù)據(jù)集,可以是源文件、目標(biāo)文件、可執(zhí)行程序。設(shè)備文件是指與主機(jī)相聯(lián)的各種外部設(shè)備,如顯示器、打印機(jī)、鍵盤(pán)等。文件分類(lèi)2.從文件編碼的方式來(lái)看,文件可分為ASCII碼文件和二進(jìn)制碼文件兩種。ASCII文件也稱為文本文件,這種文件在磁盤(pán)中存放時(shí)每個(gè)字符對(duì)應(yīng)一個(gè)字節(jié),用于存放對(duì)應(yīng)的ASCII碼??勺x。文件分類(lèi)二進(jìn)制文件是按二進(jìn)制的編碼方式來(lái)存放文件的。不可讀。例如,數(shù)5678的存儲(chǔ)形式為:

00010110

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

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

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

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

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

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

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

r(read):

w(write):

寫(xiě)

a(append):

追加

t(text):

文本文件,可省略不寫(xiě)

b(banary):

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

讀和寫(xiě)

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

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

打開(kāi)文件常用以下方法方式二

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

寫(xiě)字符函數(shù)fputcfputc函數(shù)的功能是把一個(gè)字符寫(xiě)入指定的文件中,函數(shù)調(diào)用的形式為:

fputc(字符量,文件指針);

其中,待寫(xiě)入的字符量可以是字符常量或變量例如:fputc('a',fp);其意義是把字符a寫(xiě)入fp所指向的文件中。fputc函數(shù)的使用有以下幾點(diǎn)說(shuō)明(1)被寫(xiě)入的文件可以用寫(xiě)、讀寫(xiě),追加方式打開(kāi)。用寫(xiě)或讀寫(xiě)方式打開(kāi)一個(gè)已存在的文件時(shí)將清除原有的文件內(nèi)容,寫(xiě)入字符從文件首開(kāi)始。如需保留原有文件內(nèi)容,必須以追加方式打開(kāi)文件。被寫(xiě)入的文件若不存在,則創(chuàng)建該文件。(2)每寫(xiě)入一個(gè)字符,文件內(nèi)部位置指針向后移動(dòng)一個(gè)字節(jié)。(3)fputc函數(shù)有一個(gè)返回值,如寫(xiě)入成功則返回寫(xiě)入的字符,否則返回一個(gè)EOF。可用此來(lái)判斷寫(xiě)入是否成功。實(shí)例【例10.2】從鍵盤(pán)輸入一行字符,寫(xiě)入一個(gè)文件,再把該文件內(nèi)容讀出顯示在屏幕上?!纠?0.3】把命令行參數(shù)中的前一個(gè)文件名標(biāo)識(shí)的文件,復(fù)制到后一個(gè)文件名標(biāo)識(shí)的文件中,如命令行中只有一個(gè)文件名則把該文件寫(xiě)到標(biāo)準(zhǔn)輸出文件(顯示器)中。10.3文件的讀寫(xiě)數(shù)10.3.2字符串讀寫(xiě)函數(shù)讀字符串函數(shù)fgets功能是從指定的文件中讀一個(gè)字符串到字符數(shù)組中,函數(shù)調(diào)用的形式為:

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

fputs(字符串,文件指針);其中字符串可以是字符串常量,也可以是字符數(shù)組名,或指針變量,例如:fputs(“abcd“,fp);其意義是把字符串“abcd”寫(xiě)入fp所指的文件之中。實(shí)例【例10.5】在例13.2中建立的文件string中追加一個(gè)字符串。10.3文件的讀寫(xiě)數(shù)10.3.3數(shù)據(jù)塊讀寫(xiě)函數(shù)C語(yǔ)言還提供了用于整塊數(shù)據(jù)的讀寫(xiě)函數(shù)。可用來(lái)讀寫(xiě)一組數(shù)據(jù),如一個(gè)數(shù)組元素,一個(gè)結(jié)構(gòu)變量的值等。讀數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:

fread(buffer,size,count,fp);寫(xiě)數(shù)據(jù)塊函數(shù)調(diào)用的一般形式為:

fwrite(buffer,size,count,fp);數(shù)據(jù)塊讀寫(xiě)函數(shù)其中:buffer是一個(gè)指針,在fread函數(shù)中,它表示存放輸入數(shù)據(jù)的首地址。在fwrite函數(shù)中,它表示存放輸出數(shù)據(jù)的首地址。size表示數(shù)據(jù)塊的字節(jié)數(shù)。count表示要讀寫(xiě)的數(shù)據(jù)塊塊數(shù)。fp表示文件指針。例如: fread(fa,4,5,fp);其意義是從fp所指的文件中,每次讀4個(gè)字節(jié)(一個(gè)實(shí)數(shù))送入實(shí)數(shù)組fa中,連續(xù)讀5次,即讀5個(gè)實(shí)數(shù)到fa中。數(shù)據(jù)塊讀寫(xiě)函數(shù)實(shí)例【例10.6】從鍵盤(pán)輸入兩個(gè)學(xué)生數(shù)據(jù),寫(xiě)入一個(gè)文件中,再讀出這兩個(gè)學(xué)生的數(shù)據(jù)顯示在屏幕上。structstu{

charname[10];

intnum;

intage;

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

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

charname[10];

intnum;

intage;

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

表示符號(hào)

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

charname[10];

intnum;

intage;

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

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

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

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

溫馨提示

  • 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)論