




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第10章文件10.1文件指針10.2指針變量10.1文件指針10.1.1文件類型指針
10.1.2文本文件和二進制文件10.1.3文件的打開與關閉10.1.1文件類型指針在程序想要使用文件的時候,首先必須要能夠找到這個文件,這就需要文件類型的指針變量??梢远x一個文件類型的指針變量,然后使這個指針變量指向某一個文件的結構體變量,從而通過該結構體變量中的文件信息訪問該文件。也就是說,通過文件指針變量能夠找到與它相關的文件。例如:FILE*fp;在這里,fp是一個指向FILE類型結構體變量的指針變量,當文件打開時,系統(tǒng)自動建立文件結構體,并把指向它的指針返回來,程序通過這個指針獲得文件信息,訪問文件;文件關閉后,它的文件結構體被釋放。如果有n個文件,一般應定義n個指向FILE類型結構體的指針變量,將它們分別指向n個文件,即指向存放該文件信息的結構體變量,以實現對文件的訪問。例10.1以下程序打開新文件f.txt,并調用字符輸出函數將a數組中的字符寫入其中。#include<stdio.h>main(){
*fp; chara[5]={'1','2','3','4','5'},i;
fp=fopen("f.txt","w");
for(i=0;i<5;i++)fputc(a[i],fp);
fclose(fp);}分析:此題下劃線處為填空位置,在這里應該首先定義一個文件類型則指針變量fp,所以答案是FILE。C程序通過操作系統(tǒng)訪問磁盤上的文件如圖10.3所示。10.310.1.1文件類型指針返回10.1.2文本文件和二進制文件C語言把文件看作是一個字符(字節(jié))的序列,即由一個一個字符(字節(jié))的數據順序組成。根據數據的組織形式,可分為ASCII文件和二進制文件。ASCII文件又稱為文本文件,它的每一個字節(jié)存放一個ASCII代碼,代表一個字符;而二進制文件則是把內存中的數據按其在內存中的存儲形式原樣輸出到磁盤上存放。例如整數12345,假設其為int類型,則其在內存中表示為“0011000000111001”,只占兩個字節(jié),共十六位,那么12345的二進制文件也為“0011000000111001”。而當把這個數字輸出到終端屏幕或者打印時,系統(tǒng)會自動將其翻譯成“12345”五個字符,便于人們讀它,表示為“0011000100110010001100110011010000110101”,其中每個字符占一個字節(jié),五個字節(jié)共40位,這種數據組成的文件稱為文本文件。如圖10.4所示。圖10.412345的二進制文件表示和文本文件表示10.1.2文本文件和二進制文件任何文本文件都可以在終端上顯示,而二進制文件卻不能,當然也不能打印,二進制文件只能由計算機去讀。用ASCII文件輸出時,其與字符是一一對應的,一個字節(jié)代表一個字符,因而便于對字符進行逐個處理,便于輸出字符,但一般占存儲空間較多,并且因為要進行二進制形式和ASCII碼之間的轉換,需要花費轉換的時間;而二進制文件所有字節(jié)存儲的都是二進制數,以二進制文件形式輸出數據,可以節(jié)省外存空間和轉換時間。由前所知,一個C語言文件是一個字節(jié)流或者二進制流,它把數據看作是一連串的字符(字節(jié)),在C語言中對文件的存取是以字符(字節(jié))為單位的,輸入輸出的數據流的開始和結束僅受程序控制,我們把這種文件又稱為流式文件。C語言允許對文件存取一個字符,這就增加了處理的靈活性。10.1.2文本文件和二進制文件例10.2下列關于C語言文件的敘述中正確的是
A)文件由一系列數據依次排列組成,只能構成二進制文件
B)文件由結構序列組成,可以構成二進制文件或文本文件
C)文件由數據序列組成,可以構成二進制文件或文本文件
D)文件由字符序列組成,其類型只能是文本文件分析:參照本節(jié)對文件定義,根據數據的組織形式,文件可分為ASCII文件和二進制文件,所以正確答案是C。返回10.1.3文件的打開與關閉文件使用的方式是首先打開文件,然后進行文件的讀/寫操作,文件使用完畢以后要關閉文件。文件的打開使用標準輸入輸出函數庫中的fopen()函數。fopen()函數功能是按指定方式打開文件。如果文件正常打開,其返回值為指向文件結構體的指針;如果文件打開失敗,其返回值為NULL。fopen()函數的原型如下:格式:FILE*fopen(char*name,char*mode)其中*name為要打開的文件名,*mode為使用文件的方式(見表10-1)。fopen函數的調用方式通常為:FILE*fp;fp=fopen(“test.c”,“w”);這段代碼表示打開文件名為“test”的文件,使用文件方式為“只寫”(w代表write,即只寫),fopen函數帶回指向test文件的指針并賦給fp,這樣fp就和test相聯系了,或者說,fp就指向了test文件。判斷文件是否打開,要看fopen函數返回給fp的值是否為NULL,如果為NULL,則說明文件沒有打開。10.1.3文件的打開與關閉例10.3以下程序用來判斷指定文件是否能正常打開#include<stdio.h>main(){ FILE*fp; if(((fp=fopen("test.txt","r"))==_____)) printf("未能打開文件!\n"); else printf("文件打開成功!\n");}分析:本題判斷文件是否打開,判斷文件是否打開,要看fopen函數返回給fp的值是否為NULL,如果為NULL,則說明文件沒有打開。所以正確答案為NULL。通過前邊所述可以看出,打開一個文件涉及到3個信息:①需要打開的文件名,也就是準備訪問的文件的名字;②使用文件的方式(如本例使用文件的方式為“w”);③讓哪一個指針變量指向被打開的文件。10.1.3文件的打開與關閉例10.4設fp已定義,執(zhí)行語句fp=fopen(“file”,“w”);后,以下針對文本文件file操作敘述的選項中正確的是A)寫操作結束后可以從頭開始讀B)只能寫不能讀C)可以在原有內容后追加寫D)可以隨意讀和寫分析:參照表10-1可知,正確答案為B。在使用完一個文件后,應當將其關閉,以防它再被誤用。所謂關閉文件,就是使文件的指針變量不再指向該文件,此后不能再通過該指針對原來與其相聯系的文件進行讀寫操作,除非再次打開。文件的關閉使用標準輸入輸出函數庫中的fclose()函數。fclose()函數的原型如下所示。格式:intfclose(FILE*fp)例如:fclose(fp);前面我們曾把用fopen函數打開文件所帶回的指針賦值給了fp,現在通過fclose函數將fp不再指向該文件,即將文件關閉了。fclose函數帶回一個整形數據的返回值,如果順利地關閉了文件,則返回值為0;否則返回EOF(-1)。EOF(ENDOFFILE)是在stdio.h文件中定義的符號常量,值為-1。10.2指針變量10.2.1調用fgetc和fputc函數進行輸入和輸出10.2.2fscanf和fprintf函數的應用10.2.3fgets和fputs函數的應用10.2.4fread和fwrite函數的應用10.2.5文件定位函數(rewind和fseek函數的應用)10.2.6判斷文件結束函數feof10.2.1調用fgetc和fputc函數進行輸入和輸出fgetc函數是從指定的文件讀入一個字符,該文件必須是以讀或讀寫方式打開的。fgetc函數的調用形式如下所示。格式:ch=fgetc(fp);fp為指向文件的文件型指針變量,ch為字符變量。fgetc函數帶回一個字符,賦值給ch。如果在執(zhí)行fgetc函數讀字符時遇到文件結束符,函數返回一個文件結束標志EOF(-1)。在文件內部有一個位置指針。用來指向文件的當前讀寫字節(jié)。在文件打開時,該指針總是指向文件的第一個字節(jié)。使用fgetc函數后,該位置指針將向后移動一個字節(jié)。因此可連續(xù)多次使用fgetc函數,讀取多個字符。應注意文件指針和文件內部的位置指針不是一回事。文件指針是指向整個文件的,須在程序中定義說明,只要不重新賦值,文件指針的值是不變的。10.2.1調用fgetc和fputc函數進行輸入和輸出例10.5讀入文件abc.c,在屏幕上輸出。#include<stdio.h>main(){ FILE*fp; charch; if((fp=fopen("abc.c","rt"))==NULL) { printf("文件打開失??!"); getch(); exit(1); } ch=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } fclose(fp);}分析:本例程序的功能是從文件中逐個讀取字符,在屏幕上顯示。程序定義了文件指針fp,以讀文本文件方式打開文件“abc.c”,并使fp指向該文件。如打開文件出錯,給出提示并退出程序。程序第12行先讀出一個字符,然后進入循環(huán),只要讀出的字符不是文件結束標志EOF,就把該字符顯示在屏幕上,再讀入下一字符。每讀一次,文件內部的位置指針向后移動一個字符,文件結束時,該指針指向EOF。當執(zhí)行本程序時將顯示整個文件。10.2.1調用fgetc和fputc函數進行輸入和輸出fputc函數是把一個字符寫到磁盤文件上去。其一般調用形式如下所示。格式:fputc(ch,fp);其中ch是要輸出的字符,它可以是一個字符常量,也可以是一個字符變量。fp是文件指針變量。fputc(ch,fp)函數的作用是將字符(ch的值)輸出到fp所指向的文件中去。被寫入的文件可以用、寫、讀寫,追加方式打開,用寫或讀寫方式打開一個已存在的文件時將清除原有的文件內容,寫入字符從文件首開始。如需保留原有文件內容,希望寫入的字符以文件末開始存放,必須以追加方式打開文件。被寫入的文件若不存在,則創(chuàng)建該文件。每寫入一個字符,文件內部位置指針向后移動一個字節(jié)。fputc函數有一個返回值,如寫入成功則返回寫入的字符,否則返回一個EOF??捎么藖砼袛鄬懭胧欠癯晒?0.2.1調用fgetc和fputc函數進行輸入和輸出例10.6從鍵盤輸入一行字符,寫入一個文件,再把該文件內容讀出顯示在屏幕上#include<stdio.h>main(){ FILE*fp; charch; if((fp=fopen("abc","wt+"))==NULL) { printf("文件打開失??!"); getch(); exit(1); } printf("inputastring:\n"); ch=getchar(); while(ch!='\n') { fputc(ch,fp); ch=getchar(); } rewind(fp); ch=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } printf("\n"); fclose(fp);}分析:程序中第6行以讀寫文本文件方式打開文件abc。程序第13行從鍵盤讀入一個字符后進入循環(huán),當讀入字符不為回車符時,則把該字符寫入文件之中,然后繼續(xù)從鍵盤讀入下一字符。每輸入一個字符,文件內部位置指針向后移動一個字節(jié)。寫入完畢,該指針已指向文件末。如要把文件從頭讀出,須把指針移向文件頭,程序第19行rewind函數的作用是把fp所指文件的內部位置指針移到文件頭返回10.2.2fscanf和fprintf函數的應用fscanf函數、fprintf函數的功能與scanf函數和printf函數類似,都是格式化讀寫函數。只不過fscanf函數和fprintf函數的讀寫對象不是終端,而是磁盤文件。(1)fprintf函數的一般調用方式如下所示。格式:intfprintf(FILE*fp,constchar*format[,argument,…])功能是根據格式字符串frmat把argument列表中的表達式值寫到fp所指向的文件中。注意格式說明符的個數必須與參數的個數相同。如果調用成功,則返回輸出字節(jié)數,如果是調用失敗或者已到了文件尾端,則返回EOF。10.2.2fscanf和fprintf函數的應用例10.7有以下程序#include<stdio.h>main(){FILE*f;f=fopen("filea.txt","w");fprintf(f,"abc");fclose(f);}若文本文件filea.txt中原有內容為:hello,則運行以上程序后,文件filea.txt的內容為A)helloabcB)abcloC)abcD)abchello分析:程序中首先以只寫的方式打開了filea.txt文件,然后通過fprintf函數將字符串“abc”寫入文件filea.txt,由表10-1可知,文件filea.txt中的內容將被重寫,所以雖然文件中原有內容為hello,但寫入的abc覆蓋掉了原有內容,所以答案應該是C。10.2.2fscanf和fprintf函數的應用fscanf函數的一般調用方式如下所示。格式:intfscanf(FILE*fp,constchar*format[,address,…])功能是根據format中的格式從fp指向的文件中讀取數據存入到相應的address指向的變量中。注意格式說明符和地址的個數必須與輸入字段的個數相同。如果調用成功,fscanf函數返回成功掃描、轉換和存儲的輸入字段的個數,返回值不包括沒有被存儲的字段。當沒有字段被保存時,將返回0,如果遇到文件終止符,則返回EOF。10.2.2fscanf和fprintf函數的應用例10.8有以下程序#include<stdio.h>main(){ FILE*fp; intk,n,i,a[6]={1,2,3,4,5,6}; fp=fopen("d2.dat","w"); for(i=0;i<6;i++) fprintf(fp,"%d\n",a[i]); fclose(fp); fp=fopen("d2.dat","r"); for(i=0;i<3;i++) fscanf(fp,"%d%d",&k,&n); fclose(fp); printf("%d,%d\n",k,n);}程序運行后的輸出結果是A.1,2 B.3,4C.5,6 D.123,456分析:在此程序中,首先定義了一個數組a,其中初始化有1,2,3,4,5,6等6個數組元素。然后以只寫的方式打開了文件d2.dat,通過循環(huán)語句將數組a中的內容寫入文件a2.dat,關閉文件d2.dat,此時文件中的內容為1,2,3,4,5,6。再通過只讀的方式打開文件a2.dat,利用循環(huán)語句,將文件中的內容讀入到變量k和n中,第一次循環(huán)是將文件中1讀入到k,2讀入到n,此時文件的位置指針指向了文件中的3;第二次循環(huán)是將文件中3讀入到k,4讀入到n,此時文件的位置指針指向了文件中的5;第三次循環(huán)是將文件中5讀入到k,6讀入到n,此時循環(huán)結束,關閉了文件。所以此時輸出k和n的值為“5,6”,正確答案為C。返回10.2.3fgets和fputs函數的應用fgets函數和fputs函數類似于以前介紹過的gets函數和puts函數,其作用都是讀寫字符串。只不過fgets函數和fputs函數是以指定的文件作為讀寫對象。(1)讀字符串函數fgetsfgets函數的功能是從指定的文件中讀一個字符串到字符數組中,函數調用的形式如下所示。格式:char*fgets(char*s,intn,FILE*fp);例如:fgets(str,n,fp);n為要求得到的字符個數,但只從fp指向的文件輸入n-1個字符,然后在最后加一個’\0’字符,因此得到的字符串共有n個字符,把它們放到字符數組str中。如果在讀完n-1個字符之前遇到換行符或者EOF,讀入即結束。fgets正常時返回讀取字符串的首地址;出錯或到了文件尾端,則返回NULL。10.2.3fgets和fputs函數的應用例10.9從string文件中讀入一個含10個字符的字符串#include<stdio.h>main(){FILE*fp;charstr[11];if((fp=fopen("d:\\jrzh\\example\\string","rt"))==NULL){printf("文件打開失?。?);getch();exit(1);}fgets(str,11,fp);printf("%s",str);fclose(fp);}分析:本例定義了一個字符數組str共11個字節(jié),在以讀文本文件方式打開文件string后,從中讀出10個字符送入str數組,在數組最后一個單元內將加上'\0',然后在屏幕上顯示輸出str數組。輸出的十個字符正是例13.1程序的前十個字符10.2.3fgets和fputs函數的應用寫字符串函數fputsfputs函數的功能是向指定的文件寫入一個字符串,其調用形式如下所示。格式:intfputs(char*s,FILE*fp)
其中字符串可以是字符串常量,也可以是字符數組名或指針變量,字符串末尾’\0’不輸出,若fputs正常時則返回寫入的最后一個字符;如果出錯,則返回EOF。例如:fputs("abcd",fp);其意義是把字符串“abcd”寫入fp所指的文件之中。10.2.3fgets和fputs函數的應用例10.10在例10.5中建立的文件string中追加一個字符串。#include<stdio.h>main(){ FILE*fp; charch,st[20]; if((fp=fopen("string","at+"))==NULL) { printf("Cannotopenfilestrikeanykeyexit!"); getch(); exit(1); } printf("inputastring:"); scanf("%s",st); fputs(st,fp); rewind(fp); ch=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } printf(""); fclose(fp);}分析:本例要求在string文件末加寫字符串,因此,在程序第6行以追加讀寫文本文件的方式打開文件string。然后輸入字符串,并用fputs函數把該串寫入文件string。在程序15行用rewind函數把文件內部位置指針移到文件首。再進入循環(huán)逐個顯示當前文件中的全部內容。返回10.2.4fread和fwrite函數的應用用fgetc函數和fputc函數可以用來讀寫文件中的一個字符,但通常要求一次讀入一組數據,fread函數和fwrite函數就可以用來讀寫一個數據塊。它們的一般調用形式如下所示。格式:size_tfread(void*buffer,size_tsize,size_tcount,FILE*fp)size_tfwrite(void*buffer,size_tsize,size_tcount,FILE*fp)其中:buffer:指向要輸入/輸出數據塊的首地址的指針;size:每個要讀/寫的數據塊的大小(字節(jié)數);count:要讀/寫的數據塊的個數;fp:要讀/寫的文件指針。如果fread函數或fwrite函數調用成功,則函數返回值為count的值,即輸入或輸出數據項的完整個數;如果出錯或到文件尾端,則返回0
10.2.4fread和fwrite函數的應用例如:fread(f,4,2,fp);其中f是一個實型數組名。一個實型變量占4個字節(jié)。這個函數從fp所指向的文件讀入2個4個字節(jié)的數據,存儲到數組f中。如果有以下的一個結構體類型:structstudent{intnum;charname[20];charsex;intage;chartelephone[3];}stud[10];結構體數組stud有10個數組元素,每一個元素用來存放一個學生的數據(包括學號,姓名,性別,年齡,電話)。假設學生的數據已存放在磁盤文件中,可以用下面的for語句和fread函數讀入10個學生的數據:for(i=0;i<10;i++)fread(&stud[i],sizeof(structstudent),1,fp);10.2.4fread和fwrite函數的應用例10.11以下程序運行后的輸出結果是_____#include<stdio.h>main(){ FILE*fp; intx[6]={1,2,3,4,5,6},i; fp=fopen("test.dat","wb"); fwrite(x,sizeof(int),3,fp); rewind(fp); fread(x,sizeof(int),3,fp); for(i=0;i<6;i++) printf("%d",x[i]); printf("\n"); fclose(fp);}分析:在程序中首先定義了一個數組x,然后以只寫的方式打開一個二進制文件test.dat,將x數組中的數據寫入6個字節(jié)(每個int型數據為2個字節(jié),3說明是6個字節(jié))到文件中,然后把文件內部位置指針移到文件初始位置,在文件中讀出相同大小的數據,最后使用循環(huán)語句,將x中數據輸出到屏幕。所以本題的正確答案為123456。返回10.2.5文件定位函數(rewind和fseek函數的應用)在文件內部,存在一個位置指針,這個指針指向文件當前讀寫的位置。一般情況下,指向文件的指針指向文件的起始部分,而文件的位置指針則指向當前讀寫的位置。如果順序讀寫一個文件,每次讀寫完一個字符后,位置指針自動指向下一個字符。如果想要將位置指針指向其它指定的字符,即使位置指針指向其他指定的位置,則可以使用文件的定位函數強制位置指針指向指定內容。(1)rewind函數的作用是使位置指針重新返回到文件的起始位置,清除文件結束標志和出錯標志,rewind函數沒有返回值。格式:voidrewind(FILE*fp)10.2.5文件定位函數(rewind和fseek函數的應用)例10.12#include<stdio.h>main(){ FILE*fp; charstr[10]; fp=fopen("myfile.dat","w"); fputs("abc",fp); fclose(fp); fp=fopen("myfile.dat","a+"); fprintf(fp,"%d",28); rewind(fp); fscanf(fp,"%s",str); puts(str); fclose(fp);}程序運行后的輸出結果是A)abc
B)28c
C)abc28
D)因類型不一致而出錯。分析:程序中首先定了一個字符數組str,然后以只寫的方式打開了文件myfile.dat,向文件中輸入字符串“abc”,然后關閉文件,再以追加的方式打開文件myfile.dat,向文件中輸入28,此時文件中myfile.dat的內容為abc28,然后執(zhí)行rewind函數,使文件的位置指針重新定位于文件的起始位置,將文件中的內容寫入
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 關鍵國際物流術語及試題及答案
- 人體免疫系統(tǒng)機制試題及答案
- 2024年CPMM備考時間規(guī)劃及試題及答案
- 小麥赤霉病全生育期綜合防控技術
- 精準訓練CPSM考試試題及答案
- SCMP創(chuàng)建與教育考試試題及答案
- 2024年CPMM資源分析與試題及答案
- DNA與RNA的結構比較試題及答案
- 柳暗花明2024年CPSM考試試題及答案
- 視野開闊的2024年國際物流師試題與答案
- 家具安裝裝修施工工藝指導手冊
- 液壓式打包機安全操作規(guī)程范本
- (三級)供應鏈管理師考試復習題庫(濃縮200題)
- 建筑施工中小型施工機具驗收記錄表
- 新時代背景下婦產科課程思政的構建與探索
- 國壽新綠洲團體意外傷害保險(A款)條款
- 隧道光面爆破交流材料
- 晶體的雙折射課件
- 天津馬城馬術賽馬休閑騎乘現代馬業(yè)項目商業(yè)計劃書
- 2022-2023學年高中政治統(tǒng)編版選擇性必修二5-1家和萬事興 第1課時 學案
- 土的擊實試驗JTG34302020
評論
0/150
提交評論