C語言課件-文件第13講_第1頁
C語言課件-文件第13講_第2頁
C語言課件-文件第13講_第3頁
C語言課件-文件第13講_第4頁
C語言課件-文件第13講_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第十三講Begin:第十二章文件文件與文件類型指針文件的打開與關(guān)閉文件的讀寫文件的定位12.1.1

文件文件的定義:存儲在外存儲器上的一組相關(guān)數(shù)據(jù)的有序集合。二進(jìn)制文件:直接把內(nèi)存數(shù)據(jù)以二進(jìn)制形式保存。例如:

整數(shù)1234,以二進(jìn)制文件保存,是二進(jìn)制數(shù)0x04D2

文本文件:又稱為ASCII碼文件。每個字符通過相應(yīng)的編碼存儲在文件中。例如:整數(shù)1234,以文本文件保存,是四個字符(1、2、3、4的ASCII碼)

文件的分類(按存儲形式分)緩沖文件系統(tǒng):系統(tǒng)在內(nèi)存中開辟一塊緩沖區(qū)以便慢速的外設(shè)與其成塊地進(jìn)行數(shù)據(jù)交換。向磁盤(文件)輸出數(shù)據(jù):數(shù)據(jù)緩沖區(qū),裝滿緩沖區(qū)后磁盤文件。系統(tǒng)控制程序控制12.1.2

文件類型指針從磁盤(文件)讀入數(shù)據(jù):先一次性從磁盤文件將一批數(shù)據(jù)

輸入到緩沖區(qū),然后再從緩沖區(qū)

逐個讀入數(shù)據(jù)到變量。

12.1.2

文件類型指針文件類型指針例如:FILE*fp;定義了一個結(jié)構(gòu)體FILE類型的指針變量fp。定義形式:

FILE*指針變量名;用于存放文件的緩沖區(qū)首地址,指向一個文件緩沖文件系統(tǒng)為每個使用的文件在內(nèi)存中開辟一存儲區(qū)存放其相關(guān)信息,這些信息用一個結(jié)構(gòu)變量保存,該結(jié)構(gòu)類型的名字是FILE。程序通過FILE類型指針建立和文件的聯(lián)系,進(jìn)行關(guān)于文件的一切操作。

12.2.1

文件的打開fopen()函數(shù)打開文件的一般形式:FILE*文件指針名;…文件指針名=fopen(“文件名”,“文件使用方式”);

為了打開一個文件,首先要為該文件定義一個文件類型指針,然后用C語言提供的fopen函數(shù)打開文件。fopen函數(shù)有兩個參數(shù):“文件名”與“文件使用方式”。它們均是字符串。

符號意義r(read)以只讀方式打開一個文本文件,若文件不存在,則返回空指針w(write)以只寫方式創(chuàng)建一個文本文件a(append)以追加方式打開或創(chuàng)建一個文本文件,并從文件末尾寫數(shù)據(jù)t(text)文本文件,可省略不寫b(banary)二進(jìn)制文件+讀和寫12.2.1

文件的打開文件使用方式rt”只讀打開一個文本文件,只允許讀數(shù)據(jù)

“wt”只寫打開或建立一個文本文件,只允許寫數(shù)據(jù)

“at”追加打開一個文本文件,并在文件末尾寫數(shù)據(jù)

“rb”只讀打開一個二進(jìn)制文件,只允許讀數(shù)據(jù)

“wb”只寫打開或建立一個二進(jìn)制文件,只允許寫數(shù)據(jù)

“ab”追加打開一個二進(jìn)制文件,并在文件末尾寫數(shù)據(jù)

“rt+”讀寫打開一個文本文件,允許讀和寫

“wt+”讀寫打開或建立一個文本文件,允許讀寫

“at+”讀寫打開一個文本文件,允許讀,或在文件末追加數(shù)據(jù)

“rb+”讀寫打開一個二進(jìn)制文件,允許讀和寫

“wb+”讀寫打開或建立一個二進(jìn)制文件,允許讀和寫

“ab+”讀寫打開一個二進(jìn)制文件,允許讀,或在文件末追加數(shù)據(jù)

12.2.1

文件的打開r+與w+的區(qū)別:r+為讀和寫而打開文本文件,用這種方式時,指定的文件應(yīng)當(dāng)已經(jīng)存在,既可以讀也可以寫,在讀和寫操作之間不必關(guān)閉文件,只是對文本文件來說,讀和寫總是從文件的起始位置開始,在寫新的數(shù)據(jù)時,只復(fù)蓋新數(shù)據(jù)所占的空間,其后的老數(shù)據(jù)并不丟失。w+首先建立一個新文件,進(jìn)行寫操作,隨后可以從頭開始讀。如果指定的文件已存在,則原有的內(nèi)容將全部消失。12.2.1

文件的打開例如:FILE*fp;fp=fopen(“filea”,“r”);其意義是在當(dāng)前目錄下打開文件filea,文件的使用方式為“讀入”,并使fp指向該文件。又如:FILE*fpabcfpabc=(“c:\\abc”,“rb”)其意義是打開c盤根目錄下的文件abc,這是一個二進(jìn)制文件,只允許按二進(jìn)制方式進(jìn)行讀操作。兩個反斜線“\\”中的第一個表示轉(zhuǎn)義字符,第二個表示根目錄。12.2.2

文件的關(guān)閉fclose()函數(shù)說明:如果不關(guān)閉文件,將會丟失數(shù)據(jù),并且一個C程序能同時打開的文件數(shù)有限,應(yīng)該養(yǎng)成在使用完文件后關(guān)閉文件的習(xí)慣返回值:操作正常返回0,否則返回EOF(是在stdio.h文件中定義的符號常量,值為-1)功能:是將由fp指向的緩沖區(qū)中的數(shù)據(jù)存放到外存儲器的文件中,然后釋放該緩沖區(qū),使文件指針變量不再指向與該文件對應(yīng)的FILE結(jié)構(gòu),從而斷開與文件的關(guān)聯(lián)關(guān)閉文件的一般形式:

fclose(文件指針);文件使用步驟:

FILE*fp;fp=fopen("文件名","r");if(fp==NULL){/*當(dāng)文件打開失敗時的處理*/}....../*對文件的各種操作*/fclose(fp);12.2.2

文件的關(guān)閉12.3

文件的讀寫順序讀寫是指從文件中一個接一個讀寫數(shù)據(jù),僅當(dāng)讀寫了前一個數(shù)據(jù)后,才能讀寫下一個數(shù)據(jù)。順序讀寫在讀寫數(shù)據(jù)后,文件位置指針自動跳到下一個讀寫位置。標(biāo)準(zhǔn)輸入輸出只能進(jìn)行順序讀寫。隨機(jī)讀寫是指從文件中讀寫數(shù)據(jù)時可不考慮數(shù)據(jù)在文件中的位置,可以在文件的任何位置讀寫。隨機(jī)讀寫在讀寫數(shù)據(jù)前,需要將文件位置指針移到讀寫位置。當(dāng)文件以讀或?qū)懛绞酱蜷_,文件位置指針設(shè)置在文件頭,若文件以附加方式打開,位置設(shè)置在文件末尾。fgetc()函數(shù)一般形式:字符變量=fgetc(文件指針);功能:從指定文件讀入一個字符,該文件必須是以讀或讀寫方式打開返回值:調(diào)用成功時返回讀入的字符文件結(jié)束時返回文件結(jié)束符EOF(-1)12.3.1

字符讀寫(fgetc函數(shù)和fputc函數(shù))以下要講到的8個函數(shù)均在“stdio.h”標(biāo)準(zhǔn)輸入輸出庫函數(shù)中定義

例如:ch=fgetc(fp);表示從文件指針變量fp指向的文件中讀出一個字符,賦給字符變量ch文件位置指針文件型數(shù)據(jù)結(jié)構(gòu)中,用文件位置指針指向當(dāng)前對文件進(jìn)行讀寫操作的位置。在文件打開時,該指針總是指向文件的第一個字節(jié)。讀寫文件時,每讀寫一個字符后,該位置指針的值會自動加1,指向下一個字符。改變位置指針的值,也就改變了下一次讀寫操作在文件中執(zhí)行時的位置。12.3.1

字符讀寫(fgetc函數(shù)和fputc函數(shù))文件指針和文件內(nèi)部的位置指針的區(qū)別:文件指針是指向整個文件的,須在程序中定義說明,只要不重新賦值,文件指針的值是不變的。文件位置指針用以指示文件內(nèi)部的當(dāng)前讀寫位置,每讀寫一次,該指針均向后移動,它不需在程序中定義說明,由系統(tǒng)自動設(shè)置。feof()函數(shù)一般形式:feof(文件指針);功能:判斷文件位置指針是否已至文件尾返回值:函數(shù)返回值為1時表示已至文件尾部,為0時則還未到文件結(jié)束處12.3.1

字符讀寫(fgetc函數(shù)和fputc函數(shù))使用fgetc()函數(shù),文件結(jié)束時返回文件結(jié)束符EOF(值為-1)。這在對文本文件操作時不會產(chǎn)生問題。但對二進(jìn)制文件進(jìn)行讀操作時,由于-1是二進(jìn)制數(shù)的合法值,故將影響文件數(shù)據(jù)的讀取。為解決此問題,ANSIC提供了專門判斷文件結(jié)束的函數(shù)feof()。

fputc()函數(shù)一般形式:fputc(字符量,文件指針);功能:將一個字符寫到磁盤文件上去返回值:調(diào)用成功時返回輸出的字符,失敗時返回EOF(-1)12.3.1

字符讀寫(fgetc函數(shù)和fputc函數(shù))例如:fputc(‘a(chǎn)’,fp);表示向文件指針變量fp指向的文件輸出一個字符a。題目:打開“c:\infile.c”文件,然后將其復(fù)制到“c:\outfile.c”上#include“stdio.h”#include“stdlib.h”voidmain(){FILE*infp,*outfp;charch;if((infp=fopen(“c:\\infile.c”,“r”))==NULL){printf(“Cannotopenthisinfile.\n”);exit(0);}outfp=fopen(“c:\\outfile.c”,”w”);12.3.1

字符讀寫(fgetc函數(shù)和fputc函數(shù))作用是終止程序。在終止以前,所有文件被關(guān)閉,緩沖輸出(正等待輸出的)內(nèi)容被寫完,調(diào)用退出函數(shù)。括號內(nèi)的值定義了程序的退出狀態(tài),一般來說,0表示正常退出,非0表示錯誤while(!feof(infp))if((ch=fgetc(infp))!=EOF)fputc(ch,outfp);fclose(infp);fclose(outfp);}12.3.1

字符讀寫(fgetc函數(shù)和fputc函數(shù))fgets()函數(shù):一般形式:fgets(字符數(shù)組名,n,文件指針);功能:從指定文件讀入n-1個字符到字符數(shù)組,最后加一個‘\0’結(jié)束符。在讀完n-1個字符之前遇到換行符或文件結(jié)束符(EOF),讀入即結(jié)束返回值:str的首地址12.3.2

字符串讀寫(fgets函數(shù)和fputs函數(shù))例如:fgets(str,n,fp);是從fp所指的文件中讀出n-1個字符送入字符數(shù)組str中

fputs()函數(shù)一般形式:fputs(字符串,文件指針);功能:向指定的文件輸出一個字符串,‘\0’結(jié)束符不輸出。其中字符串可以是字符串常量、字符數(shù)組名或指針變量返回值:調(diào)用成功時,返回0,否則返回EOF12.3.2

字符串讀寫(fgets函數(shù)和fputs函數(shù))例如:fputs(“abcd”,fp);其意義是把字符串“abcd”寫入fp所指的文件之中。#include"stdio.h"voidmain(){FILE*fp;charstr[100],ch;fp=fopen(“abc.c”,”w”);printf("請輸入一串字符:\n");gets(str);fputs(str,fp);fclose(fp);12.3.2

字符串讀寫(fgets函數(shù)和fputs函數(shù))題目:從鍵盤上輸入一串字符,寫入文本文件“abc.c”中,再將文本文件的內(nèi)容讀出,顯示在屏幕上。

if((fp=fopen("c:\\abc.c","r"))==NULL){printf("fileopenerror.\n");exit(0);}while(!feof(fp))if((ch=fgetc(fp))!=EOF)putchar(ch);fclose(fp);}12.3.2

字符串讀寫(fgets函數(shù)和fputs函數(shù))fscanf()函數(shù)一般形式:fscanf(文件指針,“格式控制字符串”,地址表列);功能:從指定的文件中格式化讀數(shù)據(jù)12.3.3

格式讀寫(fscanf函數(shù)和fprintf函數(shù))說明:這個函數(shù)與格式輸入函數(shù)scanf()很相似,它們的區(qū)別在于,scanf()函數(shù)是從鍵盤輸入數(shù)據(jù),而fscanf()函數(shù)是從文件讀入數(shù)據(jù),因此在fscanf()函數(shù)參數(shù)中多了一個文件指針,用于指出從哪個文件讀入數(shù)據(jù)。例如:fscanf(fp,"%d,%f",&i,&t);表示將磁盤文件中的數(shù)據(jù)送給變量i,t。fprintf()函數(shù)一般形式:fprintf(文件指針,“格式控制控制”,輸出表列);功能:格式化寫數(shù)據(jù)到指定的文件中12.3.3

格式讀寫(fscanf函數(shù)和fprintf函數(shù))說明:這個函數(shù)與printf()函數(shù)很相似,它們的區(qū)別在于,printf()函數(shù)是將數(shù)據(jù)輸出到屏幕上,而fprintf()函數(shù)是將數(shù)據(jù)輸出到文件中,因此在fprintf()函數(shù)參數(shù)中多了一個文件指針,用于指出將數(shù)據(jù)輸出到哪個文件中例如:fprintf(fp,“%d,%6.2f”,i,t);將變量i和t的值按%d和%6.2f的格式輸出到fp指向的文件。設(shè)i=3,t=4.5,則輸出到磁盤文件上的是:3,4.50fscanf()函數(shù)和fprintf()函數(shù)對磁盤文件讀寫,使用方便,易理解。但輸入輸出需要轉(zhuǎn)化,因此,在內(nèi)存與磁盤頻繁交換數(shù)據(jù)的情況下,最好用fread()和fwrite()函數(shù)12.3.4

數(shù)據(jù)塊讀寫(fread函數(shù)和fwrite函數(shù))fread()函數(shù)和fwrite()函數(shù)一般形式:

fread(內(nèi)存地址,數(shù)據(jù)項(xiàng)字節(jié)數(shù),數(shù)據(jù)項(xiàng)個數(shù),文件指針);fwrite(內(nèi)存地址,數(shù)據(jù)項(xiàng)字節(jié)數(shù),數(shù)據(jù)項(xiàng)個數(shù),文件指針);說明:fread()、fwrite()通常用于對二進(jìn)制文件的讀寫操作存放輸出數(shù)據(jù)的首地址存放輸入數(shù)據(jù)的首地址例如:fread(a,2,5,fp);表示從已打開的一個文件中讀入5個整數(shù),依次送入整型數(shù)組a中隨機(jī)讀寫:移動文件內(nèi)部的位置指針到需要讀寫的位置,再進(jìn)行讀寫文件定位:按要求移動位置指針,是實(shí)現(xiàn)隨機(jī)讀寫的關(guān)鍵12.4.1

rewind()函數(shù)rewind函數(shù):一般形式:rewind(文件指針);功能:使位置指針重新返回文件的開頭,函數(shù)無返回值。fseek()函數(shù)功能:改變文件的位置指針12.4.2

fseek()函數(shù)起始點(diǎn)名字?jǐn)?shù)字代號文件開始SEEK_SET0當(dāng)前位置SEEK_CUR1文件末尾SEEK_END2一般形式:fseek(文件類型指針,位移量,起始點(diǎn))其中,“文件指針”:是文件打開時返回的文件指針?!拔灰屏俊保菏侵敢云鹗键c(diǎn)為基礎(chǔ),向前位移的字節(jié)數(shù),可以為負(fù)值。大多數(shù)C語言版本要求位移量為long型數(shù)?!捌鹗键c(diǎn)”:表示從何處開始計算位移量,規(guī)定的起始點(diǎn)有:返回值:操作成功返回0,否則返回非0。題目:設(shè)文件“alphabet”中存放了字母表“A┅Z”,現(xiàn)在打開這個文件,用從尾部倒著讀的方式將其信息讀出并送屏幕顯示。#include“stdio.h”#include“stdlib.h”voidmain(){FILE*fp;longi;if((fp=fopen(“c:\\alphabet.c”,“rb”))==NULL){printf(“fileopenerror.\n”);exit(0);}for(i=1;i<=26;i++){fseek(fp,-i,2); /*i=1時,定位于字母Z*/putchar(fgetc(fp));/*顯示讀出的字符,位置指針+1*/}fclose(fp);}12.4.2

fseek()函數(shù)ftell()函數(shù)功能:得到當(dāng)前文件指針位置。返回值:調(diào)用成功時,返回longint

數(shù)值,表示文件指針位置;出錯返回-1L。12.4.3

ftell()函數(shù)題目:建立一個文件,向其中寫入一組學(xué)生姓名和成績,然后從該文件中讀出成績大于80分的學(xué)生信息并顯示在屏幕上。綜

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論