版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第8章 文件系統(tǒng)《C語言程序設計》
2學習目標與要求1、理解文件、文件系統(tǒng)、文件指針的概念2、了解文件的分類情況,掌握文本文件與二進制文件區(qū)別3、掌握文件的打開和關(guān)閉的含義,會合理使用各種不同的打開方式4、掌握使用字符讀寫函數(shù)、字符串讀寫函數(shù)、數(shù)據(jù)塊讀寫函數(shù)、格式讀寫函數(shù)、和定位函數(shù)對文件進行順序或隨機讀寫5、能編寫對文件進行處理的實用程序《C語言程序設計》
3本章要點文件系統(tǒng)
文件的打開與關(guān)閉文件的字符讀寫文件的字符串讀寫文件的數(shù)據(jù)塊讀寫文件的格式化讀寫文件的定位小結(jié)《C語言程序設計》
4文件系統(tǒng)“文件”是指一組相關(guān)數(shù)據(jù)的有序集合。為了標識一個文件,每個文件都必須有一個文件名。其一般結(jié)構(gòu)為:主文件名.[擴展文件名]。主文件的命名規(guī)則遵循操作系統(tǒng)的規(guī)定,擴展名表示文件的類型。例如:一個C語言源程序擴展名為“c”,擴展名有時也可以省略?!禖語言程序設計》
5從不同的角度可對文件作不同的分類。1、按文件的組織形式分類(1)順序存取文件順序存取文件是指存取文件只能從頭開始,順序存取各個數(shù)據(jù)。(2)隨機存儲文件隨機存儲文件是指可先移動文件內(nèi)部的位置指針到需要讀寫的位置,再進行存取其中數(shù)據(jù)?!禖語言程序設計》
62、按記錄的邏輯結(jié)構(gòu)分類(1)記錄文件具有一定結(jié)構(gòu)的記錄組成,可以指定長度,也可以不指定長度。如數(shù)據(jù)庫文件。(2)流式文件由一連串的字符(字節(jié))數(shù)據(jù)順序組成。如C系統(tǒng),把文件都看成是字符流,按字節(jié)進行處理。輸入輸出字符流的開始和結(jié)束只由程序控制而不受物理符號(如回車符)的控制,更靈活?!禖語言程序設計》
73、按文件的內(nèi)容來分類(1)程序文件程序文件是由程序代碼組成的有序集合,又可分為源文件、目標文件和可執(zhí)行程序。(2)數(shù)據(jù)文件數(shù)據(jù)文件是由一系列數(shù)據(jù)組成的有序集合,如各種輸入輸出數(shù)據(jù),包括文檔文件、圖形文件和聲音文件。《C語言程序設計》
84、按數(shù)據(jù)的組織形式來分類(1)文本文件又稱ASCII碼文件,在磁盤中存放字符對應的一個字節(jié)的ASCII碼。例如,數(shù)12345的存儲形式為:字符形式ASCII碼(十進制)ASCII碼(二進制)'1'4900110001'2'5000110010'3'5100110011'4'5200110100'5'5300110101《C語言程序設計》
9(2)二進制文件按二進制的編碼方式來存放文件。例如,數(shù)12345的存儲形式為:0011000000111001只占二個字節(jié)。當用戶建立的文件主要是為了進行數(shù)據(jù)處理時,最好建立成二進制文件,可以提高速度;如果是為了輸出到顯示器或打印機供人們閱讀,則建立成文本文件更恰當?!禖語言程序設計》
105、按存儲介質(zhì)分類(1)普通文件駐留在磁盤或其它外部介質(zhì)上的一個有序數(shù)據(jù)集,可以是源文件、目標文件、可執(zhí)行程序;也可以是一組待輸入處理的原始數(shù)據(jù),或者是一組輸出的結(jié)果。(2)設備文件設備文件是指與主機相聯(lián)的各種外部設備,如顯示器、打印機、鍵盤等。C語言編譯程序把各種輸入輸出設備也當作文件處理?!禖語言程序設計》
11typedef
struct{shortlevel;unsignedflags;charfd;
unsignedcharhold;shortbsize;
unsignedchar*buffer,*curp;unsignedistemp;shorttoken;
}FILE;TurboC中在頭文件“stdio.h”中,定義了FILE結(jié)構(gòu)體類型?!禖語言程序設計》
12程序說明:level短整型變量,數(shù)值表示緩沖區(qū)“滿”或“空”的程度;無符號整型變量flags標識文件的狀態(tài);字符變量fd為文件描述符即表示文件名;如無緩沖區(qū)則不讀取無符號字符型變量hold的值;短整型變量bsize表示緩沖區(qū)的大??;指針buffer指向數(shù)據(jù)緩沖區(qū)的位置,指針curp表示當前指針的指向;istemp是指向臨時文件的指示器;短整型變量token用于進行有效性檢查。注意:其中FILE應為大寫,它是由系統(tǒng)定義的一個結(jié)構(gòu)?!禖語言程序設計》
13在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。定義文件指針。格式如下:FILE*指針變量標識符;例如:FILE*fp;表示fp是指向FILE結(jié)構(gòu)的指針變量,通過fp就可找存放某個文件信息的結(jié)構(gòu)變量,然后按結(jié)構(gòu)變量提供的信息找到該文件,實施對文件的操作。習慣上把fp稱為指向一個文件的指針?!禖語言程序設計》
14注意:文件的讀寫指針不同與文件指針,文件指針用來指向整個文件的,即指向所指文件的“文件信息區(qū)”的地址,須在程序中定義說明。對某個被打開的文件來說,只要不重新賦值,該文件的指針是不會改變?!禖語言程序設計》
15C語言提供兩種文件處理方式:緩沖文件系統(tǒng)和非緩沖文件系統(tǒng)。緩沖文件系統(tǒng)功能強、使用方便,但效率稍低,而非緩沖文件系統(tǒng)執(zhí)行效率高。緩沖文件系統(tǒng)和非緩沖文件系統(tǒng)都是通過標準庫函數(shù)實現(xiàn)文件的操作。本章只介紹緩沖文件系統(tǒng)下的文件操作,這些操作都是用庫函數(shù)來實現(xiàn)的?!禖語言程序設計》
16文件的打開與關(guān)閉在進行文件操作之前要先打開文件,使用完畢要關(guān)閉。所謂打開文件,實際上是建立文件的各種有關(guān)信息,并使文件指針指向該文件,以便進行其它操作。關(guān)閉文件則斷開指針與文件之間的聯(lián)系,也就禁止再對該文件進行操作。在C語言中,文件操作都是由庫函數(shù)來完成的,這些函數(shù)在頭文件“stdio.h”中?!禖語言程序設計》
17文件的打開(fopen函數(shù))它的原型如下:FILE*fopen(constchar*,constchar*mode);說明:1、形參是一個字符指針變量,指向字符型數(shù)據(jù)。調(diào)用時,實參一般用字符串常量或字符數(shù)組名,它們表示要打開的文件名,文件名前面可以帶路徑。2、形參mode也是一個字符指針變量,指向字符型數(shù)據(jù),調(diào)用時,實參一般用字符串,表示打開文件的方式?!禖語言程序設計》
18它由兩類字符構(gòu)成,一類字符表示打開文件的類型,文本文件(text)用字符“t”表示;二進制文件(binary)用字符“b”表示,如省略則默認為文本文件。另一類字符表示文件的使用方式,它有12種。為了便于記憶,我們把12個文件的使用方式分為兩組,第一組為基本方式,有讀或?qū)憙烧咧坏墓δ?;第二組為增強方式,用“+”表示,有讀和寫兩個功能。每組又分為文本文件和二進制文件兩種方式,每種文件都有“r”、“w”、“a”這3種基本字符,分別表示讀、寫和追加方式?!禖語言程序設計》
20要注意的是在實參字符串中,文件的使用方式在前,文件的類型符在后,如"rb"、"wb",不可寫成"br"、"bw"。對于“+”來說,可以放在文件的使用方式的右邊,也可以放在文件的類型符的右邊,但不可放在文件的使用方式的左邊。如“w+b”或“wb+”都是正確的,而“+wb”則是錯誤的?!禖語言程序設計》
213、此函數(shù)的功能是按指定的方式打開文件。如果文件打開成功,則返回該文件結(jié)構(gòu)體的指針;如果讀文件時文件不存在,或者寫文件時文件不能創(chuàng)建則打開失敗,則返回NULL。4、函數(shù)的調(diào)用的一般形式為:文件指針名=fopen(文件名,使用文件方式);例如:FILE*fp;fp=("f.txt","r");其意義是在當前目錄下打開文本文件f.txt,只允許進行“讀”操作,并使fp指向該文件?!禖語言程序設計》
22又如:FILE*gp;gp=("c:\\bx\\abc","rb");其意義是打開C驅(qū)動器磁盤的根目錄下bx文件夾中的文件abc,這是一個二進制文件,只允許按二進制方式進行讀操作。兩個反斜線“\\”中的第一個表示轉(zhuǎn)義字符,第二個表示文件路徑的逐級目錄分隔符。5、fopen函數(shù)一次只能打開一個文件,如需打開多個文件,則要多次調(diào)用該函數(shù)?!禖語言程序設計》
23【例8-1】以讀方式打開C盤根目錄下bx文件夾中的文件abc,如果打開失敗,則退出系統(tǒng)。#include<stdio.h>voidmain(){FILE*gp;gp=fopen("c:\\bx\\abc","rb");if(gp==NULL){printf("\nthisfoundorcan'topen,strikeanykeyexit!");getch();exit(0);}}《C語言程序設計》
24
程序運行情況:thisfoundorcan'topen,strikeanykeyexit!
程序說明:因為事先沒有在C盤根目錄下bx文件夾中創(chuàng)建文件abc,則返回的指針為空,給出提示信息“thisfoundorcan'topen!”。getch()語句的作用是從鍵盤輸入一個字符,但不在屏幕上顯示。在這里的作用是等待,用戶可利用這個等待時間閱讀出錯提示,只有當用戶從鍵盤敲任一鍵時,程序才繼續(xù)執(zhí)行exit(0)語句,退出程序?!禖語言程序設計》
25文件關(guān)閉函數(shù)(fclose函數(shù))文件一旦使用完畢,應該用關(guān)閉文件函數(shù)把文件關(guān)閉,以避免文件的數(shù)據(jù)丟失等錯誤。它的原型為:int*fclose(FILE*fp);說明:1、形參fp是一個文件指針變量,通常這個參數(shù)就是fopen函數(shù)的返回值。2、此函數(shù)的功能是關(guān)閉文件指針fp所指向的文件。如果正常關(guān)閉了文件,則函數(shù)的返回值為0;如果有錯誤發(fā)生,則返回EOF。EOF是在頭文件“stdio.h”中定義的符號常量,其值為-1?!禖語言程序設計》
263、函數(shù)調(diào)用的一般形式是:fclose(文件指針);例如:fclose(fp);我們應該養(yǎng)成在程序終止之前關(guān)閉所有文件的習慣。只有用fclose函數(shù)關(guān)閉文件,才可以避免緩沖區(qū)的數(shù)據(jù)丟失。fclose函數(shù)一次只能關(guān)閉一個文件,如需關(guān)閉多個文件,則要多次調(diào)用該函數(shù)?!禖語言程序設計》
27文件的讀寫讀文件是將磁盤文件中的數(shù)據(jù)傳送到計算機內(nèi)存的操作,寫文件是從計算機內(nèi)存向磁盤文件傳送數(shù)據(jù)的操作。文件的讀寫函數(shù)主要包括:字符讀寫函數(shù)(fgetc和fputc)字符串讀寫函數(shù)(fgets和fputs)數(shù)據(jù)塊讀寫函數(shù)(freed和fwrite)格式化讀寫函數(shù)(fscanf和fprinf)《C語言程序設計》
28文件的字符讀寫字符讀寫函數(shù)fgetc和fputc是以字符(字節(jié))為單位的讀寫函數(shù)。每次可從文件讀出或向文件寫入一個字符。1、寫字符函數(shù)fputc它的原型如下:intfputc(intc,FILE*fp);說明:(1)該函數(shù)功能是將字符數(shù)據(jù)c輸出到文件指針fp所指向的文件中去,同時將文件的讀寫指針向后(向下)移動一個字節(jié)(字符),即指向下一個寫入位置?!禖語言程序設計》
29(2)如果輸出成功,則函數(shù)的返回值就是字符數(shù)據(jù)c的ASCII碼值;否則返回EOF(-1)。可用此來判斷寫入是否成功。(3)函數(shù)調(diào)用的形式為:fputc(字符量,文件指針);例如:fputc('a',fp);其意義是把字符a寫入fp所指向的文件中。其中,待寫入的字符量可以是字符常量或變量。又如:fputc(c,stdout);該語句等價于putchar(c);表示將字符變量c的內(nèi)容輸出到終端,一般指顯示器?!禖語言程序設計》
30注意:在fputc函數(shù)調(diào)用中,被寫入的文件可以用寫、讀寫,追加方式打開。用寫或讀寫方式打開一個已存在的文件時將清除原有的文件內(nèi)容,寫入字符從文件首開始。如需保留原有文件內(nèi)容,希望寫入的字符以文件末開始存放,必須以追加方式打開文件。被寫入的文件若不存在,則創(chuàng)建該文件?!禖語言程序設計》
31【例8-2】從鍵盤輸入一行字符,把它們顯示在屏幕上,同時寫入當前目錄下的“”文件中。程序運行情況:inputastring:China↙China程序示例《C語言程序設計》
32程序說明:①語句if((fp=fopen("","w"))==NULL)等價于fp=fopen("","w");if(fp==NULL)兩條語句。因為邏輯運算符的優(yōu)先級高于賦值運算符,語句fp=fopen(“”,“w”);兩邊一定要加上括號。該語句的功能是先以只寫方式打開文件"",并使指針變量fp指向該文件,接著判斷fp是否為空?!禖語言程序設計》
33②通過while語句將一行字符輸出到屏幕上,同時寫入文件中。③最后用fclose函數(shù)關(guān)閉文件,把緩沖區(qū)的數(shù)據(jù)輸出到磁盤文件,并且釋放文件指針變量。④本程序運行后,會在當前目錄創(chuàng)建一個包含有“China”這幾個字符的“”文件??芍苯佑糜浭卤敬蜷_該文件,也可以在DOS狀態(tài)下,輸入“type”命令查看文件內(nèi)容?!禖語言程序設計》
342、讀字符函數(shù)fgetc它的原型如下:intfgetc(FILE*fp);說明:(1)該函數(shù)功能是從文件指針fp所指向的文件中,讀入一個字節(jié)(字符),同時將文件的讀寫指針向后(向下)移動一個字節(jié)(字符),即指向下一個讀入位置。(2)如果讀取正常,返回讀到的字節(jié)值;如果讀到文件尾或出錯,則返回EOF(-1)?!禖語言程序設計》
35(3)函數(shù)調(diào)用的一般形式為:字符變量=fgetc(文件指針);例如:ch=fgetc(fp);其意義是從打開的文件fp中讀取一個字符并賦給變量ch。再如:fgetc(stdin);該語句等價于getchar();表示從鍵盤中讀取一個字符。注意:在fgetc函數(shù)調(diào)用中,讀取的文件必須是以讀或讀寫方式打開的。在文件打開時,文件的讀寫指針總是指向文件的第一個字節(jié)。使用fgetc函數(shù)后,該位置指針將向后移動一個字節(jié)?!禖語言程序設計》
36(4)判斷文件是否結(jié)束。方法一:用EOF來判斷文件,部分語句如下:while((ch=fgetc(fp))!=EOF)…方法二:用函數(shù)feof用來判斷文件是否結(jié)束。如果遇到文件結(jié)束,函數(shù)的返回值為1,否則為0。部分語句為:while(!feof(fp)){ch=fgetc(fp);…}當讀取文本文件時,可以用上述兩種方法判斷文件是否結(jié)束。但當讀取二進制文件時,只可以用第二種方法。因為二進制文件中某一字節(jié)內(nèi)容可以是-1,即可能等于EOF,而文本文件中字符的ASCII碼值總是大于等于0?!禖語言程序設計》
37【例8-3】在屏幕上輸出上例生成的文件“”的內(nèi)容。程序運行情況:thecontentofthis程序說明:①本程序先以只讀方式打開文件"",并使指針變量fp指向該文件,如果文件""沒通過上例生成,則可用記事本建立,否則程序會顯示"thisfoundorcan'topen!"提示錯誤信息。程序示例《C語言程序設計》
38②通過while語句將文件""中的所有字符輸出到屏幕上。每執(zhí)行一次循環(huán),從文件的讀寫指針所指的讀寫位置處讀入一個字符賦給變量ch,然后判斷該字符是否是文件的結(jié)束標識EOF,若是,結(jié)束循環(huán);否則,將該字符顯示在屏幕上,再讀入下一字符。每讀一次,文件的讀寫指針向后移動一個字符,文件結(jié)束時,該指針指向EOF。③最后用fclose函數(shù)關(guān)閉文件,釋放文件指針變量?!禖語言程序設計》
39【例8-4】設計一個程序,實現(xiàn)文本文件的復制。程序運行情況:Enterthesource:↙Enterthedestination:↙程序說明:①在提示“Enterthesource:”時,用戶輸入源文件名"",賦給字符數(shù)組file1,接著用fopen函數(shù)的讀方式打開該文件,使指針fp1指向文件""。程序示例《C語言程序設計》
40②在提示“Enterthedestinationname:”時,用戶輸入目標文件名"",賦給字符數(shù)組file2,接著用fopen函數(shù)的寫方式打開該文件,使指針fp2指向文件""。③while語句的作用是將文件""中的所有字符輸出到文件""中,每執(zhí)行一次循環(huán),先用feof函數(shù)來判斷文件是否結(jié)束,若是,結(jié)束循環(huán),否則,從文件""的讀寫指針所指的讀寫位置處讀入一個字符,并且寫入到""的讀寫指針所指的讀寫位置處?!禖語言程序設計》
41④最后用fclose函數(shù)關(guān)閉兩個文件。上述程序是按文本文件方式處理的。如要復制的文件為二進制文件,只需要將兩個fopen函數(shù)中的"r"改成"rb"、"w"改成"wb"即可。有時我們希望像使用DOS中的copy命令一樣,在輸入命令時連著兩個文件名一起輸入,這就要用到命令行參數(shù),同時我們要把上例程序改寫成帶參數(shù)的main函數(shù)?!纠?-5】帶參數(shù)的main函數(shù)。程序示例《C語言程序設計》
42程序說明:程序中定義了兩個文件指針fp1和fp2,分別指向命令行參數(shù)中給出的文件。如果輸入的參數(shù)不為三個,則程序會給出“Youmustenterthesourcethedestination:”的錯誤提示,提醒用戶必須輸入源文件和目標文件名。while循環(huán)的作用是逐個讀出文件1中的字符再送到文件2中?!禖語言程序設計》
43假設本程序的源文件保存為8-5.c,經(jīng)過編譯連接后得到的可執(zhí)行文件名為8-5.exe,則在DOS命令工作方式下,輸入可執(zhí)行文件名“8-5源文件名目標文件名”。注意,此程序要運行成功,必須先建立好提供復制的源文件。例如輸入:8-5↙此命令行共有3個參數(shù),因此argc的值為3,同時傳遞參數(shù)"8-5"給argv[0]、""給argv[1]、""給argv[2],程序運行后就把""文件中的內(nèi)容復制到""中。我們可以打開這兩個文件查看,或用type命令驗證。《C語言程序設計》
44還要說明的是,TurboC系統(tǒng)在庫文件"stdio.h"把fputc和fgetc函數(shù)定義為宏名putc和getc,語句如下:#defineputc(ch,fp)fputc(ch,fp)#definegetc(fp)fgetc(fp)為了書寫方便,我們經(jīng)常用putc函數(shù)代替fputc函數(shù),用getc函數(shù)代替fgetc函數(shù)?!禖語言程序設計》
45文件的字符串讀寫字符串讀寫函數(shù)fgets和fputs是以字符串的形式對文件進行讀寫的函數(shù)。每次可從文件讀出(指定長度)或向文件寫入一個字符串。1、寫字符串函數(shù)fputs它的原型如下:intfputs(constchar*s,FILE*fp);說明:《C語言程序設計》
46(1)該函數(shù)功能是將指針s所指向的字符串寫到文件指針fp所指向的文件中去,同時將文件的讀寫指針向后(向下)移動字符串長度個字節(jié)(字符)。注意,fputs函數(shù)不會將字符串結(jié)束符'\0'寫入文件,也不會自動向文件寫入換行符,所以輸出到文件中的各字符串連在一起,沒有分隔符。為了便于以后從文件中讀數(shù)據(jù)時能區(qū)分各字符串,s字符串中要包含換行符'\n',也可以單獨使用函數(shù)fputs("\n",fp)或函數(shù)fputc('\n',fp)。請注意這兩個函數(shù)用法上的區(qū)別?!禖語言程序設計》
47(2)如果操作成功,函數(shù)的返回值就是最后寫入文件的字符值;否則返回EOF(-1)。(3)函數(shù)調(diào)用的形式為:fputs(字符串,文件指針);例如:fputs("abcd",fp);其意義是把字符串"abcd"寫入fp所指的文件之中。又如在語句fputs(str,fp);中,str可以是字符串常量,也可以是存放字符串的字符數(shù)組名,或指向字符串的指針變量?!禖語言程序設計》
48【例8-6】從鍵盤輸入若干行字符,把它們追加到例8-2中建立的“”文件中。程序運行情況:inputastring:Howareyou?↙inputastring:Iamfine.↙inputastring:↙程序說明:①本例要求在""文件追加字符串,因此,用fopen函數(shù)的追加方式打開該文件。程序示例《C語言程序設計》
49②在while語句中,先調(diào)用gets函數(shù)從鍵盤輸入一行字符,送到字符數(shù)組s中,若輸入的字符串為空,跳出循環(huán);否則,輸出換行符,接著把此字符串輸出到文件""中。③最后用fclose函數(shù)關(guān)閉文件,把緩沖區(qū)的數(shù)據(jù)輸出到磁盤文件,釋放文件指針變量。④在例8-2程序執(zhí)行后,""文件的內(nèi)容為“China”。本程序運行后,文件的內(nèi)容,有三行:ChinaHowareyou?Iamfine.《C語言程序設計》
502、讀字符串函數(shù)fgets它的原型為:int*fgets(char*s,intn,FILE*fp);說明:(1)該函數(shù)功能是從文件指針fp所指向的文件中,讀入長度最多為n-1的字符串,并在字符串的末尾加上串結(jié)束標志'\0',然后將字符指針s指向字符串的首地址。同時將讀寫指針向后(下)移動實際讀取的字符串長度個字節(jié)。注意,讀入的字符串長度可能小于等于n-1,因為當從文件中讀取第n-1個字符后或讀取數(shù)據(jù)過程中遇到換行符'\n'后,《C語言程序設計》
51函數(shù)就會返回。如果遇到的是換行符,它也將作為字符串的一部分。(2)如果讀取正常,返回讀取到的字符串的首地址s;如果讀到文件尾或出錯,則返回NULL。(3)函數(shù)調(diào)用的形式為:fgets(字符串起始地址,n,文件指針);例如:在語句fgets(str,n,fp);中,str用來存放字符串的起始地址,可以是字符數(shù)組名或指向足夠存儲空間的字符指針?!禖語言程序設計》
52【例8-7】從上例生成的文件“”中讀回字符串,并顯示在屏幕上。程序運行情況:thecontentofthis:ChinaHowareyou?Iamfine.程序說明:程序在運行時,在屏幕上按行輸出""文件中的所有字符。因為讀入的字符串中已包含'\n',字符串還是分行輸出。程序示例《C語言程序設計》
53文件的數(shù)據(jù)塊讀寫C語言還提供了用于整塊數(shù)據(jù)的讀寫函數(shù)fread和fwrite??捎脕碜x寫一組數(shù)據(jù),如一個數(shù)組元素,一個結(jié)構(gòu)變量的值等。fread和fwrite一般用于二進制文件的輸入輸出。1、寫數(shù)據(jù)塊函數(shù)fwrite它的原型為:size_tfwrite(constvoid*ptr,size_tsize,size_tn,FILE*fp);說明:《C語言程序設計》
54(1)該函數(shù)功能是將ptr所指向的內(nèi)存中存放的n個大小為size個字節(jié)的數(shù)據(jù)項寫入到fp所指向的文件中,實際要寫入數(shù)據(jù)的字節(jié)數(shù)是n*size。同時,將讀寫指針向后(下)移動n*size個字節(jié)。(2)如果操作成功,則函數(shù)返回值就是讀取的數(shù)據(jù)項的個數(shù)(不是字節(jié)數(shù)),如果操作出錯,則返回0。《C語言程序設計》
55(3)調(diào)用的一般形式為:fwrite(buffer,size,count,fp);其中buffer是一個指針,它表示存放輸出數(shù)據(jù)的首地址。size表示數(shù)據(jù)塊的字節(jié)數(shù)。count表示要讀寫的數(shù)據(jù)塊塊數(shù)。fp表示文件指針。例如:fwrite(fa,2,5,fp);其意義是把數(shù)組fa的首地址開始的數(shù)據(jù),寫入到指針fp所指的文件中,每次寫2個字節(jié)(一個整數(shù)),連續(xù)寫5次?!禖語言程序設計》
56【例8-8】從鍵盤上輸入一批學生的數(shù)據(jù)(包括姓名、學號、成績),將它們存放到二進制文件“student”中。程序運行情況:zhangsan200600190↙Haveanotherrecord(y/n)?y↙lisi200600288↙Haveanotherrecord(y/n)?y↙wangwu200600393↙Haveanotherrecord(y/n)?n↙程序示例《C語言程序設計》
57程序說明:①先定義結(jié)構(gòu)體數(shù)組stu有40個元素,每一個元素用來存放一位學生的姓名、學號、成績?nèi)棓?shù)據(jù)。②在do…while語句中,首先從鍵盤輸入的數(shù)據(jù)給數(shù)組元素stu[i],并輸出到文件。其中函數(shù)sizeof(stu[i])用來計算出一個數(shù)據(jù)塊的大小,也可以用sizeof(structstudent)代替,或者寫成16(表示一個student類型結(jié)構(gòu)體變量的長度)。輸完一個學生數(shù)據(jù)后,i自增1,接著詢問用戶是否有下一個學生數(shù)據(jù)?若輸入為'Y'或'y',則繼續(xù)循環(huán),否則結(jié)束循環(huán)?!禖語言程序設計》
58③程序中第一個getchar()函數(shù)的作用是接收在執(zhí)行scanf語句時最后輸入的回車符,此處不能省略,否則程序只能循環(huán)一次。④注意輸入數(shù)據(jù)的情況,學生數(shù)據(jù)輸入時是ASCII碼,也就是文本文件。在送到計算機內(nèi)存時,存成二進制形式,其中回車和換行符兩個符號轉(zhuǎn)換成一個換行符。再從內(nèi)存以"wb"方式(二進制寫)輸出到文件"student",此時不需發(fā)生轉(zhuǎn)換,當你查看文件"student"內(nèi)容時,發(fā)現(xiàn)里面有一些不能讀懂的字符,這就是與文本文件的區(qū)別。
《C語言程序設計》
592、讀數(shù)據(jù)塊函數(shù)它的原型為:size_tfread(void*ptr,size_tsize,size_tn,FILE*fp);說明:(1)該函數(shù)功能是從文件指針fp所指向的文件中,讀取n個數(shù)據(jù)項,每個數(shù)據(jù)項的大小是size個字節(jié),這些數(shù)據(jù)將被存放到ptr所指向的內(nèi)存中。同時,將讀寫指針向后(下)移動n*size個字節(jié)。(2)如果操作成功,則函數(shù)返回值就是讀取的數(shù)據(jù)項的個數(shù)(不是字節(jié)數(shù)),如果讀到文件尾或出錯,則返回0?!禖語言程序設計》
60(3)調(diào)用的一般形式為:fread(buffer,size,count,fp);其中buffer是一個指針,它表示存放輸入數(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中。《C語言程序設計》
61【例8-9】從上例生成的二進制文件“student”中讀回學生數(shù)據(jù),并顯示在屏幕上。程序運行情況:name:zhangsan num:2006001 score:90name:lisi num:2006002 score:88name:wangwu num:2006003 score:93程序說明:①程序中的while語句中將文件"student"中的學生數(shù)據(jù)逐個讀出,然后輸出在終端屏幕上。程序示例《C語言程序設計》
62函數(shù)fread(&stu[i],sizeof(stu[i]),1,fp)就是讀取一個學生的數(shù)據(jù),如果操作成功就返回1,可以繼續(xù)循環(huán),否則,結(jié)束循環(huán)。②注意輸出數(shù)據(jù)的情況,fread函數(shù)從"student"文件向內(nèi)存讀入數(shù)據(jù),該文件是二進制文件,且是用"rb"方式(二進制讀)打開的,因此數(shù)據(jù)按原樣輸入,不發(fā)生字符轉(zhuǎn)換,這時候內(nèi)存中的數(shù)據(jù)又恢復到上一程序從鍵盤輸入數(shù)據(jù)后的情況。從屏幕上顯示的情況來看,換行符又轉(zhuǎn)換為回車加換行符?!禖語言程序設計》
63文件的格式化讀寫C語言提供了對文件進行格式化讀寫的函數(shù)fscanf和fprinf。二者的功能與我們前面學習的格式化輸入、輸出函數(shù)scanf和prinf相似,區(qū)別在于fscanf和fprinf函數(shù)的操作對象是文件,而scanf和prinf函數(shù)的操作對象是標準輸入(stdin)、輸出(stdout)文件,即鍵盤和顯示器。1、fprinf函數(shù)它的原型如下:intfprinf(FILE*fp,constchar*format,…);說明:《C語言程序設計》
64(1)該函數(shù)功能是將表達式輸出到fp所指向文件中,如果操作成功,則返回值就是寫入到文件中數(shù)據(jù)的字節(jié)個數(shù);如果操作出錯,則返回EOF。(2)調(diào)用的一般形式為:fprintf(文件指針,格式字符串,輸出表列);如:fprintf(fp,"%d,%c",a,ch);其意義是將變量a和ch按"%d%c"的格式輸出到fp所指指向文件中。又如:fprintf(stdout,"%6.3f",x);等價于printf("%6.3f",x);其意義是將變量x按"%6.3f"的格式輸出到終端顯示器上?!禖語言程序設計》
652、fscanf函數(shù)它的原型如下:intfscanf(FILE*fp,constchar*format,…);說明:(1)該函數(shù)功能是從fp所指向的文件中讀取數(shù)據(jù)。如果操作成功,則函數(shù)返回值就是讀取的數(shù)據(jù)項的個數(shù);如果操作出錯或遇到文件尾,則返回EOF。(2)調(diào)用的一般形式為:fscanf(文件指針,格式字符串,輸入表列);《C語言程序設計》
66例如:fscanf(fp,"%d,%c",&a,&ch);其意義是從fp所指向的文件中讀取一個整型數(shù)據(jù)、逗號、一個字符數(shù)據(jù)。其中整型數(shù)據(jù)賦給變量a,字符數(shù)據(jù)賦給變量ch。又如:fscanf(stdin,"%f",x);等價于scanf("%f",x);其意義是從標準輸入文件(鍵盤)上讀入一個浮點數(shù)給變量x。使用fscanf和fprinf函數(shù),應注意以下幾個問題:(1)fscanf和fprinf函數(shù)適用與文本文件,一般來講,由fprinf函數(shù)寫入磁盤中的數(shù)據(jù),應由fscanf函數(shù)以相同格式從磁盤文件讀出來使用。《C語言程序設計》
67例如:例8-8中語句fwrite(&stu[i],sizeof(stu[i]),1,fp);可以用語句fprintf(fp,"%s%ld%d\n",stu[i].name,stu[i].num,stu[i].score);代替;相應的例8-9中語句“while(fread(&stu[i],sizeof(stu[i]),1,fp)==1);”可以用語句“while(fscanf(fp,"%s%ld%d\n",stu[i].name,&stu[i].num,&stu[i].score)!=EOF)”代替。《C語言程序設計》
68注意:在fprintf格式串中用空格作為各項之間的分隔符,用換行作為各個學生數(shù)據(jù)的分隔符,在fread格式串中也要用空格作為各項之間的分隔符,換行符‘\n’也不能省略,否則讀出的數(shù)據(jù)有誤。(2)用fscanf和fprinf函數(shù)對磁盤文件讀寫,使用方便,容易理解。但由于在輸入是要將ASCII碼轉(zhuǎn)換為二進制形式存入內(nèi)存,在寫入文件時又要將二進制形式轉(zhuǎn)換為ASCII碼,花費時間較多,而使用fread和fwrite函數(shù)轉(zhuǎn)換就簡單的多了?!禖語言程序設計》
69文件的定位前面介紹的對文件的讀寫方式都是順序讀寫,即讀寫文件只能從打開位置開始,順序讀寫各個數(shù)據(jù)。但在實際問題中常要求只讀寫文件中某一指定的部分。為了解決這個問題可移動文件內(nèi)部的位置指針到需要讀寫的位置,再進行讀寫,這種讀寫稱為隨機讀寫。實現(xiàn)隨機讀寫的關(guān)鍵是要按要求移動位置指針,這稱為文件的定位。文件定位移動文件內(nèi)部位置指針的函數(shù)主要有兩個,即rewind函數(shù)和fseek函數(shù)。如果想知道文件讀寫指針的位置,可以調(diào)用ftell函數(shù)?!禖語言程序設計》
701、rewind函數(shù)它的原型如下:voidrewind(FILE*fp);說明:(1)該函數(shù)功能是將fp所指向文件的讀寫指針重新移動到文件的開頭,該函數(shù)沒有返回值。(2)調(diào)用的一般形式為:rewind(文件指針);例如:rewind(fp);《C語言程序設計》
712、fseek函數(shù)它的原型如下:intfseek(FILE*fp,longoffset,intwhence);說明:(1)該函數(shù)功能是將fp所指文件的讀寫指針移動到特定位置。這個特定位置是由參數(shù)offset和whence決定的,即將讀寫指針移到距離whence的offset字節(jié)處。whence的值見表8-2。如果offset為正值,表明新的位置在whence的后(下)面,如果offset為負值,表明新的位置在whence的前(上)面。《C語言程序設計》
72表2-2whence的常量值及含義(2)如果操作成功,返回值為0,否則返回一個非零值。《C語言程序設計》
73(3)調(diào)用的一般形式fseek(文件指針,位移量,起始點);“位移量”表示移動的字節(jié)數(shù),要求long型數(shù)據(jù),以便在文件長度大于64KB時不會出錯。常量表示位移量時,加后綴“L”。例如:fseek(fp,10L,0);把位置指針移到離文件首10個字節(jié)處。fseek(fp,80L,1);把位置指針移到離當前位置80個字節(jié)處。fseek(fp,-30L,2);將位置指針從文件末尾向前(向上)退30個字節(jié)?!禖語言程序設計》
74(4)利用fseek函數(shù)就可以實現(xiàn)隨機讀寫了。還要說明的是fseek函數(shù)一般用于二進制文件。在文本文件中由于要進行轉(zhuǎn)換,故往往計算的位置會出現(xiàn)錯誤。文件的隨機讀寫在移動位置指針之后,即可用前面介紹的任一種讀寫函數(shù)進行讀寫。由于一般是讀寫一個數(shù)據(jù)塊,因此常用fread和fwrite函數(shù)。《C語言程序設計》
753、ftell函數(shù)它的原型為:longftell(FILE*fp);說明:(1)該函數(shù)功能是返回fp所指向文件的讀寫指針的值,該值用相對文件開頭的位移量(字節(jié)數(shù))表示,是long型數(shù)據(jù)。如果出錯,則返回-1L。(2)調(diào)用的一般形式為:ftell(文件指針);例如:x=ftell(fp);注意此處x要定義為long型變量?!禖語言程序設計》
76【例8-10】從鍵盤輸入一個實型float數(shù)組a的十個元素并存放到二進制文件"f.dat"中,輸出文件的長度(字節(jié)數(shù)),然后從文件讀取奇數(shù)位置的五個數(shù)據(jù)到實型數(shù)組b中,并在屏幕上輸出數(shù)組b中的所有元素,及元素之和。程序示例《C語言程序設計》
77程序運行情況:1.22.33.44.55.66.77.88.99.010.1↙thecurrentbytenumber:40afterrewindthecurrentbytenumber:01.2000003.4000005.6000007.8000009.00000027.000000程序說明:①本例要求先把數(shù)據(jù)寫入文件中,然后從文件中讀取數(shù)據(jù),因此,用fopen函數(shù)的"wb+"二進制讀寫方式打開該文件?!禖語言程序設計》
78②語句fwrite(a,4,10,fp);的作用是把數(shù)組a的首地址開始的數(shù)據(jù),寫入到指針fp所指的文件中,每次寫4個字節(jié)(一個實數(shù)),連續(xù)寫10次。注意此時文件讀寫指針的位置已經(jīng)向下移動了40(4*10)字節(jié),即指向文件末尾,可以從輸出的ftell(fp)的值為40得到驗證。③語句rewind(fp);的作用是使讀寫指針又指向文件的開頭,我們從輸出的ftell(fp)的值為0得到驗證。如果遺漏該語句,直接用函數(shù)fread讀取數(shù)據(jù),此時指針指向文件末尾,讀取的數(shù)據(jù)是沒有意義的。《C語言程序設計》
79④for循環(huán)執(zhí)行5次,在每一次循環(huán)中,語句fread(&b[i],4,1,fp)的作用是從
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度鋼筋套筒市場推廣與銷售合同2篇
- 2024電力行業(yè)標準制定與修訂合同
- 外墻清洗合同樣板
- 2025年度首飾質(zhì)押擔保寄售服務合同范本3篇
- 二零二五年數(shù)據(jù)中心建設項目合同2025版協(xié)議書2篇
- 2025年度智能家居系統(tǒng)小區(qū)商品房裝修居間合同3篇
- 二零二五年度高端別墅買賣合同與房產(chǎn)交易合同書3篇
- 2025年度污水處理廠運營安全管理合同3篇
- 2024水電安裝與建筑智能化系統(tǒng)維護服務合同范本3篇
- 二零二五年特種環(huán)境空調(diào)設備采購與系統(tǒng)集成合同3篇
- GB/T 44890-2024行政許可工作規(guī)范
- 二年級下冊加減混合豎式練習360題附答案
- (完整版)四年級上冊數(shù)學豎式計算題100題直接打印版
- 部編人教版九年級語文上冊全冊課后教學反思匯總
- (完整版)居家養(yǎng)老服務項目收費標準一覽表
- 玻璃瓶罐的缺陷產(chǎn)生原因及解決方法63699
- 高層住宅(23-33層)造價估算指標
- “千師訪萬家”家訪記錄表(共2頁)
- 服裝采購招標文件范本
- 《青田石雕》教學設計
- (精選)有限空間作業(yè)安全監(jiān)理實施細則
評論
0/150
提交評論