




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