第5章 C語言的文件處理及其應(yīng)用_第1頁
第5章 C語言的文件處理及其應(yīng)用_第2頁
第5章 C語言的文件處理及其應(yīng)用_第3頁
第5章 C語言的文件處理及其應(yīng)用_第4頁
第5章 C語言的文件處理及其應(yīng)用_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第五章文件數(shù)據(jù)的處理目標(biāo):文件是程序設(shè)計(jì)中處理的重要數(shù)據(jù)對(duì)象之一,文件的主要作用是可以將數(shù)據(jù)永久地保存在計(jì)算機(jī)外部存儲(chǔ)介質(zhì)上,使之成為可以共享的信息。本章主要討論在緩沖文件系統(tǒng)中文件數(shù)據(jù)的常用處理方法

。本章分文以下三部分5.1文件處理基本概念5.2文件數(shù)據(jù)的讀寫方法5.3隨機(jī)存取文件處理基礎(chǔ)第五章文件數(shù)據(jù)的處理目標(biāo):文件是程序設(shè)計(jì)中處理的重要數(shù)據(jù)對(duì)象之一,文件的主要作用是可以將數(shù)據(jù)永久地保存在計(jì)算機(jī)外部存儲(chǔ)介質(zhì)上,使之成為可以共享的信息。本章主要討論在緩沖文件系統(tǒng)中文件數(shù)據(jù)的常用處理方法

。本章分文以下三部分5.1文件處理基本概念5.2文件數(shù)據(jù)的讀寫方法5.3隨機(jī)存取文件處理基礎(chǔ)第五章文件數(shù)據(jù)的處理目標(biāo):文件是程序設(shè)計(jì)中處理的重要數(shù)據(jù)對(duì)象之一,文件的主要作用是可以將數(shù)據(jù)永久地保存在計(jì)算機(jī)外部存儲(chǔ)介質(zhì)上,使之成為可以共享的信息。本章主要討論在緩沖文件系統(tǒng)中文件數(shù)據(jù)的常用處理方法

。本章分文以下三部分5.1文件處理基本概念5.2文件數(shù)據(jù)的讀寫方法5.3隨機(jī)存取文件處理基礎(chǔ)5.1文件處理基本概念--文件的概念什么是文件?文件是指具名存放在外部存儲(chǔ)設(shè)備上的一組信息,它們以二進(jìn)制代碼形式存在,可能是一組數(shù)據(jù)、一個(gè)程序,一張照片、一段聲音等等。

文件分類

⑴按文件的結(jié)構(gòu)形式分類;⑵按文件的讀寫方式分類;⑶按文件存儲(chǔ)的外部設(shè)備分類;⑷按系統(tǒng)對(duì)文件的處理方法分類;文件分類⑴按文件的結(jié)構(gòu)形式分類①二進(jìn)制文件:內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣存放到計(jì)算機(jī)外部存儲(chǔ)設(shè)備,這類文件可以節(jié)省計(jì)算機(jī)外存空間。②文本文件:全部由字符組成的具有行列結(jié)構(gòu)的文件,即文件的每個(gè)元素都是字符或換行符。1024二進(jìn)制文件文本文件000001000000000000000001000000000000001000000100文件分類⑵按文件的讀寫方式分類①順序存取文件(流式文件

):將文件看成是一個(gè)字符流,并不考慮其存儲(chǔ)時(shí)的界限,對(duì)文件的讀寫是以字符或字節(jié)為單位,輸入輸出數(shù)據(jù)流的開始和結(jié)束都受程序的控制而不是受回車換行符的控制。順序文件讀寫入數(shù)據(jù)時(shí),首先要打開順序文件并將文件內(nèi)部記錄(讀寫)指針置于文件的開頭,然后將數(shù)據(jù)按一個(gè)文件元素一個(gè)文件元素的順序進(jìn)行讀寫操作。②隨機(jī)存取文件具有隨機(jī)讀寫功能的文件稱為隨機(jī)存取文件。隨機(jī)文件對(duì)任一元素的讀寫不必象順序文件那樣從頭開始,而是可以直接對(duì)文件的某一元素進(jìn)行訪問。C語言的眾多編譯系統(tǒng)中都提供了隨機(jī)讀取文件中任意數(shù)據(jù)元素的函數(shù)。

文件分類⑶按文件存儲(chǔ)的外部設(shè)備分類①磁盤文件:保存在磁盤上的文件。程序的運(yùn)行過程中,需要將一些數(shù)據(jù)信息輸出到磁盤上保存起來,需要的時(shí)候再從磁盤中將數(shù)據(jù)讀取輸入到系統(tǒng)內(nèi)存中進(jìn)行處理。②設(shè)備文件。所有的計(jì)算機(jī)系統(tǒng)外部設(shè)備都作為文件對(duì)待,這樣的文件稱為設(shè)備文件。常用標(biāo)準(zhǔn)設(shè)備文件:

KYBD:(鍵盤)、SCRN:(顯示器)、

PRN或LPT1:(打印機(jī))等。3個(gè)特殊設(shè)備文件:stdin:(標(biāo)準(zhǔn)輸入文件) 由系統(tǒng)指定為鍵盤;stdout:(標(biāo)準(zhǔn)輸出文件) 由系統(tǒng)指定為顯示器;stderr:(標(biāo)準(zhǔn)錯(cuò)誤輸出文件) 由系統(tǒng)指定為顯示器;C語言中,將磁盤文件和設(shè)備文件都作為相同的邏輯文件對(duì)待,對(duì)這些文件的操作(輸入和輸出等)都采用相同的方法進(jìn)行。這種邏輯上的統(tǒng)一為C程序的設(shè)計(jì)提供了極大的便利,從而使得C標(biāo)準(zhǔn)函數(shù)庫中的輸入輸出函數(shù)既可以用來處理通常的磁盤文件,又可以用來對(duì)計(jì)算機(jī)系統(tǒng)的外部設(shè)備進(jìn)行控制。

文件分類⑷按系統(tǒng)對(duì)文件的處理方法分類。①緩沖文件系統(tǒng):系統(tǒng)自動(dòng)地在內(nèi)存中為每一個(gè)正在使用的文件開辟一個(gè)緩沖區(qū)。從內(nèi)存向磁盤輸出數(shù)據(jù)必須先送到內(nèi)存中的緩沖區(qū),待緩沖區(qū)裝滿后才將整個(gè)緩沖區(qū)的數(shù)據(jù)一起送到磁盤文件中保存。如果從磁盤文件向系統(tǒng)內(nèi)存讀入數(shù)據(jù),則從磁盤文件中一次讀入一批數(shù)據(jù)到系統(tǒng)緩沖區(qū),然后再從數(shù)據(jù)緩沖區(qū)中將數(shù)據(jù)送到對(duì)應(yīng)程序的變量數(shù)據(jù)存儲(chǔ)區(qū)。②非緩沖文件系統(tǒng):系統(tǒng)不自動(dòng)為程序開辟確定大小的文件緩沖區(qū),而由程序?yàn)橛玫降拿總€(gè)文件設(shè)置并管理緩沖區(qū)。1983年ANSIC標(biāo)準(zhǔn)決定放棄采用非緩沖文件系統(tǒng)而只使用緩沖文件系統(tǒng),即使用緩沖文件系統(tǒng)處理文本文件和二進(jìn)制文件。

文件類型指針緩沖文件系統(tǒng)中,對(duì)文件的處理都是通過在內(nèi)存中開辟一個(gè)區(qū)域(緩沖區(qū))來存取文件的相關(guān)的信息,比如說文件的名字、文件的狀態(tài)、文件讀寫指針的當(dāng)前位置等等,這些關(guān)于文件處理的信息在整個(gè)文件處理的過程中必須妥善保存和管理。C語言中用一個(gè)結(jié)構(gòu)體類型的變量來保存這些信息,該結(jié)構(gòu)體類型變量由語言處理系統(tǒng)預(yù)先定義并命名為FILE。VisualC++編譯器中對(duì)FILE結(jié)構(gòu)體類型定義如下:struct_iobuf{ char*_ptr;

int_cnt;char*_base;

int_flag;

int_file;

int_charbuf;

int_bufsiz;char*_tmpfname;};typedef

struct_iobufFILE;文件類型指針FILE*指針變量名;定義一個(gè)FILE結(jié)構(gòu)體數(shù)據(jù)類型的指針變量文件處理標(biāo)準(zhǔn)庫函數(shù)建立或者打開指定文件成功后,函數(shù)會(huì)給出該緩沖區(qū)的首地址(即FILE變量的首地址),所以程序員需要定義相應(yīng)的FLIE類型指針來存放該地址。使得文件指針與被打開文件建立起關(guān)聯(lián)。此后的代碼中既可通過文件指針對(duì)該文件中的數(shù)據(jù)進(jìn)行各種各樣的操作。如果需要同時(shí)處理若干個(gè)文件,則需要定義若干個(gè)文件類型指針。FILE*fp1,*fp2;同時(shí)定義了兩個(gè)文件類型指針變量fp1和fp2。5.2C語言中的文件處理基礎(chǔ)程序中對(duì)于文件處理的一般過程為:⑴打開(或者建立)要處理的文件。⑵按某種方式處理文件。⑶關(guān)閉被處理的文件。在C語言中,文件操作都是通過C提供的函數(shù)實(shí)現(xiàn)的。這些函數(shù)是放在標(biāo)準(zhǔn)輸入輸出函數(shù)庫“stdio.h”中文件的打開和關(guān)閉函數(shù)FILE*fopen(constchar*filename,constchar*mode);功能:按照指定的文件操作模式(方式)打開(或創(chuàng)建)指定的文件,打開(或創(chuàng)建)成功時(shí)返回與文件相對(duì)應(yīng)的結(jié)構(gòu)體類型變量的指針,否則返回空(NULL)。fopen的原型中參數(shù)的意義如下:⑴filename:指定將要訪問的文件名字,可以使用值為字符串類型的變量或者用雙引號(hào)括起來的字符串常量;⑵mode:指定文件模式,即規(guī)定文件操作的方式

文件的打開和關(guān)閉函數(shù)"r"以只讀方式打開一個(gè)已有的文本文件;"w"以只寫方式建立一個(gè)文本文件;"a"以添加方式打開一個(gè)文本文件,將文件數(shù)據(jù)指針移到文件末尾,在文件末尾進(jìn)行添加;若文件本身不存在,則先建立一新文件再進(jìn)行添加;"rb"以只讀方式打開一個(gè)二進(jìn)制文件;"wb"以只寫方式打開一個(gè)二進(jìn)制文件;"ab"以添加方式打開/建立一個(gè)二進(jìn)制文件;"r+"以讀寫方式打開一個(gè)已有的文本文件;"w+"以讀寫方式建立一個(gè)文本文件;"a+"以讀寫方式打開一個(gè)文本文件,文件數(shù)據(jù)指針移到文件末尾,在文件末尾進(jìn)行讀寫操作;若文件本身不存在,則先建立一新文件再操作;“rb+”以讀寫方式打開一個(gè)已有的二進(jìn)制文件;"wb+"以讀寫方式建立一個(gè)二進(jìn)制文件;"ab+"以讀寫方式打開/建立一個(gè)二進(jìn)制文件;

文件的打開和關(guān)閉fopen函數(shù)正確地打開或建立了指定文件時(shí),將返回系統(tǒng)中建立的文件類型結(jié)構(gòu)體變量的地址;fopen函數(shù)沒有正常地完成打開或建立文件的任務(wù),則會(huì)帶回一個(gè)出錯(cuò)信息并返回一個(gè)空值(NULL),程序中需要定義一個(gè)文件類型的指針變量用以接收和處理fopen函數(shù)返回的信息。為了在關(guān)于文件處理的C程序中正確地了解處理文件的狀態(tài),從程序結(jié)構(gòu)上一般使用如下方式去打開或建立文件:FILE*fpt;if((fpt=fopen(file_name,file_mode))==NULL){

printf("Can’topen/createthisfile!\n"); exit(0); }文件的打開和關(guān)閉在指定打開或者創(chuàng)建文件的操作模式(操作方法)時(shí)必須掌握下面幾條原則:(1)用操作模式"r"打開一個(gè)文件時(shí),該文件必須已經(jīng)存在,且只能從該文件讀出。(2)用操作模式"w"打開的文件只能向該文件寫入時(shí),若指定打開的文件不存在,則以指定的文件名建立該文件;若指定的文件名已經(jīng)存在,則將該文件打開并將原內(nèi)容清空(全部刪去)。(3)若要向一個(gè)已存在的文件追加新的信息,只能用操作模式"a"方式打開文件,但此時(shí)該文件必須是已經(jīng)存在的,否則將會(huì)出錯(cuò)文件的打開和關(guān)閉打開(或創(chuàng)建)一個(gè)文件就在內(nèi)存中分配一段區(qū)域作為文件緩沖區(qū),文件在使用過程中將一直占用該內(nèi)存空間,文件處理完成后應(yīng)及時(shí)地關(guān)閉文件以釋放文件所占用的存儲(chǔ)區(qū)域。int

fclose(FILE*stream);功能:將與指定文件指針變量相關(guān)聯(lián)的文件關(guān)閉。系統(tǒng)在關(guān)閉文件時(shí)首先將對(duì)應(yīng)文件緩沖區(qū)中還沒有處理完的數(shù)據(jù)寫回相對(duì)應(yīng)的文件,然后釋放與該指針對(duì)應(yīng)的文件結(jié)構(gòu)體變量,將資源歸還系統(tǒng)。fclose函數(shù)若正常關(guān)閉了文件,返回值為0,否則返回值為EOF。文件的打開和關(guān)閉例5.1從鍵盤上輸入所要?jiǎng)?chuàng)建文件的路徑(即存放目錄)和文件名字,創(chuàng)建一個(gè)用于寫操作的文本文件。printf("請(qǐng)輸入欲創(chuàng)建文件所在的目錄名:");gets(PathName);printf("請(qǐng)輸入欲創(chuàng)建文件文件名:");gets(FileName);strcpy(FullName,PathName);strcat(FullName,"\\");strcat(FullName,FileName);if((fp=fopen(FullName,"w"))==NULL) {

printf("Can'tcreatefile%s!\n",FullName);return;}else

printf("創(chuàng)建文件%s成功......\n",FullName);

fclose(fp);}生成文件名

文件的打開和關(guān)閉例5.1程序展示了在程序設(shè)計(jì)中如果需要在某個(gè)目錄(文件夾)中創(chuàng)建文件時(shí),文件名字的組合方法。程序一次運(yùn)行的過程如下所示:請(qǐng)輸入欲創(chuàng)建文件所在的目錄名:d:\cxsjjs(c)請(qǐng)輸入欲創(chuàng)建文件文件名:mydata.txt創(chuàng)建文件d:\cxsjjs(c)\mydata.txt

成功......

文件內(nèi)部讀寫位置指針和文件尾的檢測(cè)方法1.文件內(nèi)部讀寫位置指針記錄是文件內(nèi)部的組織單位,不同類型文件的記錄大小也不盡相同。例如文本文件的一個(gè)記錄是一個(gè)字節(jié),而32位系統(tǒng)的二進(jìn)制整型數(shù)據(jù)文件的一個(gè)記錄則是4個(gè)字節(jié)。當(dāng)打開(或創(chuàng)建)一個(gè)文件時(shí),系統(tǒng)自動(dòng)為打開的文件建立一個(gè)文件內(nèi)部讀寫位置指針(也稱為文件內(nèi)部記錄指針),該指針在對(duì)文件的讀寫過程中用于指示文件的當(dāng)前讀寫位置,每次對(duì)文件進(jìn)行了讀或?qū)懼?,文件位置指針自?dòng)更新指向下一個(gè)新的讀寫位置。

文件尾的檢測(cè)程序中需要判斷所處理的文件是否處理完成,即文件的讀寫位置指針是否已經(jīng)移動(dòng)到了文件尾標(biāo)志處。對(duì)于文本文件,由于任何一個(gè)字符的編碼均不是-1,所以可以用-1表示文本文件的文件尾標(biāo)志,系統(tǒng)中用符號(hào)常量EOF來表示。二進(jìn)制文件中,使用EOF符號(hào)常量并不能正確地表示出文件的結(jié)尾。ANSIC提供了一個(gè)測(cè)試文件狀態(tài)的函數(shù):int

feof(FILE*stream);功能:測(cè)試由stream所對(duì)應(yīng)文件的內(nèi)部記錄指針是否移動(dòng)到了文件結(jié)尾。當(dāng)內(nèi)部文件記錄指針未到文件尾時(shí),函數(shù)返回0值;當(dāng)內(nèi)部文件記錄指針到達(dá)文件尾時(shí),函數(shù)返回非0值。5.2文件數(shù)據(jù)的讀寫方法C程序設(shè)計(jì)語言提供了一系列關(guān)于文件數(shù)據(jù)讀寫的函數(shù),下面分別討論文件中單個(gè)字符數(shù)據(jù)的讀寫、文件中字符串?dāng)?shù)據(jù)的讀寫、文件中格式化數(shù)據(jù)的讀寫以及文件中數(shù)據(jù)塊的讀寫方法和簡單應(yīng)用。

文件中的單個(gè)字符讀寫操作int

fgetc(FILE*stream);功能:從與文件指針變量stream相關(guān)聯(lián)的文件中讀取一個(gè)字符讀取位置由文件的內(nèi)部記錄指針指定成功:返回其讀取的字符ASCII碼值文件結(jié)束或者執(zhí)行出錯(cuò):返回EOF(-1)文件中的單個(gè)字符讀寫操作int

fputc(intc,FILE*stream);功能:將用變量c表示的字符數(shù)據(jù)寫到與文件指針變量stream相關(guān)聯(lián)的文件寫入位置由文件的內(nèi)部記錄指針?biāo)付▓?zhí)行成功:返回被寫入文件的字符值執(zhí)行錯(cuò)誤:返回EOF

文件中的單個(gè)字符讀寫操作例5.1將從鍵盤上輸入的若干字符數(shù)據(jù)寫入文本文件mydata.txt。(提示:需要結(jié)束鍵盤輸入時(shí),輸入ctrl+z(EOF)后按回車鍵。)/*Name:ex0501.cpp*/#include<stdio.h>intmain(){ FILE*fp; charch;

fp=fopen("mydata.txt","w");

if(fp==NULL) {

printf("Can'tcreatefilemydata.txt!\n"); return-1; }

printf("請(qǐng)輸入字符串,用Ctrl+Z<CR>結(jié)束輸入:\n");

while((ch=getchar())!=EOF) //從鍵盤上輸入字符寫入文件mydata.txt

fputc(ch,fp);

fclose(fp); return0;}通過使用fputc函數(shù)的調(diào)用,依次將鍵盤輸入的字符寫入關(guān)聯(lián)的文件中

文件中的單個(gè)字符讀寫操作例5.2從文件mydata.txt(程序ex0501.cpp創(chuàng)建)中讀出所有字符數(shù)據(jù),并在系統(tǒng)標(biāo)準(zhǔn)輸出設(shè)備顯示器上輸出。if((fp=fopen("mydata.txt","w"))==NULL){

printf("Can'tcreatefilemydata.txt!\n"); return;}printf("請(qǐng)輸入寫入文件的字符數(shù)據(jù):\n");do{

ch=fgetc(fp);

putc(ch); }while(ch!=EOF);fclose(fp);文件中的單個(gè)字符讀寫操作例5.3編制能夠?qū)崿F(xiàn)文件拷貝功能的程序。文件名在程序運(yùn)行時(shí)從鍵盤提供,要求:(1)文件數(shù)據(jù)拷貝部分使用單獨(dú)的函數(shù)實(shí)現(xiàn)。(2)程序既能實(shí)現(xiàn)文本文件的拷貝,又能夠是實(shí)現(xiàn)二進(jìn)制文件的拷貝。voidfilecopy(FILE*fin,FILE*fout) //文件拷貝函數(shù)的定義{ charch; while(1) {

ch=fgetc(fin);

if(!feof(fin))

fputc(ch,fout); else break; }

文件中的字符串讀寫操作char*fgets(char*string,intn,FILE*stream);功能:從與文件指針變量stream相關(guān)聯(lián)的文件中最多讀取n-1個(gè)字符,添加上字符串結(jié)尾字符’\0’構(gòu)成字符串后存放到string所代表的字符串對(duì)象中去。如果在讀入n-1個(gè)字符前遇到換行符’\n’或文件結(jié)束符EOF時(shí)操作也將結(jié)束,將遇到的換行符作為一個(gè)有效字符處理,然后在讀入的字符串末尾自動(dòng)加上一個(gè)字符串結(jié)尾符’\0’后存放到string所代表的字符串對(duì)象中,函數(shù)執(zhí)行出錯(cuò)或遇到了文件的結(jié)束標(biāo)志時(shí)返回NULL。

文件中的字符串讀寫操作int

fputs(constchar*string,FILE*stream);功能:將string所代表的字符串寫入文件指針變量stream相關(guān)聯(lián)的文件。函數(shù)fputs正常執(zhí)行時(shí)返回寫入文件中的字符個(gè)數(shù),函數(shù)執(zhí)行出錯(cuò)時(shí)返回值為EOF。注意:fputs在向文件中寫入字符串時(shí)已經(jīng)去掉了字符串的結(jié)尾標(biāo)志‘\0’,因而連續(xù)寫入的字符串不能被正確地分隔而成為了一個(gè)字符串。為了使得寫入文件中的字符串能夠被正常地區(qū)別和處理,在使用fputs標(biāo)準(zhǔn)庫函數(shù)向文件中寫入字符串?dāng)?shù)據(jù)時(shí)每寫入一個(gè)字串后要自行在其后添加一個(gè)分隔標(biāo)志字符,為了與讀字符串標(biāo)準(zhǔn)庫函數(shù)fgets配合,使用換行符(‘\n’)作為分隔字符。

文件中的字符串讀寫操作例5.5從鍵盤上讀入若干行字符串并將它們存放到指定文件中,僅輸入一個(gè)回車時(shí)結(jié)束輸入過程,

if((fp=fopen(fn,"w"))==NULL){ printf("Can'tcreatefile.!\n"); return;}while(strlen(gets(str))>0){

fputs(str,fp);

fputc('\n',fp););//每個(gè)字符串?dāng)?shù)據(jù)后寫入一個(gè)換行符以分隔寫入的字符串?dāng)?shù)據(jù)}文件中的字符串讀寫操作程序在成功創(chuàng)建文件后,反復(fù)輸入字符串寫入指定文件,每寫入一個(gè)字符串立即寫入一個(gè)換行符作為子串與字串之間的分隔符號(hào),操作直到某次輸入直接按回車鍵為止(此時(shí)輸入的是空串,其字符串長度為0),最后關(guān)閉已寫入字符串內(nèi)容的文件。程序一次執(zhí)行的輸入數(shù)據(jù)如下所示:kdfhksdhfkjdsf //輸入數(shù)據(jù)Dfjsdlkfjsdlkfjlksdjhfklsdsdf;ljsdlkfjlksdjhflk //輸出數(shù)據(jù)fjksdhfjksdhkfhdslkf文件中的格式化讀寫操作int

fscanf(FILE*stream,constchar*format[,argument]...);函數(shù)fscanf與格式化輸入函數(shù)scanf的功能基本相同,不同的是scanf函數(shù)的數(shù)據(jù)來源于標(biāo)準(zhǔn)輸入設(shè)備(鍵盤),而fscanf函數(shù)的數(shù)據(jù)來源于與stream相關(guān)聯(lián)的文件,函數(shù)的返回值指出了函數(shù)正確處理的數(shù)據(jù)項(xiàng)個(gè)數(shù)。int

fprintf(FILE*stream,constchar*format[,argument]...);函數(shù)fprintf與格式化輸出函數(shù)printf的功能基本相同,不同的是printf函數(shù)輸出數(shù)據(jù)的目的地是標(biāo)準(zhǔn)輸出設(shè)備(顯示器),而fprintf函數(shù)輸出數(shù)據(jù)的目的地是由stream指定的文件,函數(shù)的返回值指出了函數(shù)正確寫入文件中的字節(jié)數(shù)。文件中的格式化讀寫操作例5.7編程序?qū)崿F(xiàn)功能:隨機(jī)產(chǎn)生100個(gè)具有3位整數(shù)、2位小數(shù)的雙精度實(shí)數(shù),將它們依次寫入到指定文件中,兩個(gè)數(shù)據(jù)之間用空格分隔,文件名在程序運(yùn)行時(shí)從鍵盤提供。

FILE*f; doublex;

inti; charfn[50];

printf("請(qǐng)輸入文件名:");

gets(fn);

if((f=fopen(fn,"wb"))==NULL) {

printf("創(chuàng)建文件失?。n"); return-1; }

srand(time(NULL));

for(i=0;i<100;i++) { x=100+rand()%900+rand()%100*1e-2; fprintf(f,"%.2lf",x);//注意控制格式,寫入數(shù)據(jù)用空格分隔

}

fclose(f); return0;文件中的格式化讀寫操作例5.8讀出例5.7創(chuàng)建的文件數(shù)據(jù)中所有數(shù)據(jù),然后將它們按降序排序后輸出。/*Name:ex0508.cpp*/#include<stdio.h>#defineN100voidsort(double

v[],intn);voidprintarray(double

v[],intn);intmain(){ FILE*fp; doublea[N];

inti;文件中的格式化讀寫操作charfn[50];

printf("請(qǐng)輸入文件名:");

gets(fn);

if((fp=fopen(fn,"rb"))==NULL) {

printf("打開文件失??!\n"); return-1; }

for(i=0;i<N;i++)

fscanf(fp,"%lf",&a[i]);

fclose(fp);

sort(a,N); //調(diào)用排序函數(shù)進(jìn)行排序

printarray(a,N); //調(diào)用輸出函數(shù)進(jìn)行顯示

return0;}文件中的格式化讀寫操作voidsort(double

v[],intn){

int

i,j,k; doublet;

for(i=0;i<n-1;i++) { k=i;

for(j=i+1;j<n;j++)

if(v[j]>v[k]) k=j;

if(k!=i) t=v[i],v[i]=v[k],v[k]=t; }}文件中的格式化讀寫操作voidprintarray(double

v[],intn){

inti;

for(i=0;i<n;i++) { printf("%7.2lf",v[i]); if((i+1)%10==0)

printf("\n"); }}文件中的數(shù)據(jù)塊讀寫操作size_t

fread(void*buffer,size_tsize,size_tcount,FILE*stream);功能:從與文件指針變量stream相關(guān)聯(lián)的文件中按指定長度讀取一個(gè)數(shù)據(jù)塊到內(nèi)存儲(chǔ)器的指定區(qū)域。函數(shù)的返回值是該函數(shù)執(zhí)行時(shí)正確從指定文件中讀出的數(shù)據(jù)項(xiàng)數(shù)(應(yīng)該與count參數(shù)指出的相同)。如果在讀出操作中出現(xiàn)了錯(cuò)誤則返回值小于count參數(shù)指出的應(yīng)讀出數(shù)據(jù)項(xiàng)數(shù)。文件中的數(shù)據(jù)塊讀寫操作size_t

fwrite(constvoid*buffer,size_tsize,size_tcount,FILE*stream);功能:將內(nèi)存儲(chǔ)器中指定區(qū)域的數(shù)據(jù)塊寫入到與文件指針變量stream相關(guān)聯(lián)的文件中。函數(shù)的返回值是該函數(shù)執(zhí)行時(shí)正確寫入文件中的數(shù)據(jù)項(xiàng)數(shù)(應(yīng)該與count參數(shù)指出的相同)。如果在寫入操作中出現(xiàn)了錯(cuò)誤則返回值小于count參數(shù)指出的寫入數(shù)據(jù)項(xiàng)數(shù)。

文件中的數(shù)據(jù)塊讀寫操作函數(shù)fread和fwrite用到的4個(gè)參數(shù)意義時(shí)相同的,只不過函數(shù)規(guī)定的操作方向剛好相反。四個(gè)參數(shù)的基本意義如下:(1)buffer:參數(shù)buffer指定數(shù)據(jù)在內(nèi)存儲(chǔ)器中存儲(chǔ)區(qū)域首地址。(2)size:參數(shù)size指定被操作的一個(gè)數(shù)據(jù)項(xiàng)的字節(jié)長度。(3)count:參數(shù)count指定一次函數(shù)操作(調(diào)用)所涉及長度為size的數(shù)據(jù)項(xiàng)個(gè)數(shù),由此可知函數(shù)每次操作數(shù)據(jù)塊的字節(jié)長度為size*count。(4)stream:參數(shù)stream是與被處理文件相關(guān)聯(lián)的文件類型指針變量,指出被操作的文件。文件中的數(shù)據(jù)塊讀寫操作例5.10將一個(gè)5x10的整型二維數(shù)組數(shù)據(jù)存入到指定文件中(數(shù)組數(shù)據(jù)用隨機(jī)數(shù)填充)。/*Name:ex0510.cpp*/#include<stdlib.h>#include<stdio.h>#include<time.h>#defineM5#defineN10intmain(){ voidmkarr(int

v[],int

m,intn);

int

a[M][N],i; FILE*f;charfn[50];

printf("請(qǐng)輸入文件名:");

gets(fn);

if((f=fopen(fn,"wb"))==NULL) {

printf("Can'tcreatefile.\n"); return-1; }文件中的數(shù)據(jù)塊讀寫操作mkarr(a[0],M,N);

for(i=0;i<M;i++)/*可用fwrite(a,sizeof(int),M*N,f);代替整個(gè)循環(huán)*/

fwrite(a[i],sizeof(int),N,f);

fclose(f); return0;}voidmkarr(int

v[],int

m,intn){int

i,j;

srand((unsigned)time(NULL));

for(i=0;i<m;i++)

for(j=0;j<n;j++)

v[i*n+j]=rand()%100;}上面程序代碼中,定義了一個(gè)5行10列的二維數(shù)組,調(diào)用函數(shù)mkarr用兩位以內(nèi)的隨機(jī)數(shù)填充數(shù)組元素。然后利用循環(huán),每次將二維數(shù)組中的一行寫入文件,循環(huán)5次將二維數(shù)組全部數(shù)據(jù)寫入的文件中。寫入數(shù)據(jù)到文件中時(shí),也可以考慮將二維數(shù)組一次性寫入文件,寫入函數(shù)的調(diào)用方法參見程序中的注釋。5.3隨機(jī)存取文件處理基礎(chǔ)文件的順序存取中,文件內(nèi)部記錄指針在對(duì)文件進(jìn)行每一次讀或?qū)懖僮髦蠖紩?huì)自動(dòng)向后移動(dòng)與讀寫方式相適應(yīng)的距離,將文件內(nèi)部記錄指針定位到下一次在文件中讀或?qū)懙奈恢蒙?。文件的隨機(jī)存取就是使用C標(biāo)準(zhǔn)庫中提供的移動(dòng)文件內(nèi)部讀寫位置指針標(biāo)準(zhǔn)庫函數(shù),將讀寫位置指針移動(dòng)到要處理的文件數(shù)據(jù)區(qū)指定位置,然后再通過使用文件數(shù)據(jù)讀寫標(biāo)準(zhǔn)庫函數(shù)進(jìn)行處理,從而實(shí)現(xiàn)修改文件部分內(nèi)容的功能、提高文件數(shù)據(jù)處理效率。

文件的隨機(jī)存取處理應(yīng)該分為兩個(gè)步驟:第一步是按要求移動(dòng)文件內(nèi)部記錄指針到指定的讀寫位置;第二步用系統(tǒng)提供的讀寫方法讀寫所需要的信息。文件的操作位置指針和文件定位1重置文件內(nèi)部記錄指針voidrewind(FILE*stream);功能:將由stream所關(guān)聯(lián)文件的文件內(nèi)部記錄指針從任何位置重新?lián)芑匚募_頭。例5.12

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論