版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第12章 文件 本章概述 本章的學習目標主要內(nèi)容1本章概述文件操作是C語言程序設計中的重要組成部分。很多應用問題中會用到文件操作。本章討論C語言程序設計中的文件操作。包括文件的打開與關閉、文件的定位與檢測、文件的讀寫所使用的各種函數(shù)和編程方法。2本章的學習目標本章教學目的:理解文件的概念,掌握用來進行文件的打開、關閉、定位、檢測、讀寫操作的方法。本章教學重點:文件的讀寫本章教學難點:文件的定位與檢測3主要內(nèi)容12.1 文件概述 12.2 文件的打開與關閉 12.3 文件的定位和檢測 12.4 文件的讀寫 12.5 程序設計舉例 412.1 文件概述 12.1.1 文件文件是程序設計中的一個重要
2、概念,所謂“文件”是指存儲在外部介質(zhì)(如磁盤)上的一組相關數(shù)據(jù)的集合,為了便于定位這組數(shù)據(jù),通常要為它取一個名稱,即文件名。操作系統(tǒng)就是以文件為單位對數(shù)據(jù)進行管理的,如果想找存儲在外部介質(zhì)上的數(shù)據(jù),必須按文件名找到存放該數(shù)據(jù)的文件,然后再從文件中讀取數(shù)據(jù)。從用戶的角度來看,文件可以分普通文件和設備文件。普通文件是駐留在外部介質(zhì)上的有序數(shù)據(jù)集,它可以是源文件、目標文件、可執(zhí)行程序,也可是一組待輸入的原始數(shù)據(jù),或者是一組輸出結果。前者通常稱為程序文件,后者則可稱為數(shù)據(jù)文件。設備文件是指與主機相聯(lián)的各種外部設備,如顯示器、鍵盤等,對于操作系統(tǒng)而言,每一個與主機相聯(lián)的輸入/輸出設備都是一個文件,其輸入
3、輸出等同于文件的讀和寫。例如,通常將顯示器定義為標準輸出文件,將鍵盤定義為標準輸入文件。我們前面使用的printf()、putchar()等C函數(shù)就是輸出到標準輸出文件(即顯示器),scanf()、getchar()等C函數(shù)就是從標準輸入文件(即鍵盤)輸入數(shù)據(jù)。 512.1 文件概述 12.1.2 數(shù)據(jù)文件的存儲形式從文件的編碼方式來看,文件可以分為ASCII碼文件和二進制文件兩種。ASCII碼文件也稱為文本文件,這種文件在磁盤中存儲時每個字符對應一個字節(jié),存放的是該字符的ASCII碼值。二進制文件是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣輸出到磁盤上存放。ASCII碼文件內(nèi)容可以在屏幕上按字
4、符顯示,例如C源程序文件就是ASCII文件,在windows中可以直接用記事本打開閱讀。由于ASCII碼文件是按字符顯示,因此能讀懂其內(nèi)容,而二進制文件雖然有時也能顯示在屏幕上,但其內(nèi)容卻無法直接讀懂。6圖12.1中,00110001、00110010、00110011、00110100分別是字符1、2、3、4的ASCII碼值的二進制形式。例如,數(shù)字1234的幾種存儲形式如圖12.1所示: 7存儲內(nèi)容用ASCII碼形式輸出時,其字節(jié)與字符一一對應,一個字節(jié)代表一個字符,便于對字符進行逐個處理,也便于輸出字符,但一般占用的存儲空間較多,而且要花費轉換時間。用二進制形式輸出,可以節(jié)省外存空間和轉換
5、時間,但一個字節(jié)與字符無一一對應關系,不能直接輸出字符形式。一般中間結果數(shù)據(jù)需要暫時保存在外存上,常用二進制文件保存。因為C文件是一串字節(jié)流或二進制流,所以C系統(tǒng)在處理這些文件時,并不區(qū)分類型,都看成是字符流,按字節(jié)進行處理。輸入輸出字符流的開始和結束只由程序控制而不受物理符號(如回車符)的控制,即在輸出時不會自動增加回車換行符以作為記錄結束的標志,輸入時不以回車換行符作為記錄的間隔。我們把這種文件稱作“流式文件”。C語言允許對文件存取一個字符,有很強的靈活性。812.1.3 標準文件與非標準文件在老版本的C(如Unix下的C)中對文件的處理方式有兩種:一種是緩沖文件系統(tǒng)又稱標準文件系統(tǒng),另一
6、種是非緩沖文件系統(tǒng)又稱非標準文件系統(tǒng)。9所謂“緩沖文件系統(tǒng)”是指系統(tǒng)自動地在內(nèi)存區(qū)為每一個正在使用的文件開辟一個緩沖區(qū),從內(nèi)存向磁盤輸出數(shù)據(jù)時必須先送到內(nèi)存中的緩沖區(qū),緩沖區(qū)裝滿數(shù)據(jù)后,再一起送到磁盤中去。同樣,從磁盤向內(nèi)存中讀入數(shù)據(jù)時,則一次從磁盤文件中將一批數(shù)據(jù)讀入到緩沖區(qū),然后再從緩沖區(qū)逐個地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(給程序中的變量),如圖12.2所示。緩沖區(qū)的大小隨C的版本不同而不同,一般為512字節(jié)。10所謂“非緩沖文件系統(tǒng)”是指系統(tǒng)不會自動開辟確定大小的緩沖區(qū),而由程序為每個文件設定緩沖區(qū)。C語言中沒有專門的輸入輸出語句,對文件的讀寫都是用庫函數(shù)來實現(xiàn)的,ANSI規(guī)定了輸入輸出函數(shù),用
7、它們對文件進行讀寫。本章只介紹ANSI C規(guī)定的緩沖文件系統(tǒng),即標準文件系統(tǒng)。 1112.1.4 文件類型指針 在緩沖文件系統(tǒng)中有一個關鍵概念是“文件類型指針”,每一個存在的文件都在內(nèi)存中開辟一個區(qū)域,用來存放文件的有關信息(如文件的名稱、文件狀態(tài)、文件當前位置等),這些信息保存在一個結構體變量中,該結構體由系統(tǒng)聲明,取名為FILE。 Turbo C在stdio.h文件中有以下的類型聲明:typedef struct short level; /*緩沖區(qū)“滿”或“空”的程度*/ unsigned flags; /*文件狀態(tài)標志*/ char fd; /*文件描述符*/ unsigned cha
8、r hold; /*如無緩沖區(qū)不讀取字符*/ short bsize; /*緩沖區(qū)的大小*/ unsigned char *buffer; /*數(shù)據(jù)緩沖區(qū)的位置*/ unsigned char *curp; /*指針,當前的指向*/ unsigned istemp; /*臨時文件,指示器*/ short token; /*用于有效性檢查*/FILE; 1212.1.4 文件類型指針 定義文件類型指針變量的格式為: FILE *指針變量標識符;例如: FILE *fp; 上面的定義表示fp是指向文件類型的指針變量。 文件被打開時,系統(tǒng)自動為該文件定義一個FILE類型變量,使該文件與對應的FILE
9、類型變量建立聯(lián)系。因為fp是指向FILE類型的指針變量,通過fp即可找到存放該文件信息的FILE類型變量,然后按變量提供的信息找到該文件,對該文件實施操作。 習慣上籠統(tǒng)地把fp稱為文件類型指針。所謂打開文件就是指建立文件的各種有關信息,并使FILE類型指針指向該文件,以便對文件進行操作。關閉文件則斷開FILE類型指針與該文件間的聯(lián)系,也就禁止對該文件進行操作。1312.2 文件的打開與關閉 12.2.1 打開文件的函數(shù)( fopen) 函數(shù)fopen用來打開文件,函數(shù)fopen的使用格式如下: FILE *fp ; fp = fopen(文件名,文件使用方式) 例如:fp=fopen(“d:e
10、xerciseuser.txt”, “r”); 表示要打開的文件名為user.txt,文件在d:exercise目錄下,使用文件的方式為“只讀”(r代表讀)。fopen函數(shù)帶回指向user.txt文件的指針并賦給fp,這樣fp就指向user.txt文件。 由上面例子可以看出,在打開一個文件時,通知編譯系統(tǒng)以下信息: 需要打開的文件標識,也就是文件的位置及文件名; 使用文件的方式(是“讀”還是“寫”等); 讓哪一個指針指向被打開的文件。14表12-1 文件的使用方式字符含 義r以只讀方式打開一個文本文件。文件必須存在,否則打開失敗。打開后,文件內(nèi)部的位置指針指向文件首部的第一個字符。w以只寫方式
11、打開一個文本文件。若文件不存在,則建立該文件。若文件已存在,則刪除原文件內(nèi)容,寫入新內(nèi)容。a以追加方式打開一個文本文件。只能向文件尾追加數(shù)據(jù)。文件必須存在,否則打開失敗。打開后,文件內(nèi)部的位置指針指向文件尾。rb以只讀方式打開一個二進制文件。文件必須存在,否則打開失敗。打開后,文件內(nèi)部的位置指針指向文件首部的第一個字節(jié)。wb以只寫方式打開一個二進制文件。若文件不存在,則建立該文件。若文件已存在,則刪除原文件內(nèi)容,寫入新內(nèi)容。ab以追加方式打開一個二進制文件。只能向文件尾追加數(shù)據(jù)。文件必須存在,否則打開失敗。打開后,文件內(nèi)部的位置指針指向文件尾。15表12-1 文件的使用方式字符含 義r+以讀/
12、寫方式打開一個文本文件。文件必須存在。打開后,文件內(nèi)部的位置指針指向文件首部的第一個字符。打開后,可以讀取文本內(nèi)容,也可以寫入文本內(nèi)容,也可以既讀又寫。w+以讀/寫方式打開或新建立一個文本文件。若文件已存在,則新的寫操作將覆蓋原來的數(shù)據(jù)。若文件不存在,則建立一個新文件。還可以在不關閉文件的情況下,再讀取文件內(nèi)容。a+以讀和追加的方式打開一個文本文件。允許讀或追加。文件必須存在,否則打開失敗。打開后,文件內(nèi)部的位置指針指向文件尾??稍谖募沧芳訑?shù)據(jù),也可將位置指針移到某個位置,讀取文件內(nèi)容。rb+以讀/寫方式打開二進制文件。文件必須存在。打開后,文件內(nèi)部的位置指針指向文件首部的第一個字節(jié)。打開后
13、,可以讀取數(shù)據(jù),也可以寫入數(shù)據(jù),也可以既讀又寫。wb+以讀/寫方式打開或新建立一個二進制文件。若文件已存在,則新的寫操作將覆蓋原來的數(shù)據(jù)。若文件不存在,則建立一個新文件。還可以在不關閉文件的情況下,再讀取文件內(nèi)容。ab+以讀和追加的方式打開一個二進制文件。允許讀或追加。文件必須存在,否則打開失敗。打開后,文件內(nèi)部的位置指針指向文件尾。可在文件尾追加數(shù)據(jù),也可將位置指針移到某個位置,讀取數(shù)據(jù)。1612.2 文件的打開與關閉 如果成功打開一個文件,則fopen()函數(shù)將返回一個指向該文件的指針,否則將返回空指針(NULL),由此可以判斷一個文件是否成功打開。1712.2 文件的打開與關閉 12.2
14、.2 關閉文件的函數(shù)fclose fclose函數(shù)用來關閉一個文件,其使用格式如下: fclose(文件類型指針); 例如: fclose(fp); 用fclose函數(shù)關閉一個由fopen函數(shù)打開的文件,當文件關閉成功時返回0,否則返回EOF。EOF是在stdio.h中定義的符號常量,值為-1??梢愿鶕?jù)該函數(shù)返回的值判斷文件是否正常關閉。1812.2 文件的打開與關閉 例12.1 打開與關閉文件示例。#include int main()FILE *fp; int i; fp=fopen(“cj.dat”, “rb”); if(fp=NULL) printf(“File open failed
15、!n”); else printf(“File open successful!n”); i=fclose(fp); if (i=0) printf(“File close successful!n”); else printf(“File close failed!n”); return 0; 1912.3 文件的定位和檢測 12.3.1 文件的順序讀寫和隨機讀寫對文件的讀寫方式有兩種:順序讀寫和隨機讀寫,也稱為順序存取和隨機存取。順序讀寫的特點是:從文件開始到文件結尾,一個字節(jié)一個字節(jié)地順序讀寫,讀寫完第一個字節(jié),才能順序讀寫第二個字節(jié),讀寫完第二個字節(jié),才能順序讀寫第三個字節(jié),依次類推。
16、隨機讀寫的特點是:允許從文件的任何位置開始讀寫,利用后面介紹的fseek和rewind函數(shù),可以使文件內(nèi)部的位置指針指向某一個位置,從該位置開始讀寫。用程序來控制文件內(nèi)部的位置指針的移動,稱為文件的定位。對于存儲在磁盤上的文件,既可以采用順序讀寫方式,也可以采用隨機讀寫方式。2012.3 文件的定位和檢測 12.3.2 rewind函數(shù)和fseek函數(shù) 1rewind函數(shù) rewind函數(shù)的使用格式: rewind(文件類型指針); 例如: rewind(fp); rewind函數(shù)的功能是把文件內(nèi)部的位置指針重新定位到文件的開頭,此函數(shù)無返回值。 注意:剛打開文件時,文件內(nèi)部的位置指針是定位在
17、文件的開頭,即文件首。2112.3 文件的定位和檢測 12.3.2 rewind函數(shù)和fseek函數(shù) 2fseek函數(shù)fseek函數(shù)的使用格式如下: fseek(文件類型指針,位移量,起始點);fseek函數(shù)的功能是移動文件內(nèi)部的位置指針到規(guī)定的位置。 2212.3 文件的定位和檢測 fseek函數(shù)的第一個參數(shù)是“文件類型指針”,指明了要操作是哪一個文件。第二個參數(shù)是“位移量”,指明了從“起始點”開始移動的字節(jié)數(shù),位移量必須是長整型數(shù)據(jù),加后綴“L”;若位移量是正整數(shù),表示文件內(nèi)部的位置指針向文件尾方向移動,若位移量是負整數(shù),表示文件內(nèi)部的位置指針向文件首方向移動。第三個參數(shù)是“起始點”,指明
18、了移動時的起始位置,起始點有三種取值,分別代表文件首、文件尾和當前位置,如表12-2所示。 表12-2 fseek函數(shù)的起始點符號常量數(shù)值含義SEEK_SET0從文件首開始移動SEEK_CUR1從文件的當前位置開始移動SEEK_END2從文件尾開始移動23例如:fseek(fp,100L,SEEK_SET); 或fseek(fp,100L, 0); 將文件內(nèi)部的位置指針從文件首開始向文件尾方向移動100個字節(jié)。fseek(fp,20L,SEEK_CUR); 或fseek(fp,20L,1); 將文件內(nèi)部的位置指針從當前位置向文件尾方向移動20個字節(jié)。fseek(fp,-30L,SEEK_CUR
19、); 或fseek(fp,-30L,1); 將文件內(nèi)部的位置指針從當前位置向文件首方向移動30個字節(jié)。fseek(fp,-10L,SEEK_END); 或fseek(fp,-10L,2); 將文件內(nèi)部的位置指針從文件尾開始向文件首方向移動10個字節(jié)。2412.3 文件的定位和檢測 12.3.3 feof函數(shù)和ftell函數(shù) 1feof函數(shù) feof函數(shù)的使用格式如下: feof(文件類型指針); feof函數(shù)是用來檢測文件位置指針是否到達文件尾,若到達文件尾則返回一個非0值(真),否則返回0(假)。當我們對文件操作時,例如順序讀取文件的所有數(shù)據(jù),可以使用這個函數(shù)來判斷文件內(nèi)容是否結束,若文件內(nèi)
20、容沒有結束,則繼續(xù)讀取數(shù)據(jù),否則結束讀取操作。 下面的循環(huán)語句是使用feof函數(shù)判斷fp所指向的文本文件內(nèi)容是否結束,若文件內(nèi)容沒有結束,則使用fgetc函數(shù)繼續(xù)讀取數(shù)據(jù)。fgetc將在后面介紹。While (!feof(fp) putchar(fgetc(fp); 2512.3 文件的定位和檢測 12.3.3 feof函數(shù)和ftell函數(shù) 2ftell函數(shù) ftell函數(shù)的使用格式如下: 長整型變量=ftell(文件類型指針); ftell函數(shù)是用來檢測文件內(nèi)部的位置指針的當前位置,若調(diào)用成功,ftell函數(shù)返回值是:從文件開頭到位置指針所指當前位置的總的字節(jié)數(shù)(長整型),否則返回值是-1L
21、。2612.3 文件的定位和檢測 12.3.4 ferror函數(shù)和clearerr函數(shù) 1ferror函數(shù) ferror函數(shù)的使用格式如下: ferror(文件指針); ferror函數(shù)的功能是檢查文件在用各種輸入輸出函數(shù)進行讀寫時是否出錯。若ferror返回值為0表示未出錯,否則表示有錯。執(zhí)行fopen函數(shù)時,ferror函數(shù)的初始值自動置為0。 2712.3 文件的定位和檢測 12.3.4 ferror函數(shù)和clearerr函數(shù) 2clearerr函數(shù) clearerr函數(shù)的使用格式如下: clearerr(文件指針); clearerr函數(shù)的功能是將文件的錯誤標志和文件結束標志設置為0。
22、若文件發(fā)生了輸入輸出錯誤,其錯誤標志被置為非0,該值會一直保持到再一次調(diào)用輸入輸出函數(shù)或者使用clearerr函數(shù)才會改變。文件剛打開時,錯誤標志為0。2812.4 文件的讀寫 12.4.1 fgetc函數(shù)和fputc函數(shù) 1fgetc函數(shù) fgetc函數(shù)的使用格式如下: fgetc(文件類型指針); fgetc函數(shù)的功能是從文件類型指針指向的文本文件的當前位置讀取一個字符,該字符的ASCII碼值作為函數(shù)的返回值,若讀到文件結束符(z)或讀取不成功,則返回EOF(-1)。從文件讀取一個字符后,文件的當前位置將后移一個字節(jié)。 2912.4.1 fgetc函數(shù)和fputc函數(shù)例如:FILE *fp
23、 ; char ch; fp=fopen(“d:yw.txt”,“r”); ch=fgetc(fp);表示從fp所指向的文件的當前位置讀取一個字符,賦給字符型變量ch。getchar()與fgetc(stdin)功能相同,這里的stdin代表標準輸入文件(如鍵盤)。這兩種形式的作用都是從終端(如鍵盤)輸入一個字符,函數(shù)值就是該字符。3012.4.1 fgetc函數(shù)和fputc函數(shù)2fputc函數(shù) fputc函數(shù)的使用格式如下: fputc(字符表達式,文件類型指針); fputc函數(shù)的功能是向文件類型指針指向的文本文件的當前位置寫入一個字符,“字符表達式”代表要寫入的字符,字符表達式可以是字符
24、常量或字符變量。若寫入成功,則函數(shù)的返回值是所寫入字符的ASCII碼值,否則返回值為EOF(-1)。向文件寫入一個字符后,文件的當前位置將后移一個字節(jié)。3112.4.1 fgetc函數(shù)和fputc函數(shù)例如:FILE *fp ; char ch=A; fp=fopen(“d:yw.txt”,“w”); fpuc(ch , fp); 表示將存儲在變量ch中的字符A寫入fp所指向的文件的當前位置。 putchar(ch)與fputc(ch, stdout)功能相同,這里的stdout代表標準輸出文件(如顯示器)。這兩種形式的作用都是向終端(如顯示器)輸出一個字符。32例12.2 從鍵盤輸入若干個字符
25、,將其中的小寫英文字母寫入d盤根目錄下名為“yw.txt”文本文件中,將其它字符顯示在屏幕上,若輸入字符#,則程序結束。 #include int main( ) FILE *fp ; char ch; if (fp=fopen(“d:yw.txt”,“w”)=NULL) printf(“cannot open file!n”); exit(0); ch=getchar( ); while(ch !=#) if (ch=a & ch=a & ch=A & ch=Z) fputc( ch , fp2 ); fclose(fp1); fclose(fp2); return 0; 3412.4 文件
26、的讀寫 12.4.2 fread函數(shù)和fwrite函數(shù) 1fread函數(shù) fread函數(shù)的使用格式如下: fread(buffer, size, count, fp); 其中:buffer是存放數(shù)據(jù)的存儲空間的起始地址;size是數(shù)據(jù)塊的大小(字節(jié)數(shù));count是讀多少個塊;fp是文件類型指針。fread函數(shù)的功能是:從fp所指向的文件中讀取數(shù)據(jù)塊,讀取的字節(jié)數(shù)為size*count,讀取來的數(shù)據(jù)存放在buffer為起始地址的內(nèi)存中。若fread函數(shù)的返回值等于count,則執(zhí)行本函數(shù)讀取數(shù)據(jù)成功;若文件結束或發(fā)生錯誤,返回值等于0。 例如,若已知有“int a10;”,則下面語句: fre
27、ad(a, sizeof(int), 10, fp);從fp所指向的文件中讀取2*10個字節(jié)(即10個整數(shù))存放于數(shù)組a中。3512.4.2 fread函數(shù)和fwrite函數(shù)2fwrite函數(shù)fwrite函數(shù)的使用格式如下: fwrite(buffer, size, count, fp); 其中四個參數(shù)的含義與fread函數(shù)基本相同,只不過現(xiàn)在是將內(nèi)存中從buffer地址開始的數(shù)據(jù)往fp所指向的文件里寫。 fwrite函數(shù)的的功能是:將內(nèi)存中從buffer地址開始的數(shù)據(jù)往fp所指向的文件里寫,寫入到文件里的字節(jié)數(shù)為size*count。 例如,下面語句: int b6=1,3,5,7,9,11
28、; fwrite(b, sizeof(int), 6, fp); 將內(nèi)存中b數(shù)組的6個元素值(2*6個字節(jié))寫入fp所指向的文件里。36int main() FILE *fp; int i; if (fp=fopen(d:xs.dat, wb)=NULL) printf(Cant open file!); exit(0); for (i=0; iSIZE; i+) /*從鍵盤輸入學生數(shù)據(jù)*/ printf(Input date of No.%d student:n, i+1); printf(num: ); scanf(%d,&stui.num); printf(name: ); getcha
29、r(); /* 用getchar()來抵消前面的回車符*/ gets(); printf(age: ); scanf(%d,&stui.age); for (i=0;iSIZE;i+) /*向文件寫入學生數(shù)據(jù)*/ if (fwrite(&stui, sizeof(struct student), 1, fp)!=1) printf(File write error!); fclose(fp); return 0;例12.4 從鍵盤上輸入10名學生的學號,姓名,年齡,將這些數(shù)據(jù)寫入d:xs.dat文件中。37例12.5 從上題的d:xs.dat文件中讀出所有學生信息,顯示在屏幕
30、上。#include #define SIZE 10struct student int num; char name8; int age; stuSIZE;38例12.5 從上題的d:xs.dat文件中讀出所有學生信息,顯示在屏幕上。#include #define SIZE 10struct student int num; char name8; int age; stuSIZE;int main() FILE *fp; int i; if(fp=fopen(d:xs.dat,rb)=NULL) printf(Cant open file!); exit(0); for(i=0;iSIZ
31、E;i+) if (fread(&stui, sizeof(struct student), 1, fp)!=1) printf(File read error!); else printf(%d, %s , %d n, stui.num, , stui.age); fclose(fp); return 0;3912.4.3 fscanf函數(shù)和fprintf函數(shù)1fscanf函數(shù)fscanf函數(shù)的使用格式如下: fscanf(文件類型指針,格式字符串,輸入項地址表列); fscanf函數(shù)的功能是:按“格式字符串”所指定的格式,從“文件類型指針”所指向的文件的當前位置讀取數(shù)據(jù),
32、然后按“輸入項地址表列”的順序,將讀取來的數(shù)據(jù)存入指定的內(nèi)存單元中。fscanf函數(shù)的返回值是讀取的數(shù)據(jù)個數(shù);若遇見文件結束符或讀取不成功,則fscanf函數(shù)返回EOF(-1)。 4012.4.3 fscanf函數(shù)和fprintf函數(shù)例如: fscanf(fp,“%d,%f”,&i,&t);表示從fp所指向的文件中,按“%d,%f”規(guī)定的格式讀取兩個值,將這兩個值分別存儲在地址&i和&t對應的內(nèi)存單元中。若讀取成功,fscanf函數(shù)的返回值是2。 前面幾章經(jīng)常使用的函數(shù): scanf(格式字符串,輸入項地址表列) ;與 fscanf(stdin,格式字符串,輸入項地址表列) ;功能相同,這里的
33、stdin代表標準輸入文件(如鍵盤)。這兩種形式的作用都是從終端(如鍵盤),按“格式字符串”的格式輸入(讀取)數(shù)據(jù),將輸入(讀?。┑臄?shù)據(jù)存入“輸入項地址表列”指定的內(nèi)存單元中。1fscanf函數(shù)4112.4.3 fscanf函數(shù)和fprintf函數(shù) 2fprintf函數(shù)fprintf函數(shù)的使用格式如下: fprintf(文件類型指針,格式字符串,輸出項表列); fprintf函數(shù)的功能是:按“格式字符串”所指定的格式,將“輸出項表列”中指定的各項的值寫入“文件類型指針”所指向的文件的當前位置。若寫入成功,fprintf函數(shù)的返回值是寫入文件中的字符個數(shù)(或字節(jié)個數(shù)),否則返回EOF(-1)。4
34、2例如: fprintf(fp,“%d,%f”, i,t);表示按“%d,%f”規(guī)定的格式,在fp所指向的文件中,從文件的當前位置開始,將i和t的值寫入文件中。 前面幾章經(jīng)常使用的函數(shù): printf(格式字符串,輸出項表列) ;與 fprintf(stdout,格式字符串,輸出項表列) ;功能相同,這里的stdout代表標準輸出文件(如顯示器)。這兩種形式的作用都是向終端(如顯示器)按“格式字符串”的格式輸出(寫入)數(shù)據(jù)。12.4.3 fscanf函數(shù)和fprintf函數(shù) 2fprintf函數(shù)43例12.6 將一個學生姓名以及三門課的成績寫入新建立的文件user.txt中,該文件放在C盤根目
35、錄下的dat目錄中,然后再將這個學生姓名以及三個成績值讀取出來,求出它們的平均值,顯示在屏幕上。#include int main() FILE *fp; int a1=82, a2=81, a3=83, b1, b2, b3; char name120=”ZhangHua”, name220; float aver; fp=fopen(c:datuser.txt, w+); fprintf(fp, %s , %d , %d , %d , name1 , a1, a2, a3); rewind(fp); fscanf(fp, %s , %d ,%d , %d , name2 , &b1, &b
36、2, &b3); aver=(b1+b2+b3)/3.0; printf(%s , %d , %d , %d , %f n , name2, b1, b2, b3,aver); fclose(fp); return 0;4412.4 文件的讀寫 1fgets函數(shù) fgets函數(shù)的使用格式如下: fgets(pstr,n,fp); pstr是存放字符串的內(nèi)存首地址,可以是數(shù)組名或指針變量名。整型變量n是限定讀取的字符個數(shù)。fp是文件類型指針。 fgets函數(shù)的功能是:從fp所指向的文件的當前位置開始讀取n-1個字符,然后在所有字符的后面加一個字符串結束標志0,將這個字符串存于pstr為首地址的內(nèi)
37、存地址中。可能讀取的字符數(shù)不足n-1個,因為規(guī)定在讀完n-1個字符之前,若遇見換行符或文件結束(EOF),則結束讀取。正常情況下,函數(shù)返回值是存放字符串的內(nèi)存首地址(pstr);若一個字符也沒有讀入或有錯誤發(fā)生,函數(shù)返回值是NULL。12.4.4 fgets函數(shù)和fputs函數(shù)45例如: char str10; fgets(str,10,fp);表示從fp所指向的文件中讀取9個字符,在9個字符的后面加一個字符串結束標志0,存入數(shù)組str中。12.4 文件的讀寫 12.4.4 fgets函數(shù)和fputs函數(shù)1fgets函數(shù)4612.4 文件的讀寫 12.4.4 fgets函數(shù)和fputs函數(shù) 2
38、fputs函數(shù) fputs函數(shù)的使用格式如下: fputs(pstr,fp); pstr代表字符串,可以是字符串常量、字符串數(shù)組名或指向字符串的指針變量名。fp是文件類型指針。 fputs函數(shù)的功能是將字符串寫入文件類型指針所指向的文件中去,不包括字符串結束標志0。 47例如: fputs(“We love peace!”,fp);表示將字符串“We love peace!”寫入fp所指向的文件中(不包括0)。 char str=“character string”; (或char *str=“character string”;) fputs(str,fp);表示將str對應的字符串寫入fp
39、所指向的文件中(不包括0)。12.4.4 fgets函數(shù)和fputs函數(shù) 2fputs函數(shù)48例12.7 將字符串“I love china!”(各單詞間只有一個空格)寫入c:zg.txt文件中,然后將其中的“l(fā)ove china!”讀取出來,顯示在屏幕上。#include int main() FILE *fp; char a30; fp=fopen(c:zg.txt,w+); fputs(I love china!, fp); fseek(fp, 2L, SEEK_SET); fgets(a, 12, fp); printf(%sn, a); fclose(fp); return 0;49
40、12.5 程序設計舉例 例12.8 編程實現(xiàn):(1)將若干名學生的學號、姓名、數(shù)學成績、英語成績、語文成績存儲在c:student.txt文件中。(2)根據(jù)給定的學號,在文件student.txt中查找并顯示與該學號對應的學生的姓名、數(shù)學成績、英語成績、語文成績的值。(3)在文件student.txt所有內(nèi)容的后面,追加若干個學生的信息(每個學生包括學號、姓名、數(shù)學成績、英語成績、語文成績5個數(shù)據(jù))。(4)計算并顯示每個學生的數(shù)學成績、英語成績、語文成績的平均分。50程序如下: # include struct student int num; char name8; int math; in
41、t engl; int chin; ;51 void sto( ) FILE *fp; int yn=1 ; struct student stu; /*stu存放一個學生的項數(shù)據(jù)*/ if (fp=fopen(c:student, w)=NULL) printf (Cant open file!); return; while (yn=1) printf(請按順序輸入學生的學號,數(shù)學成績,英語成績,語文成績,姓名:n); scanf(%d,%d,%d,%d,%s, &stu.num,&stu.math,&stu.engl,&stu.chin,); fwrite(&stu, s
42、izeof(struct student), 1, fp) ; printf(若停止輸入請按0,若繼續(xù)輸入請按1,然后按回車.n); scanf(%d,&yn); fclose(fp); return; 52 void sea( ) FILE *fp; int bz=0, k=0,xh; struct student a; if (fp=fopen(c:student,r)=NULL) printf(Cant open file!); return; printf( 請輸入學生的學號:); scanf(%d, &xh); fseek(fp, k*sizeof(struct student), SEEK_SET); while(!feof(fp) fread(&a, sizeof(struct student), 1, fp); if (xh=a.num) printf(查找成功!學生信息顯示如下:n); printf(n%d,%s,%d,%d,%dn,a.num,,a.math,a.en
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024食品代理銷售合同協(xié)議書范本模板
- 初任班主任的工作挑戰(zhàn)與應對策略
- 旅行服務員工作總結
- 碩士答辯攻略模板
- 兒童玩具設計師的工作描述
- 日用品銷售工作總結
- 航空業(yè)公司人才培養(yǎng)心得
- 技術部門技術支持與系統(tǒng)維護的工作總結
- 農(nóng)業(yè)畜牧行業(yè)的保安工作總結
- 新疆職業(yè)大學《筆譯理論與技巧(一)》2023-2024學年第一學期期末試卷
- 2024年湖南省公務員錄用考試《行測》真題及答案解析
- 大班健康教案及教學反思《蜈蚣走路》
- 生活妝課件教學課件
- 延遲支付協(xié)議書范本-合同范本
- 2023-2024學年廣東省廣州市番禺區(qū)八年級(上)期末英語試卷
- 物業(yè)管理公文寫作培訓
- 2024期貨反洗錢培訓
- 2023醫(yī)療質(zhì)量安全核心制度要點釋義(第二版)對比版
- 急診科護士長進修匯報
- 生態(tài)農(nóng)業(yè)示范基地項目可行性研究報告1
- 家庭教育大講堂實施方案
評論
0/150
提交評論