文件的讀和寫課件講解_第1頁(yè)
文件的讀和寫課件講解_第2頁(yè)
文件的讀和寫課件講解_第3頁(yè)
文件的讀和寫課件講解_第4頁(yè)
文件的讀和寫課件講解_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第9章文件學(xué)習(xí)目標(biāo)掌握有關(guān)C語(yǔ)言文件的基本概念。初步熟悉文件讀寫函數(shù)和文件讀寫出錯(cuò)檢測(cè)函數(shù)的使用。主要內(nèi)容C語(yǔ)言文件概述文件讀寫函數(shù)文件讀寫出錯(cuò)檢測(cè)C語(yǔ)言文件的概念文件:指存儲(chǔ)在外存儲(chǔ)器上的數(shù)據(jù)的集合,是按字節(jié)順序排列的數(shù)據(jù)序列。根據(jù)數(shù)據(jù)的組織形式,C語(yǔ)言中的文件可以分為文本文件和二進(jìn)制文件兩種。文本文件:以ASCII碼字符形式存儲(chǔ)的文件,即文件在磁盤中存放時(shí)每個(gè)字符對(duì)應(yīng)一個(gè)字節(jié),用于存放對(duì)應(yīng)的ASCII碼,故又稱ASCII文件。二進(jìn)制文件:以二進(jìn)制的編碼方式存儲(chǔ)的文件。9.1概述

文件的讀寫所謂讀文件就是由文件向內(nèi)存輸入數(shù)據(jù),而寫文件則是由內(nèi)存向文件輸出數(shù)據(jù)。

文件的屬性

在對(duì)文件進(jìn)行讀、寫操作時(shí),必須知道文件的一些屬性,比如文件名、文件的狀態(tài)及文件當(dāng)前的位置等。文件的這些屬性存放在一個(gè)由系統(tǒng)定義的結(jié)構(gòu)體類型變量中,該結(jié)構(gòu)體類型名為“FILE”。在對(duì)文件進(jìn)行讀寫的過(guò)程中,用戶通過(guò)一個(gè)指向FILE類型(文件類型)的指針變量實(shí)現(xiàn)文件的讀、寫操作。每一個(gè)FILE類型的結(jié)構(gòu)體變量只能存放一個(gè)文件的屬性,如果要對(duì)多個(gè)文件進(jìn)行讀、寫操作就必須有多個(gè)FILE類型的結(jié)構(gòu)體變量。同時(shí),用戶程序中必須為每一個(gè)文件定義一個(gè)FILE類型的指針變量。

9.2文件的讀和寫一.文件的打開、關(guān)閉

C程序在對(duì)文件進(jìn)行讀寫操作之前,必須先執(zhí)行打開文件的操作,在讀寫操作結(jié)束之后,必須執(zhí)行關(guān)閉文件的操作。打開文件的操作通過(guò)調(diào)用fopen()函數(shù)完成,關(guān)閉文件的操作通過(guò)調(diào)用fclose()函數(shù)完成。調(diào)用fopen()函數(shù)的格式:

FILE*fp;

fp=fopen(文件名,使用文件方式);如果調(diào)用成功,將返回相應(yīng)文件的指針,否則,返回空值NULL。定義指向該文件的FILE類型的指針變量注意:對(duì)于用“w”方式打開的文件只能用于寫入,若該文件不存在,則在打開時(shí)新建該文件,否則,則在打開該文件時(shí)將其刪去,并重新建立以原文件名命名的新文件。如果僅僅希望向原文件中添加新的內(nèi)容,必須使用“a”方式。有r、w和a三種方式文件使用方式功能"r"(只讀)為輸入打開一個(gè)文本文件"w"(只寫)為輸出打開一個(gè)文本文件“a”(追加) 向文本文件尾增補(bǔ)"rb"(只讀) 為輸入打開一個(gè)二進(jìn)制文件"wb"(只寫) 為輸出打開一個(gè)二進(jìn)制文件“ab”(追加) 向文本文件尾增補(bǔ)"r+"(讀寫) 為讀/寫打開一個(gè)文本文件"w+"(讀寫) 為讀/寫建立一個(gè)新的文本文件"a+"(讀寫) 為讀/寫打開一個(gè)文本文件"rb+"(讀寫) 為讀/寫打開一個(gè)二進(jìn)制文件"wb"(讀寫) 為讀/寫建立一個(gè)新的二進(jìn)制文件"ab+"(讀寫) 為讀/寫打開一個(gè)二進(jìn)制文件文件使用方式及功能說(shuō)明

以下的程序段為某讀寫文件程序中的一段:

FILE*fp;if((fp=fopen("myfile","r"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}

程序定義了一個(gè)FILE類型的指針變量fp,在if語(yǔ)句中,fp接收調(diào)用fopen()函數(shù)后的返回值。調(diào)用fopen()函數(shù)時(shí),指定以只讀方式打開文件myfile,若失敗,將返回空值NULL,否則返回文件myfile的指針。

if條件語(yǔ)句對(duì)打開文件失敗的情況作出處理,顯示出錯(cuò)信息并調(diào)用exit()函數(shù)。

exit()函數(shù)的作用是關(guān)閉所有文件,終止正在運(yùn)行的程序。在使用exit()函數(shù)之前,必須將相應(yīng)的頭文件stdlib.h包含進(jìn)來(lái)。調(diào)用fclose()函數(shù)的格式:

fclose(文件指針變量);調(diào)用fclose()函數(shù)后,原來(lái)的FILE類型的指針變量不再指向該文件,程序?qū)o(wú)法再通過(guò)該指針變量訪問(wèn)文件。如果在進(jìn)行文件讀寫后不執(zhí)行關(guān)閉文件的操作,可能導(dǎo)致相關(guān)數(shù)據(jù)的丟失。二.讀寫文件的函數(shù)及應(yīng)用

C語(yǔ)言提供了若干函數(shù)用于對(duì)文件的讀寫操作。在使用前,必須通過(guò)“#include”命令將頭文件stdio.h包含進(jìn)來(lái)。1.fputc()函數(shù)和fgetc()函數(shù)

fputc()函數(shù)的功能是向文件輸出一個(gè)字符

調(diào)用格式:fputc(ch,fp);其中,參數(shù)ch為待輸出的字符變量,fp為指向文件的指針變量。如果調(diào)用成功,將返回該字符,否則,返回非0值。

fgetc()函數(shù)的功能是從文件讀入一個(gè)字符

調(diào)用格式:ch=fgetc(fp);其中,參數(shù)ch為接收所讀入字符的字符變量,fp為指向文件的指針變量。如果調(diào)用成功,將返回讀入的字符,否則,返回非0值?!纠?-1】函數(shù)fputc()和fgetc()的應(yīng)用。

#include<stdlib.h>#include<stdio.h>

voidmain(){charch,c[4]={'A','B‘,'C','D'};inti;FILE*fp;if((fp=fopen("c:myfile1“,"w"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}for(i=0;i<4;i++)fputc(ch,fp);fclose(fp);

if((fp=fopen("c:myfile1","r"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}for(i=0;i<4;i++){ch=fgetc(fp);printf("%c\n",ch);}fclose(fp);}2.fputs()函數(shù)和fgets()函數(shù)

fputs()函數(shù)的功能是向文件輸出一個(gè)字符串。調(diào)用格式:

fputs(str,fp);其中,參數(shù)str為待輸出的字符串的指針(或是字符串常量),fp為指向文件的指針變量。如果調(diào)用成功,將返回0,否則,返回非0值。

fgets()函數(shù)的功能是從文件讀入n-1個(gè)字符,并將其存放到字符數(shù)組str中。如果在第n-1個(gè)字符之前出現(xiàn)了換行符“\n”或文件結(jié)束符EOF(一個(gè)非0值),則將換行符“\n”作為讀入的最后一個(gè)字符。

調(diào)用格式:

fgets(str,n,fp);其中,參數(shù)str為接收所讀入字符串的字符數(shù)組的指針,fp為指向文件的指針變量。如果調(diào)用成功,將返回字符數(shù)組的指針str,否則,返回

NULL?!纠?-2】函數(shù)fputs()和fgets()的應(yīng)用。

#include<stdlib.h>#include<stdio.h>voidmain(){charc[20];FILE*fp;if((fp=fopen("c:myfile2.txt“,"w"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}printf("PleaseInputaString:\n");scanf("%s",c);fputs(c,fp);fclose(fp);

if((fp=fopen("c:myfile2.txt","r"))==NULL){printf(Cannotopenthisfile!\n");exit(0);}printf("%s\n",fgets(c,10,fp));fclose(fp);}3.fprintf()函數(shù)和fscanf()函數(shù)(格式化輸入輸出函數(shù))

將需要讀寫的文件打開以后,fprintf()函數(shù)和fscanf()函數(shù)的使用方法與printf()、scanf()相似。

fprintf()函數(shù)的調(diào)用格式:

fprintf(文件指針,格式字符串,輸出表列);【例9-3】函數(shù)fprintf()的應(yīng)用。

#include<stdlib.h>#include<stdio.h>voidmain(){charch='A';inti=100;FILE*fp;if((fp=fopen("c:myfile3","w"))==NULL)

{printf("Cannotopenthisfile!\n");exit(0);}fprintf(fp,"%c,%d",ch,i);fclose(fp);}fscanf()函數(shù)的調(diào)用格式:

fprintf(文件指針,格式字符串,輸入表列);【例9-4】函數(shù)fscanf()的應(yīng)用。#include<stdlib.h>#include<stdio.h>voidmain(){charch;inti;FILE*fp;if((fp=fopen("c:myfile3","r"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}fscanf(fp,"%c,%d",&ch,&i);fclose(fp);printf("ch:%c,i:%d\n",ch,i);}4.fwrite()函數(shù)和fread()函數(shù)

fwrite()函數(shù)和fread()函數(shù)用于按數(shù)據(jù)塊來(lái)讀寫文件。

fwrite()函數(shù)的功能是向文件輸出若干數(shù)據(jù)塊的數(shù)據(jù)。

調(diào)用格式:fwrite(buffer,size,count,fp);其中,buffer是一個(gè)指針(地址),是需要輸出的數(shù)據(jù)存儲(chǔ)區(qū)的首地址,size為一個(gè)數(shù)據(jù)塊所占的字節(jié)數(shù),count為要輸出的數(shù)據(jù)塊的個(gè)數(shù),fp為指向文件的指針變量。如果調(diào)用成功,將返回實(shí)際寫入文件的數(shù)據(jù)塊的個(gè)數(shù)。

fread()函數(shù)的功能是從文件讀入若干數(shù)據(jù)塊的數(shù)據(jù)。

調(diào)用格式:

fread(buffer,size,count,fp);其中,buffer是一個(gè)指針(地址),是讀入數(shù)據(jù)塊后,這些數(shù)據(jù)存儲(chǔ)區(qū)的首地址,size為一個(gè)數(shù)據(jù)塊所占的字節(jié)數(shù),

count為要讀入的數(shù)據(jù)塊的個(gè)數(shù),fp為指向文件的指針變量。如果調(diào)用成功,將返回實(shí)際從文件讀出的數(shù)據(jù)塊的個(gè)數(shù),若遇文件結(jié)束或出錯(cuò),返回0。【例9-5】函數(shù)fwrite()和fread()的應(yīng)用。#include<stdlib.h>#include<stdio.h>main(){structstudent{charnumber[6];charname[20];charsex;intage;intscore;}s[2]={{"00001","Peter",'m',19,250},{"00002","Betty",'f',18,268}};structstudentss[2];(轉(zhuǎn)后)(接前)inti,j;FILE*fp;if((fp=fopen("c:myfile4","wb+"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}j=sizeof(structstudent);for(i=0;i<=1;i++)if(fwrite(&s[i],j,1,fp)!=1)printf("FileWriteError!\n");rewind(fp);(轉(zhuǎn)后)獲得結(jié)構(gòu)體類型變量所占存儲(chǔ)區(qū)域的大小,以此作為一個(gè)數(shù)據(jù)塊使文件指針變量fp的指向回到起始位置使用二進(jìn)制文件讀寫方式,方式“wb+”同時(shí)支持對(duì)二進(jìn)制文件的讀寫操作

(接前)for(i=0;i<=1;i++){fread(&ss[i],j,1,fp);printf("%s,%s,%c,%d,%d\n",ss[i].number,ss[i].name,ss[i].sex,ss[i].age,ss[i].score);}fclose(fp);}5.fseek()函數(shù)、ftell()函數(shù)和rewind()函數(shù)

fseek()函數(shù)、ftell()函數(shù)和rewind()函數(shù)用于實(shí)現(xiàn)對(duì)文件的隨機(jī)讀寫。

fseek()函數(shù)的功能是使FILE指針變量指向文件中指定的位置

調(diào)用格式:

fseek(文件類型指針變量名,位移量,起始點(diǎn));其中,文件類型指針變量名為指向文件的指針變量,起始點(diǎn)用數(shù)字表示:0─文件的開始處;1─FILE指針變量指向的當(dāng)前位置;─文件的末尾。位移量以字節(jié)數(shù)表示,如果其大于0,表示從文件頭部向文件尾部的方向計(jì)字節(jié)數(shù),不然,按從文件尾部向文件的頭部方向計(jì)字節(jié)數(shù)。如果調(diào)用fseek()函數(shù)成功,返回0,否則返回非0值。ftell()函數(shù)的功能是了解FILE指針變量的當(dāng)前指向。調(diào)用格式:

ftell(文件類型指針變量名);其中,文件類型指針變量名為文件的指針變量。如果調(diào)用ftell()函數(shù)成功,返回FILE指針變量當(dāng)前的指向相對(duì)于起始位置的位移量,以字節(jié)數(shù)表示,否則返回-1。

說(shuō)明:如果僅僅只是要判斷文件指針是否已經(jīng)指向文件末尾,可以直接調(diào)用feof(fp)函數(shù)。如果遇到文件結(jié)束,函數(shù)返回1,

否則返回0。

rewind()函數(shù)的功能是使FILE指針變量重新指向文件的開始位置。

調(diào)用格式:

rewind(文件類型指針變量名);

其中,文件類型指針變量名為指向該文件的指針變量。rewind()函數(shù)調(diào)用后無(wú)返回值?!纠?-6】從例9-5的文件myfile4中直接讀出s[1]的信息。

#include<stdlib.h>#include<stdio.h>main(){structstudent{charnumber[6];charname[20];charsex;intage;intscore;}s[2];(轉(zhuǎn)后)FILE*fp;if((fp=fopen("c:myfile4","rb+"))==NULL){printf("Cannotopenthisfile!\n");exit(0);}fseek

溫馨提示

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

評(píng)論

0/150

提交評(píng)論