版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、10.1 文件的有關(guān)基本知識(shí)文件的有關(guān)基本知識(shí)10.2 打開與關(guān)閉文件打開與關(guān)閉文件10.3 順序讀寫數(shù)據(jù)文件順序讀寫數(shù)據(jù)文件10.4 隨機(jī)讀寫數(shù)據(jù)文件隨機(jī)讀寫數(shù)據(jù)文件10.5 文件讀寫的出錯(cuò)檢測(cè)文件讀寫的出錯(cuò)檢測(cè)10.1.1 什么是文件什么是文件10.1.2 文件名文件名10.1.3 文件的分類文件的分類10.1.4 文件緩沖區(qū)文件緩沖區(qū)10.1.5 文件類型指針文件類型指針 文件有不同的類型,在程序設(shè)計(jì)中,主要用到兩種文件文件有不同的類型,在程序設(shè)計(jì)中,主要用到兩種文件:(1) 程序文件程序文件。包括。包括源程序文件源程序文件(后綴為后綴為.c)、目標(biāo)文件目標(biāo)文件(后綴為后綴為.obj)、
2、可執(zhí)行文件可執(zhí)行文件(后綴為后綴為.exe)等。這種等。這種文件的內(nèi)容是程序代碼。文件的內(nèi)容是程序代碼。(2) 數(shù)據(jù)文件數(shù)據(jù)文件。文件的內(nèi)容不是程序,而是供程序運(yùn)行。文件的內(nèi)容不是程序,而是供程序運(yùn)行時(shí)讀寫的數(shù)據(jù),如在程序運(yùn)行過程中輸出到磁盤時(shí)讀寫的數(shù)據(jù),如在程序運(yùn)行過程中輸出到磁盤(或其或其他外部設(shè)備他外部設(shè)備)的數(shù)據(jù),或在程序運(yùn)行過程中供讀入的數(shù)的數(shù)據(jù),或在程序運(yùn)行過程中供讀入的數(shù)據(jù)。如一批學(xué)生的成績(jī)數(shù)據(jù),或貨物交易的數(shù)據(jù)等。據(jù)。如一批學(xué)生的成績(jī)數(shù)據(jù),或貨物交易的數(shù)據(jù)等。 本章主要討論的是本章主要討論的是數(shù)據(jù)文件數(shù)據(jù)文件 文件要有一個(gè)唯一的文件標(biāo)識(shí),以便用戶識(shí)別和引用。文件要有一個(gè)唯一的文
3、件標(biāo)識(shí),以便用戶識(shí)別和引用。 文件標(biāo)識(shí)包括三部分:文件標(biāo)識(shí)包括三部分:(1)文件路徑文件路徑(2)文件名主干文件名主干(3)文件后綴文件后綴例如:例如:D: CCtempfile1.dat 根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件可分為根據(jù)數(shù)據(jù)的組織形式,數(shù)據(jù)文件可分為ASCII文件文件和和二二進(jìn)制文件進(jìn)制文件。u數(shù)據(jù)以二進(jìn)制形式存儲(chǔ)的,就是數(shù)據(jù)以二進(jìn)制形式存儲(chǔ)的,就是二進(jìn)制文件二進(jìn)制文件uASCII文件又稱文本文件,每一個(gè)字節(jié)放一個(gè)字符的文件又稱文本文件,每一個(gè)字節(jié)放一個(gè)字符的ASCII代碼代碼 ANSI C標(biāo)準(zhǔn)采用標(biāo)準(zhǔn)采用“緩沖文件系統(tǒng)緩沖文件系統(tǒng)”處理數(shù)據(jù)文件處理數(shù)據(jù)文件 所謂所謂緩沖文件系統(tǒng)緩沖文
4、件系統(tǒng)是指系統(tǒng)自動(dòng)地在內(nèi)存區(qū)為程序中每是指系統(tǒng)自動(dòng)地在內(nèi)存區(qū)為程序中每一個(gè)正在使用的文件開辟一個(gè)文件緩沖區(qū)一個(gè)正在使用的文件開辟一個(gè)文件緩沖區(qū) 從內(nèi)存向磁盤輸出數(shù)據(jù)必須先送到內(nèi)存中的緩沖區(qū),裝從內(nèi)存向磁盤輸出數(shù)據(jù)必須先送到內(nèi)存中的緩沖區(qū),裝滿緩沖區(qū)后才一起送到磁盤去滿緩沖區(qū)后才一起送到磁盤去 如果從磁盤向計(jì)算機(jī)讀入數(shù)據(jù),則一次從磁盤文件將一如果從磁盤向計(jì)算機(jī)讀入數(shù)據(jù),則一次從磁盤文件將一批數(shù)據(jù)輸入到內(nèi)存緩沖區(qū)(充滿緩沖區(qū)),然后再從緩批數(shù)據(jù)輸入到內(nèi)存緩沖區(qū)(充滿緩沖區(qū)),然后再從緩沖區(qū)逐個(gè)地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(給程序變量)沖區(qū)逐個(gè)地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(給程序變量)程序數(shù)據(jù)區(qū)程序數(shù)據(jù)區(qū)輸出文
5、件緩沖區(qū)輸出文件緩沖區(qū)輸入文件緩沖區(qū)輸入文件緩沖區(qū)磁盤磁盤從內(nèi)存向磁盤輸出數(shù)據(jù)從內(nèi)存向磁盤輸出數(shù)據(jù)、從磁盤向計(jì)算機(jī)讀入數(shù)從磁盤向計(jì)算機(jī)讀入數(shù)據(jù)。據(jù)。裝滿緩沖區(qū)裝滿緩沖區(qū)充滿緩沖區(qū)充滿緩沖區(qū) 緩沖文件系統(tǒng)中,關(guān)鍵的概念是緩沖文件系統(tǒng)中,關(guān)鍵的概念是“文件類型指針文件類型指針”,簡(jiǎn)稱,簡(jiǎn)稱“文件指針文件指針”u每個(gè)被使用的文件都在內(nèi)存中開辟一個(gè)相應(yīng)的文件信息區(qū)每個(gè)被使用的文件都在內(nèi)存中開辟一個(gè)相應(yīng)的文件信息區(qū),用來存放文件的有關(guān)信息(如文件的名字、文件狀態(tài)及,用來存放文件的有關(guān)信息(如文件的名字、文件狀態(tài)及文件當(dāng)前位置等)文件當(dāng)前位置等)u這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是這些信息
6、是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是由系統(tǒng)聲明的,取名為由系統(tǒng)聲明的,取名為FILE 聲明聲明FILE結(jié)構(gòu)體類型的信息包含在頭文件結(jié)構(gòu)體類型的信息包含在頭文件“stdio.h”中中 一般一般設(shè)置一個(gè)指向設(shè)置一個(gè)指向FILE類型變量的指針變量,然后通過它來類型變量的指針變量,然后通過它來引用這些引用這些FILE類型變量類型變量FILE*fp;Turbo C在在stdio.h文件中有以下的文件類型聲明:文件中有以下的文件類型聲明:typedef struct short level; /*緩沖區(qū)緩沖區(qū)“滿滿”或或“空空”的程度的程度*/ unsigned flags; /*文件狀態(tài)標(biāo)志文件狀
7、態(tài)標(biāo)志*/ char fd; /*文件描述符文件描述符*/ unsigned charhold; /*如無緩沖區(qū)不讀取字符如無緩沖區(qū)不讀取字符*/ short bsize; /*緩沖區(qū)的大小緩沖區(qū)的大小*/ unsignedchar *buffer; /*數(shù)據(jù)緩沖區(qū)的位置數(shù)據(jù)緩沖區(qū)的位置*/ unsignedar *curp; /*指針,當(dāng)前的指向指針,當(dāng)前的指向*/ unsigned istemp; /*臨時(shí)文件,指示器臨時(shí)文件,指示器*/ short token; /*用于有效性檢查用于有效性檢查*/FILE; 在緩沖文件系統(tǒng)中在緩沖文件系統(tǒng)中,每個(gè)被使用的文件都要在內(nèi)存中開辟一每個(gè)被使用
8、的文件都要在內(nèi)存中開辟一FILE類型的區(qū)類型的區(qū),存放文件的有關(guān)信息。存放文件的有關(guān)信息。10.2.1 用用fopen函數(shù)打開數(shù)據(jù)文件函數(shù)打開數(shù)據(jù)文件10.2.2 用用fclose函數(shù)關(guān)閉數(shù)據(jù)文件函數(shù)關(guān)閉數(shù)據(jù)文件 對(duì)文件讀寫之前應(yīng)該對(duì)文件讀寫之前應(yīng)該“打開打開”該文件,在使用結(jié)束之后該文件,在使用結(jié)束之后應(yīng)應(yīng)“關(guān)閉關(guān)閉”該文件。該文件。 所謂所謂“打開打開”是指為文件建立相應(yīng)的信息區(qū)是指為文件建立相應(yīng)的信息區(qū)(用來存放用來存放有關(guān)文件的信息有關(guān)文件的信息)和文件緩沖區(qū)和文件緩沖區(qū)(用來暫時(shí)存放輸入輸出用來暫時(shí)存放輸入輸出的數(shù)據(jù)的數(shù)據(jù))。 在編寫程序時(shí),在打開文件的同時(shí),一般都指定一個(gè)指在編寫程
9、序時(shí),在打開文件的同時(shí),一般都指定一個(gè)指針變量指向該文件,也就是建立起指針變量與文件之間針變量指向該文件,也就是建立起指針變量與文件之間的聯(lián)系,這樣就可以通過該指針變量對(duì)文件進(jìn)行讀寫的聯(lián)系,這樣就可以通過該指針變量對(duì)文件進(jìn)行讀寫 所謂所謂“關(guān)閉關(guān)閉”是指撤銷文件信息區(qū)和文件緩沖區(qū)是指撤銷文件信息區(qū)和文件緩沖區(qū) fopen函數(shù)的調(diào)用方式為:函數(shù)的調(diào)用方式為:fopen(文件名文件名,使用文件方式使用文件方式); 通常將通常將fopen函數(shù)的返回值賦給一個(gè)函數(shù)的返回值賦給一個(gè)指向指向FILE類型變量的類型變量的指針變量指針變量。 例如:例如: FILE *fp; fp=fopen(“a1”,”r”
10、);u表示要打開名為表示要打開名為“a1”的文件,使用文件方式為的文件,使用文件方式為“讀入讀入”ufopen函數(shù)的返回值是指向函數(shù)的返回值是指向a1文件的指針文件的指針ufp和文件和文件a1相聯(lián)系,相聯(lián)系,fp指向了指向了a1文件文件文件使用方式含文件使用方式含 義義 r (只讀只讀)為為輸入輸入打開一個(gè)打開一個(gè)文本文本文件文件w (只寫只寫)為為輸出輸出打開一個(gè)打開一個(gè)文本文本文件文件a (追加追加)向向文本文本文件尾增加數(shù)據(jù)文件尾增加數(shù)據(jù)rb (只讀只讀)為為輸入輸入打開一個(gè)打開一個(gè)二進(jìn)制二進(jìn)制文件文件wb (只寫只寫)為為輸出輸出打開一個(gè)打開一個(gè)二進(jìn)制二進(jìn)制文件文件ab (追加追加)向
11、向二進(jìn)制二進(jìn)制文件尾增加數(shù)據(jù)文件尾增加數(shù)據(jù)r+ (讀寫讀寫)為讀為讀/寫打開一個(gè)文本文件寫打開一個(gè)文本文件w+ (讀寫讀寫)為讀為讀/寫建立一個(gè)新的文本文件寫建立一個(gè)新的文本文件a+ (讀寫讀寫)為讀為讀/寫打開一個(gè)文本文件寫打開一個(gè)文本文件rb+ (讀寫讀寫)為讀為讀/寫打開一個(gè)二進(jìn)制文件寫打開一個(gè)二進(jìn)制文件wb+ (讀寫讀寫)為讀為讀/寫建立一個(gè)新的二進(jìn)制文件寫建立一個(gè)新的二進(jìn)制文件ab+ (讀寫讀寫)為讀為讀/寫打開一個(gè)二進(jìn)制文件寫打開一個(gè)二進(jìn)制文件 說明:說明:(1) 用用“r”方式打開的文件只能用于向計(jì)算機(jī)輸入而不能用作向該文件方式打開的文件只能用于向計(jì)算機(jī)輸入而不能用作向該文件輸出
12、數(shù)據(jù),而且該文件應(yīng)該已經(jīng)存在,并存有數(shù)據(jù),這樣程序才能從輸出數(shù)據(jù),而且該文件應(yīng)該已經(jīng)存在,并存有數(shù)據(jù),這樣程序才能從文件中讀數(shù)據(jù)。文件中讀數(shù)據(jù)。u不能用不能用“r”方式打開一個(gè)并不存在的文件,否則出錯(cuò)。方式打開一個(gè)并不存在的文件,否則出錯(cuò)。(2) 用用“w”方式打開的文件只能用于向該文件寫數(shù)據(jù)(即輸出文件)方式打開的文件只能用于向該文件寫數(shù)據(jù)(即輸出文件),而不能用來向計(jì)算機(jī)輸入。,而不能用來向計(jì)算機(jī)輸入。u如果原來不存在該文件,則在打開文件前新建立一個(gè)以指定的名字命如果原來不存在該文件,則在打開文件前新建立一個(gè)以指定的名字命名的文件。名的文件。u如果原來已存在一個(gè)以該文件名命名的文件,則在打
13、開文件前先將該如果原來已存在一個(gè)以該文件名命名的文件,則在打開文件前先將該文件刪去,然后重新建立一個(gè)新文件。文件刪去,然后重新建立一個(gè)新文件。(3) 如果希望向文件末尾添加新的數(shù)據(jù)(不希望刪除原有數(shù)據(jù)),則應(yīng)如果希望向文件末尾添加新的數(shù)據(jù)(不希望刪除原有數(shù)據(jù)),則應(yīng)該用該用“a”方式打開方式打開u但此時(shí)應(yīng)保證該文件已存在;否則將得到出錯(cuò)信息。但此時(shí)應(yīng)保證該文件已存在;否則將得到出錯(cuò)信息。u打開文件時(shí),文件讀寫標(biāo)記移到文件末尾打開文件時(shí),文件讀寫標(biāo)記移到文件末尾 說明:說明:(4) 如果打開如果打開失敗失敗,fopen函數(shù)將會(huì)帶回一個(gè)出錯(cuò)信息。函數(shù)將會(huì)帶回一個(gè)出錯(cuò)信息。fopen函數(shù)將函數(shù)將帶回
14、一個(gè)空指針值帶回一個(gè)空指針值NULL 常用下面的方法打開一個(gè)文件:常用下面的方法打開一個(gè)文件: if (fp=fopen(“file1”,r)=NULL)printf(“cannot open this filen”); exit(0); (5) 計(jì)算機(jī)輸從計(jì)算機(jī)輸從ASCII文件讀入字符時(shí),遇到回車換行符,系統(tǒng)把文件讀入字符時(shí),遇到回車換行符,系統(tǒng)把它轉(zhuǎn)換為一個(gè)換行符,在輸出時(shí)把換行符轉(zhuǎn)換成為回車和換行兩個(gè)字它轉(zhuǎn)換為一個(gè)換行符,在輸出時(shí)把換行符轉(zhuǎn)換成為回車和換行兩個(gè)字符。在用二進(jìn)制文件時(shí),不進(jìn)行這種轉(zhuǎn)換,在內(nèi)存中的數(shù)據(jù)形式與輸符。在用二進(jìn)制文件時(shí),不進(jìn)行這種轉(zhuǎn)換,在內(nèi)存中的數(shù)據(jù)形式與輸出到外
15、部文件中的數(shù)據(jù)形式完全一致,一一對(duì)應(yīng)。出到外部文件中的數(shù)據(jù)形式完全一致,一一對(duì)應(yīng)。 關(guān)閉文件用關(guān)閉文件用fclose函數(shù)。函數(shù)。 fclose函數(shù)調(diào)用的一般形式為函數(shù)調(diào)用的一般形式為:fclose(文件指針文件指針); 例如:例如: fclose (fp); 如果不關(guān)閉文件將會(huì)如果不關(guān)閉文件將會(huì)丟失丟失數(shù)據(jù)。數(shù)據(jù)。 在順序?qū)憰r(shí),先寫入的數(shù)據(jù)存放在文件中前面,后寫入在順序?qū)憰r(shí),先寫入的數(shù)據(jù)存放在文件中前面,后寫入的數(shù)據(jù)存放在文件中后面的數(shù)據(jù)存放在文件中后面 在順序讀時(shí),先讀文件中前面的數(shù)據(jù),后讀文件中后面在順序讀時(shí),先讀文件中前面的數(shù)據(jù),后讀文件中后面的數(shù)據(jù)的數(shù)據(jù) 對(duì)順序讀寫來說,對(duì)文件讀寫數(shù)據(jù)
16、的順序和數(shù)據(jù)在文件對(duì)順序讀寫來說,對(duì)文件讀寫數(shù)據(jù)的順序和數(shù)據(jù)在文件中的物理順序是一致的中的物理順序是一致的 順序讀寫需要用庫函數(shù)實(shí)現(xiàn)順序讀寫需要用庫函數(shù)實(shí)現(xiàn)10.3.1 怎樣向文件讀寫字符怎樣向文件讀寫字符10.3.2 怎樣向文件讀寫一個(gè)字符串怎樣向文件讀寫一個(gè)字符串10.3.3 用格式化的方式讀寫文件用格式化的方式讀寫文件10.3.4 用二進(jìn)制方式向文件讀寫一組數(shù)據(jù)用二進(jìn)制方式向文件讀寫一組數(shù)據(jù)函數(shù)名函數(shù)名調(diào)用形式調(diào)用形式功能功能返回值返回值fgetcfgetc(fp)從從fp指向的文件指向的文件讀入一個(gè)字符讀入一個(gè)字符讀成功,帶回所讀的字符,讀成功,帶回所讀的字符,失敗則返回文件結(jié)束標(biāo)志失
17、敗則返回文件結(jié)束標(biāo)志EOF(即即-1)fputcfputc(ch,fp)把字符把字符ch寫到文寫到文件指針變量件指針變量fp所所指向的文件中指向的文件中寫成功,返回值就是輸出寫成功,返回值就是輸出的字符;輸出失敗,則返的字符;輸出失敗,則返回回EOF(即(即-1) 讀寫一個(gè)字符的函數(shù)讀寫一個(gè)字符的函數(shù)例例10.1 從鍵盤輸入一些字符,逐個(gè)把它們送到磁盤上去,直到用戶輸入一從鍵盤輸入一些字符,逐個(gè)把它們送到磁盤上去,直到用戶輸入一個(gè)個(gè)“”為止。為止。#include #include int main() FILE *fp; char ch,filename10; printf(請(qǐng)輸入所用的文件
18、名:請(qǐng)輸入所用的文件名:); scanf(%s,filename); if(fp=fopen(filename,“w”)=NULL printf(無法打開此文件無法打開此文件n); exit(0); ch=getchar( ); printf(請(qǐng)輸入一個(gè)準(zhǔn)備存儲(chǔ)到磁盤的字符串請(qǐng)輸入一個(gè)準(zhǔn)備存儲(chǔ)到磁盤的字符串(以以#結(jié)束結(jié)束):); ch=getchar( ); while(ch!=#) fputc(ch,fp); putchar(ch); ch=getchar(); fclose(fp); putchar(10); return 0;接收最后輸入的回車符接收最后輸入的回車符exit在在stdl
19、ib.h中聲明:中聲明: void exit ( int status );exit(0) 正常中止程序正常中止程序 exit(非非0) 非正常中止程序非正常中止程序例例10.2 將一個(gè)磁盤文件中的信息復(fù)制到另一個(gè)磁盤文件中。將一個(gè)磁盤文件中的信息復(fù)制到另一個(gè)磁盤文件中。#include #include int main( ) FILE *in,*out; char ch,infile10,outfile10; printf(輸入讀入文件的名字輸入讀入文件的名字:); scanf(“%s”,infile); printf(輸入輸出文件的名字輸入輸出文件的名字:); scanf(%s,outf
20、ile); if(in=fopen(infile,r)=NULL) printf(無法打開此文件無法打開此文件n); exit(0); if(out=fopen(outfile,w)=NULL) printf(無法打開此文件無法打開此文件n); exit(0); while(!feof(in) ch=fgetc(in); fputc(ch,out); putchar(ch); putchar(10); fclose(in); fclose(out); return 0;檢查當(dāng)前讀寫位置是檢查當(dāng)前讀寫位置是否移到文件末尾否移到文件末尾 讀寫一個(gè)字符串的函數(shù)讀寫一個(gè)字符串的函數(shù)函數(shù)名函數(shù)名調(diào)用形式
21、調(diào)用形式功能功能返回值返回值fgetsfgets(str,n,fp)從從fp指向的文件讀入長(zhǎng)度指向的文件讀入長(zhǎng)度為為(n-1)的字符串,存放的字符串,存放到字符數(shù)組到字符數(shù)組str中中讀成功,返回地讀成功,返回地址址str,失敗則,失敗則返回返回NULLfputsfputs(str,fp)str所指向的字符串寫到文所指向的字符串寫到文件指針變量件指針變量fp所指向的文所指向的文件中件中寫成功,返回寫成功,返回0;否則返回非否則返回非0值值 fgets函數(shù)的函數(shù)原型為:函數(shù)的函數(shù)原型為: char *fgets (char *str,int n,FILE *fp);u其作用是從文件讀入一個(gè)字符串
22、其作用是從文件讀入一個(gè)字符串u調(diào)用時(shí)可以寫成:調(diào)用時(shí)可以寫成:fgets(str,n,fp); 說明:說明:ufgets(str,n,fp);中中n是要求得到的字符個(gè)數(shù),但實(shí)際上只讀是要求得到的字符個(gè)數(shù),但實(shí)際上只讀n-1個(gè)字符,然后在最后加一個(gè)個(gè)字符,然后在最后加一個(gè)0字符,這樣得到的字符串共字符,這樣得到的字符串共有有n個(gè)字符,把它們放到字符數(shù)組個(gè)字符,把它們放到字符數(shù)組str中中u如果在讀完如果在讀完n-1個(gè)字符之前遇到換行符個(gè)字符之前遇到換行符“n”或文件結(jié)束符或文件結(jié)束符EOF,讀入即結(jié)束,但將所遇到的換行符,讀入即結(jié)束,但將所遇到的換行符“n”也作為一個(gè)字也作為一個(gè)字符讀入符讀入u
23、執(zhí)行執(zhí)行fgets成功,返回成功,返回str數(shù)組首地址,如果一開始就遇到文件數(shù)組首地址,如果一開始就遇到文件尾或讀數(shù)據(jù)錯(cuò),返回尾或讀數(shù)據(jù)錯(cuò),返回NULL fputs函數(shù)的函數(shù)原型為:函數(shù)的函數(shù)原型為: int fputs (char *str, FILE *fp);ustr指向的字符串輸出到指向的字符串輸出到fp所指向的文件中所指向的文件中u調(diào)用時(shí)可以寫成:調(diào)用時(shí)可以寫成: fputs(China”,fp);ufputs函數(shù)中第一個(gè)參數(shù)可以是字符串常量、字符數(shù)組名或函數(shù)中第一個(gè)參數(shù)可以是字符串常量、字符數(shù)組名或字符型指針字符型指針u字符串末尾的字符串末尾的0不輸出不輸出u輸出成功,函數(shù)值為;失
24、敗,函數(shù)值為輸出成功,函數(shù)值為;失敗,函數(shù)值為EOF 一般調(diào)用方式為:一般調(diào)用方式為:fprintf(文件指針文件指針,格式字符串格式字符串,輸出表列輸出表列);fscanf (文件指針文件指針,格式字符串格式字符串,輸入表列輸入表列);如:如:fprintf (fp,”%d,%6.2f”,i,f);fscanf (fp,”%d,%f”,&i,&f);例例: 有有5個(gè)學(xué)生,每個(gè)學(xué)生有個(gè)學(xué)生,每個(gè)學(xué)生有3門課的成績(jī),從鍵盤輸入以上數(shù)據(jù)(包門課的成績(jī),從鍵盤輸入以上數(shù)據(jù)(包括學(xué)生號(hào)、姓名、括學(xué)生號(hào)、姓名、3門課成績(jī)),計(jì)算出平均成績(jī),將原有數(shù)據(jù)和計(jì)門課成績(jī)),計(jì)算出平均成績(jī),將原有
25、數(shù)據(jù)和計(jì)算出的平均分?jǐn)?shù)存放在磁盤文件算出的平均分?jǐn)?shù)存放在磁盤文件stud中。然后將文件的內(nèi)容讀出并中。然后將文件的內(nèi)容讀出并顯示在屏幕上。顯示在屏幕上。 #include #include struct student char num10; char name8; int score3; float ave; stu5;main ( ) int i,j,sum; FILE *fp; for(i=0;i5;i+) printf (input score of student %d: n,i+1); printf(NO.:); scanf(%s,stui.num); printf(name:);
26、 scanf(%s,); sum=0; for(j=0;j3;j+) printf(score %d:,j+1); scanf(%d,&stui.scorej); sum+=stui.scorej; stui.ave=sum/3.0; .main ( ) int i,j,sum; FILE *fp; . if(fp=fopen(stud,w)=NULL) printf(cannot open stud for write!n); exit(0); for(i=0;i5;i+) fprintf(fp, %st%st%dt%dt%dt%6.2fn, stui.num,st
27、, stui.score0, stui.score1,stui.score2,stui.ave); fclose(fp); .main ( ) . if(fp=fopen(stud,r)=NULL) printf(cannot open stud for read!n); exit(0); for(i=0;i5;i+) float f; f = stui.ave; fscanf(fp,%s%s%d%d%d%f, stui.num,, &stui.score0, &stui.score1,&stui.score2,&f); prin
28、tf(n%st%st%dt%dt%dt%6.2fn, stui.num,,stui.score0,stui.score1, stui.score2,stui.ave); fclose(fp); 一般調(diào)用形式為一般調(diào)用形式為:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp); buffer:是一個(gè)地址:是一個(gè)地址u對(duì)對(duì)fread來說,它是用來存放從文件讀入的數(shù)據(jù)的存儲(chǔ)區(qū)的地來說,它是用來存放從文件讀入的數(shù)據(jù)的存儲(chǔ)區(qū)的地址址u對(duì)對(duì)fwrite來說,是要把此地址開始的存儲(chǔ)區(qū)中的數(shù)據(jù)向文件輸來說,是要把此地址開始的存儲(chǔ)區(qū)
29、中的數(shù)據(jù)向文件輸出出 size:要讀寫的字節(jié)數(shù):要讀寫的字節(jié)數(shù) count:要讀寫多少個(gè)數(shù)據(jù)項(xiàng):要讀寫多少個(gè)數(shù)據(jù)項(xiàng) fp:FILE類型指針類型指針 10.4.1 文件位置標(biāo)記及其定位文件位置標(biāo)記及其定位10.4.2 隨機(jī)讀寫隨機(jī)讀寫1.文件位置標(biāo)記文件位置標(biāo)記 系統(tǒng)為每個(gè)文件設(shè)置了一個(gè)文件讀寫位置標(biāo)記系統(tǒng)為每個(gè)文件設(shè)置了一個(gè)文件讀寫位置標(biāo)記(簡(jiǎn)稱文件標(biāo)記簡(jiǎn)稱文件標(biāo)記),用來指,用來指示示“接下來要讀寫的下一個(gè)字符的位置接下來要讀寫的下一個(gè)字符的位置”。 順序讀順序讀文件文件時(shí),文件標(biāo)記時(shí),文件標(biāo)記首先首先指向文件開頭,讀指向文件開頭,讀取取一個(gè)字符后一個(gè)字符后,文件標(biāo)文件標(biāo)記向后移一個(gè)位置,依
30、此類推,直到遇文件尾,結(jié)束記向后移一個(gè)位置,依此類推,直到遇文件尾,結(jié)束。 順序?qū)懳募樞驅(qū)懳募r(shí)時(shí),每寫完一個(gè)數(shù)據(jù)后,文件標(biāo)記順序向后移一個(gè)位置,然,每寫完一個(gè)數(shù)據(jù)后,文件標(biāo)記順序向后移一個(gè)位置,然后在下一次執(zhí)行寫操作時(shí)把數(shù)據(jù)寫入指針?biāo)傅奈恢?。直到把全部?shù)據(jù)后在下一次執(zhí)行寫操作時(shí)把數(shù)據(jù)寫入指針?biāo)傅奈恢谩V钡桨讶繑?shù)據(jù)寫完,此時(shí)文件位置標(biāo)記在最后一個(gè)數(shù)據(jù)之后寫完,此時(shí)文件位置標(biāo)記在最后一個(gè)數(shù)據(jù)之后。 可以根據(jù)讀寫的需要,人為地移動(dòng)了文件標(biāo)記的位置。文件標(biāo)記可以向可以根據(jù)讀寫的需要,人為地移動(dòng)了文件標(biāo)記的位置。文件標(biāo)記可以向前移、向后移,移到文件頭或文件尾,然后對(duì)該位置進(jìn)行讀寫前移、向后移,
31、移到文件頭或文件尾,然后對(duì)該位置進(jìn)行讀寫隨機(jī)隨機(jī)讀寫讀寫。隨機(jī)讀寫隨機(jī)讀寫可以在任何位置寫入數(shù)據(jù),在任何位置讀取數(shù)據(jù)可以在任何位置寫入數(shù)據(jù),在任何位置讀取數(shù)據(jù)。2. 文件位置標(biāo)記的定位文件位置標(biāo)記的定位(1)用用rewind函數(shù)函數(shù)使文件標(biāo)記指向文件開頭使文件標(biāo)記指向文件開頭。 例如:例如:rewind(fp);(2) 用用fseek函數(shù)函數(shù)改變文件標(biāo)記改變文件標(biāo)記。fseek函數(shù)的調(diào)用形式為函數(shù)的調(diào)用形式為: fseek(文件類型指針文件類型指針,位移量位移量,起始點(diǎn)起始點(diǎn)) 起始點(diǎn)起始點(diǎn):0代表代表“文件開始位置文件開始位置”,1為為“當(dāng)前位置當(dāng)前位置”,2為為“文件末尾文件末尾位置位置”
32、。位移量指以起始點(diǎn)為基點(diǎn),向前移動(dòng)的字節(jié)數(shù)。位移量應(yīng)是位移量指以起始點(diǎn)為基點(diǎn),向前移動(dòng)的字節(jié)數(shù)。位移量應(yīng)是long型數(shù)據(jù)型數(shù)據(jù)(在數(shù)字的末尾加一個(gè)字母在數(shù)字的末尾加一個(gè)字母L)。例如:例如:fseek (fp,-10L,2); (3) 用用ftell函數(shù)函數(shù)測(cè)定文件位置標(biāo)記的當(dāng)前位置測(cè)定文件位置標(biāo)記的當(dāng)前位置。ftell函數(shù)返回當(dāng)前位置相函數(shù)返回當(dāng)前位置相對(duì)于文件開頭的位移量。如果出錯(cuò)(如不存在對(duì)于文件開頭的位移量。如果出錯(cuò)(如不存在fp指向的文件),返回值為指向的文件),返回值為-1L。例如:。例如: i=ftell(fp); if(i=-1L) printf(“errorn”); 1.ferror函數(shù)函數(shù) ferror函數(shù)的一般調(diào)用形式為函數(shù)的一般調(diào)用形式為 ferror(fp); u如果返回值為如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 重慶大學(xué)課程設(shè)計(jì)仿真圖
- 二零二五年度橘子種植基地承包與農(nóng)產(chǎn)品出口協(xié)議3篇
- 二零二五年度美發(fā)店設(shè)備更新?lián)Q代及技術(shù)升級(jí)合同4篇
- 2025年度新型節(jié)能門窗安裝承攬合同范本3篇
- 2025年項(xiàng)目咨詢管理合作協(xié)議范本詳解3篇
- 二零二五年度酒店客房門鎖更換與升級(jí)服務(wù)合同4篇
- 2025年校車照管員崗位責(zé)任與風(fēng)險(xiǎn)防控合同2篇
- 二零二五年度民用航空運(yùn)輸合同服務(wù)質(zhì)量提升方案4篇
- 二零二五年度模板木枋行業(yè)創(chuàng)新發(fā)展基金合作合同4篇
- 2025年度高校教學(xué)樓租賃合同及智能化教學(xué)系統(tǒng)建設(shè)3篇
- 軌道工程-第三章-有砟軌道
- 泌尿:膀胱腫瘤病人的護(hù)理查房王雪-課件
- 標(biāo)點(diǎn)符號(hào)的研究報(bào)告
- 服務(wù)器報(bào)價(jià)表
- 2025年高考化學(xué)試題分析及復(fù)習(xí)策略講座
- 2024-2029年中國制漿系統(tǒng)行業(yè)市場(chǎng)現(xiàn)狀分析及競(jìng)爭(zhēng)格局與投資發(fā)展研究報(bào)告
- 大門封條模板
- ppr管件注塑工藝
- 液化氣站其他危險(xiǎn)和有害因素辨識(shí)及分析
- 高中語文教學(xué)課例《勸學(xué)》課程思政核心素養(yǎng)教學(xué)設(shè)計(jì)及總結(jié)反思
- 中國農(nóng)業(yè)銀行小微企業(yè)信貸業(yè)務(wù)貸后管理辦法規(guī)定
評(píng)論
0/150
提交評(píng)論