C語言文件的操作_第1頁
C語言文件的操作_第2頁
C語言文件的操作_第3頁
C語言文件的操作_第4頁
C語言文件的操作_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

工程八文件的操作工程要點:文件的概念以及文件類型指針文件的翻開和關(guān)閉文件的讀寫學(xué)習(xí)目標(biāo):掌握文件類型指針的定義方法掌握文件翻開和關(guān)閉的方法熟悉文件的讀寫方法C語言程序設(shè)計1工作任務(wù)導(dǎo)入工作任務(wù)在工程七的職工工資管理系統(tǒng)中,所涉及的數(shù)據(jù)量是比較大的,而我們每次運行程序時都需要通過鍵盤輸入數(shù)據(jù),非常麻煩,而且程序處理的結(jié)果也只能顯示在屏幕上,無法保存。能否將輸入/輸出的數(shù)據(jù)以磁盤文件的形式存儲起來,那樣我們處理大批量數(shù)據(jù)的輸入和輸出問題將會變得十分方便。引導(dǎo)問題1、如何定義文件指針?2、如何實現(xiàn)文件的翻開和關(guān)閉?3、如何將從鍵盤上輸入的信息保存到文件中?以及如何將文件中的數(shù)據(jù)導(dǎo)入到程序中?2任務(wù)1文件類型指針變量的定義

在職工工資管理系統(tǒng)中所涉及到的數(shù)據(jù)量是很大的,每次我們運行程序時都必須通過鍵盤將數(shù)據(jù)輸入,輸入的工作量很大,而且輸出結(jié)果也無法保存。

使用文件就可以解決問題。怎么辦?3文件

文件是一組相關(guān)數(shù)據(jù)的有序集合。每一個文件都有一個唯一的文件名。文件是外存中保存信息的最小單位。8.1文件4文件的分類在C語言中,文件被看成是由一個一個的字符或字節(jié)組成的。根據(jù)數(shù)據(jù)的組織形式,文件可分為文本文件和二進(jìn)制文件兩種。5文本文件又被稱為ASCII文件,文本文件在磁盤中存放時每個字符對應(yīng)一個字節(jié),用于存放其對應(yīng)的ASCII碼。文本文件可在屏幕上按字符顯示。

(1)二進(jìn)制文件是將數(shù)據(jù)轉(zhuǎn)換成二進(jìn)制形式后存儲起來的文件。二進(jìn)制文件雖然也可在屏幕上顯示,但其內(nèi)容無法讀懂。

(2)說明:673/17/20248操作文件的一般步驟翻開文件讀寫文件關(guān)閉文件翻開文件:建立用戶程序與文件的聯(lián)系,為文件分配一個文件緩沖區(qū)。讀寫文件:是指對文件的讀、寫、追加和定位操作。關(guān)閉文件:切斷文件與程序的聯(lián)系,釋放文件緩沖

區(qū)。

C語言的輸入輸出函數(shù)庫中提供了大量的函數(shù),用于完成對數(shù)據(jù)文件的建立、數(shù)據(jù)的讀寫、數(shù)據(jù)的追加等操作。

在程序中調(diào)用這些函數(shù)時,必須先用include命令包含stdio.h文件。

8對文件進(jìn)行操作,需要使用文件指針。

文件指針是一種結(jié)構(gòu)體類型變量,C編譯系統(tǒng)已將結(jié)構(gòu)體定義好,并命名為FILE,我們直接使用它定義就好。

FILE存放了文件名、文件狀態(tài)標(biāo)志及緩沖區(qū)大小等信息。FILE是一個類型名,它已經(jīng)在頭文件stdio.h中聲明。8.1.2文件指針9定義文件指針變量的一般格式為:

FILE*指針變量標(biāo)識符;

108.1.3任務(wù)實施

任務(wù)1定義一個文件指針變量。FILE*fp;fp是一個指向FILE類型結(jié)構(gòu)體的指針變量??梢宰宖p指向某一個文件的結(jié)構(gòu)體變量,從而通過該結(jié)構(gòu)體變量中的文件信息能夠訪問該文件。

11任務(wù)2文件的翻開和關(guān)閉任務(wù)分析對文件進(jìn)行操作時,首先要定義文件指針,并將其與要操作的文件連接起來,這就需要將“文件翻開”;使用完文件后,還需要將“文件關(guān)閉”,防止數(shù)據(jù)的喪失。任務(wù)2將錄入的職工信息放入到文件employee.txt,實現(xiàn)對該文件的翻開和關(guān)閉。

123/17/202413常用的調(diào)用形式:FILE*fp;fp=fopen(文件名,使用文件方式);文件名:需要翻開的文件名稱(字符串)。使用文件方式:是具有特定含義的符號。8.2.1.文件翻開函數(shù)fopen()函數(shù)功能:按指定的使用文件方式翻開指定的文件。假設(shè)文件翻開成功,為該文件分配一個文件緩沖區(qū)和一個FILE類型變量,返回一個FILE類型指針;假設(shè)文件翻開失敗,返回NULL。1314例如:fp=fopen(“d:\\c\\myfile.txt”,”r”);意義:是以“r”只讀方式,翻開d:盤c目錄下的myfile.txt文件,fp指向該文件。15另外,翻開文件后常會作一些文件讀取或?qū)懭氲膭幼?,如果翻開文件失敗,接下來的讀寫動作也無法順利進(jìn)行,所以一般在fopen()后常作錯誤判斷及處理。因此常用以下程序段翻開文件:if((fp=fopen(“d:\\c\\myfile.txt”,”r”)==NULL){printf("\nerroronopenmyfile.txt!");exit(0);}16這段程序的意義是,如果返回的指針為空,表示不能翻開文件,那么給出提示信息“erroronopenmyfile.txt!”,然后執(zhí)行exit(0)退出程序。需要說明的使用exit()函數(shù),包含在頭文件“stdlib.h”中。173/17/202418常用的調(diào)用形式:FILE*fp;fclose(fp);fp:已經(jīng)翻開的文件指針。8.2.2.文件關(guān)閉函數(shù)fclose(

)函數(shù)功能:關(guān)閉fp指定的文件,釋放該文件的緩沖區(qū)、FILE類型變量及文件指針。假設(shè)文件關(guān)閉成功,那么返回0;假設(shè)文件關(guān)閉失敗,那么返回非0值。188.2.3任務(wù)實施

在職工工資管理系統(tǒng)中,我們將從鍵盤上錄入的職工工資的信息寫入到文本文件employee.txt文件中。首先,我們要翻開該文件。19

FILE*fp;if((fp=fopen(“d:\\employee.txt”,”w”)==NULL){printf("\nerroronopenmyfile.txt!");exit(0);}20任務(wù)3文件的讀寫

任務(wù)分析

實現(xiàn)文件的讀寫,在職工工資管理系統(tǒng)中,將從鍵盤上錄入的職工信息寫入到文件employee.txt中去,然后再從文件中將數(shù)據(jù)讀出數(shù)據(jù)進(jìn)行統(tǒng)計和處理。

21在C語言中提供了多種文件讀寫的函數(shù)?!?〕字符讀寫函數(shù):fgetc和fputc〔2〕字符串讀寫函數(shù):fgets和fputs〔3〕數(shù)據(jù)塊讀寫函數(shù):fread和fwrite〔4〕格式化讀寫函數(shù):fscanf和fprintf使用以上函數(shù)都要求包含頭文件stdio.h。223/17/2024231、字符讀寫函數(shù):fgetc和fputc①fgetc函數(shù)用于從指定的文件中讀出一個字符。一般格式為:字符變量=fgetc(文件指針);功能:從指定的文件中讀取一個字符到字符變量中。②fputc函數(shù)用于把一個字符寫入到指定文件中。一般形式為:fputc(字符變量,文件指針);功能:將字符變量寫入到指定的文件中去。

23從鍵盤輸入一行字符,將其寫入到d:\myfile.txt文件中,再把該文件的內(nèi)容在屏幕上顯示出來。分析:①以“w”方式,翻開文件d:\myfile.txt;②從鍵盤上接收字符,寫入到d:\myfile.txt中;③關(guān)閉文件;④以“r”方式,翻開文件d:\myfile.txt;⑤從d:\myfile.txt文件中讀出數(shù)據(jù),顯示到屏幕上;⑥關(guān)閉文件。24#include<stdio.h>main(){FILE*fp;/*定義一個文件指針變量fp*/intc;/*c為存放字符的變量*/charfilename[40];/*filename用于存放數(shù)據(jù)文件名*/printf("filename:");/*提示輸入磁盤文件名*/gets(filename);if((fp=fopen(filename,"w"))==NULL){printf("Can'topenthe%s\n",filename);exit(0);}25/*鍵盤文件結(jié)束標(biāo)志:輸入Ctrl+z,顯示^Z后回車*/while((c=getchar())!=EOF)putc(c,fp);/*將鍵盤輸入的字符寫到文件中*/fclose(fp);/*建立文件結(jié)束,關(guān)閉文件*/printf("outfile:\n");fp=fopen(filename,"r");/*以讀方式翻開文本文件*/while((c=getc(fp))!=EOF)/*未讀到文件結(jié)束標(biāo)志時*/putchar(c);/*在顯示器顯示讀出的字符*/fclose(fp);/*讀文件結(jié)束,關(guān)閉文件*/}263/17/202427常用的調(diào)用形式:FILE

*fp;

feof(fp);

fp:文件指針變量。8.3.1文件結(jié)束測試函數(shù)函數(shù)功能:測試fp所指向的文件是否已讀到文件尾部。假設(shè)該文件沒有結(jié)束,那么返回0;假設(shè)文件結(jié)束,那么返回非0值。

對文本文件進(jìn)行讀操作時,例如fgetc()返回EOF,即可作文件結(jié)束處理。但在二進(jìn)制文件中-1是合法數(shù)據(jù),所以系統(tǒng)提供了一個適用對象更普遍的文件結(jié)束測試函數(shù)feof。273/17/202428常用的調(diào)用形式:FILE

*fp;

fputs(

str,

fp

);

str:需要輸出的字符串,可以是字符串常量或字符串指針;fp:文件指針變量。字符串輸出函數(shù)fputs(

)函數(shù)功能:將字符串〔不包括字符串結(jié)束標(biāo)志'\0'〕寫到文件指針fp所指向的文件中。假設(shè)輸出操作成功,返回非0值;假設(shè)輸出操作失敗,那么返回0。283/17/202429常用的調(diào)用形式:FILE*fp;fgets(str,n,fp);str:字符指針,可以是字符數(shù)組名或字符指針變量;n:讀取字符個數(shù)〔n-1〕。fp:文件指針變量。2.字符串輸入函數(shù)fgets(

)函數(shù)功能:從fp所指向的文件中,讀取n-1個字符后,加上字符串結(jié)束標(biāo)志'\0'組成一個字符串,存入字符數(shù)組中。假設(shè)輸入操作成功,返回字符數(shù)組的首地址;假設(shè)文件結(jié)束或輸入操作失敗,那么返回NULL。29例如:應(yīng)用fputs和fgets函數(shù),建立和讀取文本文件。#include"stdio.h"#include"string.h"main(){FILE*fp;/*定義一個文件指針變量fp*/charfilename[40],str[81];printf("filename:");/*提示輸入磁盤文件名*/gets(filename);if((fp=fopen(filename,"w"))==NULL)/*在磁盤中新建并翻開一個文本文件,同時測試是否成功*/{printf("Can'topenthe%s\n",filename);exit(0);}30while(strlen(gets(str))>0)/*鍵盤輸入空串〔即僅輸入回車〕那么輸入全部結(jié)束*/{fputs(str,fp);/*將鍵盤輸入的字符串寫到文件中*//*在文件中參加換行符作為字符串分隔符*/fputc('\n',fp);}fclose(fp);/*建立文件結(jié)束,關(guān)閉文件*/printf("outfile:\n");fp=fopen(filename,"r");/*以讀方式翻開文本文件*/while((fgets(str,81,fp))!=NULL)/*從文件讀取字符串并測試文件是否已讀完*/printf("%s",str);/*將文件中讀取的字符串分行顯示*/fclose(fp);/*讀文件結(jié)束,關(guān)閉文件*/}313、數(shù)據(jù)塊讀寫函數(shù):fread和fwrite①fread函數(shù)從指定的文件中讀入一組數(shù)據(jù)。一般格式為:fread(buffer,size,count,fp)功能:是從fp指向的文件的當(dāng)前位置開始,讀取count次,每次size大小的數(shù)據(jù),放到buffer所指向的地址空間。②fwrite函數(shù)將一組數(shù)據(jù)寫入到指定的文件中。一般格式為:fwrite(buffer,size,count,fp)功能:是將buffer指針?biāo)傅木彌_區(qū)中取出長度為size個字節(jié),連續(xù)取count次,寫到fp指向的文件中去。當(dāng)調(diào)用成功時,返回實際寫入的數(shù)據(jù)項數(shù),否那么返回零值。324、格式化讀寫函數(shù):fscanf和fprintf①fscanf函數(shù)是格式化輸入函數(shù)。一般格式為:

fscanf(文件指針,格式控制串,輸入項表)功能:按照“格式控制串”所指定的輸入格式,從指定文件的中讀出數(shù)據(jù),然后再按照輸入項地址表列的順序,存入到相應(yīng)的存儲單元中。例如:

fscanf(fp,“%d%s”,&num,name);其意義是從fp所指向文件中讀出一個整數(shù)放入num中,再讀出一個字符串放到name中。33②fprintf函數(shù)是格式化輸出函數(shù)。一般格式為:

fprintf(文件指針,格式控制串,輸出項表);

功能:把輸出項表中的項,按照“格式控制串”的格式寫入到指定的文件中去。

例如:fprintf(fp,"%d%c",num,c);其意義是把num和c分別按照整型和字符型的格式寫入到fp所指的文件中去。

fscanf和fprintf函數(shù)與前面學(xué)習(xí)過的scanf和printf函數(shù)的功能相似,都是格式化讀寫函數(shù)。它們的區(qū)別在于fscanf函數(shù)和fprintf函數(shù)的讀寫對象是磁盤文件,而scanf和printf函數(shù)的讀寫對象是鍵盤和顯示器。

34練一練

對學(xué)生成績管理系統(tǒng)進(jìn)行改寫,從鍵盤錄入學(xué)生信息然后寫入到student.txt文件中,然后再從文件student.txt中讀取信息,顯示在屏幕上。

358.3.2任務(wù)實施

在職工工資管理系統(tǒng)中,將從鍵盤上錄入的職工信息寫入到文件employee.txt中去,然后再從文件中將數(shù)據(jù)讀出進(jìn)行統(tǒng)計和處理。1、首先將從鍵盤上接收職工信息寫入到文件employee.txt中。

2、從employee.txt文件讀取數(shù)據(jù),然后在屏幕上顯示。

36#defineN5inttotal=N;/*記錄職工總數(shù)值*/structemployee{longnum;charname[20];charsex;intage;chardepartment[20];intgrade;intsalary;};37voidmain(){structemployeee[10];FILE*fp;inti;if((fp=fopen("d:\\employee.txt","w"))==NULL)/*翻開文件*/{printf("Cannotopenfile!");exit(0);}printf("請輸入%d名職工的信息:\n",N);/*從鍵盤上接收5名職工信息,然后寫入到文件employee.txt中*/for(i=0;i<N;i++){ scanf("%ld%s%c%d%s%d%d",&e[i].num,e[i].name,&e[i].sex,&e[i].age,e[i].department,&e[i].grade,&e[i].salary);fprintf(fp,"%ld%s%c%d%s%d%d\n",e[i].num,e[i].name,e[i].sex,e[i].age,e[i].department,e[i].grade,e[i].salary);}fclose(fp);}①、fprintf函數(shù)在寫入數(shù)據(jù)時,數(shù)據(jù)是不會自動換行的,所以必須要參加’\n’,來到達(dá)換行的目的。②、文件對結(jié)構(gòu)體類型數(shù)據(jù)中的實型數(shù)據(jù)成員進(jìn)行處理時,必須通過臨時變量間接輸入。即輸入temp,然后再em[i].salary=temp。為方便起見,本例中salary改為int類型來處理。38voidmain(){structemployeee[10];FILE*fp; inti; if((fp=fopen("d:\\employee.txt","r"))==NULL)/*翻開文件*/{printf("Cannotopenfile!");exit(0);}printf("從文件中讀取職工信息:\n");/*從文件employee.txt讀取職工信息,然后顯示在屏幕上*/for(i=0;i

溫馨提示

  • 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

提交評論