C語言程序設計教程 課件 第10.1 文件_第1頁
C語言程序設計教程 課件 第10.1 文件_第2頁
C語言程序設計教程 課件 第10.1 文件_第3頁
C語言程序設計教程 課件 第10.1 文件_第4頁
C語言程序設計教程 課件 第10.1 文件_第5頁
已閱讀5頁,還剩41頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第10章文件教學目標1.了解C語言中文件的使用方法;2.能夠讀寫文本文件和二進制文件;3.掌握順序讀寫和隨機讀寫函數的用法。教學內容文件的相關操作10.2

文件的相關概念10.1第9章文件想一想C語言編程為什么需要使用文件?編程計算10名學生平均成績,每一次運行程序都要重復輸入10名學生的成績。如何做到一次輸入,下次運行程序重復使用?內存:臨時存儲數據磁盤(外存):長期保存數據,可以使用文件,將數據存儲到磁盤上。10.1文件的相關概念“文件”:就是記載在外部存儲器上的數據集合,是存儲數據的載體。在C語言中,把這些數據的集合看成是字符或者字節序列(或稱:有序的“字節流”),處理這些文件時,并不區分文件類型,而是按字節處理。EOF012345n-1結束標志10.1文件的相關概念文件的分類按數據的組織形式:文本文件、二進制文件按文件存儲格式:源程序文件、數據文件、圖形圖像文件、音頻文件、視頻文件、可執行文件按照保護級別:只讀文件、只寫文件、可讀可寫文件等按照保存期限:臨時文件、永久文件C語言程序輸入輸出操作涉及的數據文件10.1文件的相關概念文件的緩沖區使用緩沖區的目的:減少對磁盤的實際讀寫次數,提高讀、寫操作的速度。從磁盤文件讀入數據:一次將一批數據讀到內存緩沖區(充滿緩沖區),然后再從緩沖區逐個地將數據送給接收變量。向磁盤文件寫數據:先將數據送到內存緩沖區,裝滿緩沖區后才一起寫到磁盤文件。用緩沖區可以一次輸入或輸出一批數據,而不是執行一次輸入或輸出操作就訪問一次磁盤。10.1文件的相關概念文件的緩沖區C語言兩大類磁盤文件系統:“緩沖文件系統”:系統自動地在內存區為每一個正在使用的文件開辟一個緩沖區?!鷺藴蔍/O(標準輸入輸出)“非緩沖文件系統”:系統不自動設置緩沖區,而由用戶根據需要設置。→系統I/O(系統輸入輸出)stdio.h頭文件10.2文件的相關操作對文件的兩種操作:

“讀”----“輸入”“寫”----“輸出”從鍵盤(stdin)輸入,從手寫板輸入,都是讀數據,將數據讀入內存中。將文件中數據讀入內存就稱為“讀”文件,也稱為文件的輸入;將內存中的數據輸出到顯示器(stdout),輸出到打印機,都是寫數據,將內存中的數據寫入到文件,就稱為“寫”文件,也稱為文件的輸出。10.2文件的相關操作C語言文件操作步驟分為四步:①定義文件指針②打開文件③讀或寫文件④關閉文件重點:記住各種函數的用法10.2文件的相關操作1.定義文件指針文件操作之前必須要先定義文件指針變量,記錄文件當前的讀寫位置(相當于word文件和EXCEL文件中的光標)定義形式:FILE*<變量標識符>;如:FILE*fp;

則:fp為指向FILE類型結構體的指針變量(FILE:已經定義的結構體數據類型,類型定義在stdio.h頭文件中;)10.2文件的相關操作1.定義文件指針文件指針類型FILE的定義stdio.h頭文件中對文件指針類型的定義如下:typedefstruct{shortlevel;unsignedflags;charfd;unsignedcharhold;shortbsize;unsignedchar*buffer;unsignedchar*curp;//當前激活指針unsignedistemp;shorttoken;}FILE;10.2文件的相關操作2.文件的打開與關閉文件打開函數原型

FILE*fopen(char*filename,char*type);filename:字符串,文件名,可以是帶有路徑的文件名,可以在當前工作目錄(相對路徑)下;也可以在指定路徑(絕對路徑)下;type:字符串,操作模式,不同的模式對應不同的操作,對文本文件和二進制文件分別使用不同的操作模式;函數返回值:成功→文件指針;失敗→NULL。10.2文件的相關操作2.文件的打開與關閉常用的6種打開模式文本文件r

以只讀方式打開w

以只寫方式打開a

以追加方式打開r+

以讀/寫方式打開w+

以讀/寫方式建新文件a+

以讀/寫方式打開二進制文件rb

以只讀方式打開wb

以只寫方式打開ab

以追加方式打開rb+

以讀/寫方式打開wb+

以讀/寫方式建新文件ab+

以讀/寫方式打開注:并不是所有的C語言系統都具備以上文件操作模式,與編譯器有關。10.2文件的相關操作例題2.文件的打開與關閉【例題10_1】/*p10_1.c文件打開方式1*/#include<stdio.h>voidmain(){

FILE*fp;fp=fopen("myfile1.txt","r");if(fp==NULL)printf("fileopenerror!\n");elseprintf("fileopenOK!\n");fclose(fp);}問題:1.myfile1.txt文件在哪里?2.如果myfile1.txt文件不存在,會怎樣?與當前程序在同一個文件夾打開失敗,返回NULL10.2文件的相關操作例題2.文件的打開與關閉【例題10_2】/*p10_2.c文件打開方式2*/#include<stdio.h>voidmain(){

FILE*fp;fp=fopen("c:\\myfile2.txt","w");if(fp==NULL)printf("fileopenerror!\n");elseprintf("fileopenOK!\n");}問題:1.myfile2.txt文件在哪里?2.如果myfile2.txt文件不存在,會怎樣?在C盤根目錄下創建新文件,打開成功10.2文件的相關操作例題2.文件的打開與關閉【例題10_3】/*p10_3.c文件打開方式3*/#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;if((fp=fopen("myfile3.txt","a"))==NULL){printf("fileopenerror!\n");exit(0);}else{printf("FileopenisOK!\n");

/*此處為讀寫文件的操作代碼*/}fclose(fp);}問題:1.紅色括號是否必須有?必須有,==優先于=2.如果myfile3.txt文件不存在,會怎樣?創建新文件,打開成功10.2文件的相關操作2.文件的打開與關閉文件關閉函數原型為:intfclose(FILE*fp);fp:文件指針,指向一個已經打開的文件;例:fclose(fp);函數返回值:0-表示文件關閉正確;非0值-表示文件關閉失敗。文件使用完要關閉,否則有可能造成數據丟失!10.2文件的相關操作3.文件讀寫函數讀寫文件兩種方式:“順序讀寫”:文件被打開后,按照數據流的先后順序對文件進行從前向后按順序讀/寫操作,每讀/寫一次,文件指針自動指向下一個讀/寫位置。“直接讀寫”:又稱隨機讀寫,是指先通過庫函數指定要開始讀寫的字節號,將文件指針進行準確定位,然后從此位置開始對文件內容進行讀或寫操作。直接讀寫適合于具有固定長度記錄的文件。10.2文件的相關操作3.文件讀寫函數C語言文件讀寫函數聲明在stdio.h頭文件中,主要有四組,分別為:fgetc()/fputc:讀寫字符fgets()/fputs:讀寫字符串fscanf()/fprintf:格式化讀寫fread()/fwrite():按塊讀寫對文本文件,一般按字符、按字符串讀寫,或者格式化讀寫;對二進制文件,一般進行成塊讀寫或者格式化讀寫。10.2文件的相關操作3.文件讀寫函數1)字符讀寫函數向文件中寫一個字符:原型:charfputc(charch,FILE*fp);函數返回值:寫入正確→返回字符ch;錯誤→返回-1(EOF)ch:待輸出的某個字符,可以是一個字符常量,也可以是一個字符變量;fp:文件指針,指向一個已經打開的文件例:fputc(ch,fp);作用:將字符ch寫入fp指針所指的文件位置?!纠}10_4】從鍵盤輸入一系列字符,原樣寫入文件file1.txt,用字符*做結束標志。#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;charch;fp=fopen("file1.txt","w");if(fp==NULL)

{printf("fileopenerror!\n");

return;}//exit(0);printf("請連續輸入字符:\n");ch=getchar();while(ch!='*')

{

fputc(ch,fp); ch=getchar();}fclose(fp);}10.2文件的相關操作3.文件讀寫函數1)字符讀寫函數從文件中讀一個字符原型:intfgetc(FILE*fp);函數返回值:成功→返回字符的ASCII碼錯誤或到達文件尾→返回-1(EOF)fp:文件指針,指向一個已經打開的文件例:while((ch=fgetc(fp))!=EOF)作用:從文件指針fp所指文件中讀一個字符存入字符變量ch(事先已經定義),讀取成功未到文件尾部(ch!=EOF),則執行循環體里的語句,到文件尾部(ch==EOF)則退出循環?!纠}10_5】將文件file1.txt中的內容逐個字符讀出來,原樣顯示在屏幕上。

#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;charch;fp=fopen("file1.txt","r");if(fp==NULL)

{

printf("fileopenerror!\n");

return;

}printf("讀出的字符是:\n");

ch=fgetc(fp);while(ch!=EOF)

{ putchar(ch);

ch=fgetc(fp); }putchar('\n');fclose(fp);}10.2文件的相關操作3.文件讀寫函數提示:每讀/寫一次,文件指針自動指向下一個位置;讀取文件時,一定要先讀一次,再判斷文件是否結束。循環語句中一定要有再次讀文件的語句。10.2文件的相關操作3.文件讀寫函數2)字符串讀寫函數從文件中讀取字符串:char*fgets(char*string,intn,FILE*

fp);返回值:正確→返回地址string;錯誤→返回NULLstring:字符型指針,表示字符串的起始地址n:讀取字符串最長n-1個字符,回車換行符也是一個字符。如果提前遇到回車或文件結束符,則操作提前結束。讀取結束后,自動在讀入的字符串后面加一個“\0”作為字符串結束標志。fp:文件指針,指向一個已經打開的文件10.2文件的相關操作3.文件讀寫函數2)字符串讀寫函數例:fgets(ch,10,fp);作用:從文件指針fp所指文件位置讀取9個字符,放到以ch為起始地址的存儲空間,若在9個字符前,遇到回車換行符或文件結束符,則操作結束。讀取結束后在讀入的字符串后面加一個“\0”字符作為字符串結束標識。10.2文件的相關操作3.文件讀寫函數2)字符串讀寫函數向文件寫入字符串:原型:intfputs(char*str,FILE*fp);返回值:正確→返回非負數;錯誤→返回-1(EOF)str:要寫入文件的字符串??梢允亲址A浚部梢允侵赶蜃址闹羔樆蜃址蛿到M;fp:文件指針,指向一個已經打開的文件例:fputs("你好啊!",fp);作用:將字符串"你好?。?保存到文件指針fp所指的文件位置。【例題10_6】改進【例題10_4】,用讀寫字符串函數實現從鍵盤輸入一行字符寫入文本文件,文件名字由用戶指定

#include<stdio.h>#include<stdlib.h>#include<string.h>voidmain(){FILE*fp;charstr[20],name[20];printf("請輸入文件名:\n");gets(name);fp=fopen(name,"w");if(fp==NULL){printf("fileopenerror!\n");

return; }printf("請輸入字符串:\n");while(strlen(gets(str))>0)

fputs(str,fp);fclose(fp);}【例題10_7】改進【例題10_5】,用字符串讀寫函數將【例題10_6】創建的文件內容串讀出來,原樣顯示在屏幕上

#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;charstr[20],name[20];printf("請輸入文件名:\n");gets(name);fp=fopen(name,"r");if(fp==NULL){printf("fileopenerror!\n");

return; }printf("讀出的字符是:\n");while(fgets(str,20,fp)!=NULL)puts(str);fclose(fp);}10.2文件的相關操作習題如下程序執行后,文件t1.dat中的內容是()。#include<stdio.h>#include<stdlib.h>voidWriteStrn(char*fn,char*str){FILE*fp;chars;fp=fopen(fn,"w");fputs(str,fp);fclose(fp);}voidmain(){WriteStrn("t1.dat","start");WriteStrn("t1.dat","end");}A.startB.endC.startendD.endtB10.2文件的相關操作3.文件讀寫函數3)格式化讀寫函數格式化讀函數原型:intfscanf(FILE*fp,char*format,&arg1,&arg2,…,&argn);&arg1,&arg2,…,&argn:輸入項列表,與scanf()函數一致format:格式控制字符,與scanf()函數一致fp:文件指針,指向一個已經打開的文件例:fscanf(fp,"%d%d",&a,&b);作用:從fp所指文件位置讀兩個整數,分別存入變量a和b中,變量a和b事先已經正確定義,兩個整數之間以空格(或者跳格符、回車換行符)分隔。10.2文件的相關操作3.文件讀寫函數3)格式化讀寫函數格式化寫函數原型:intfprintf(FILE*fp,char*format,arg1,arg2,…argn)&arg1,&arg2,…,&argn:輸出項列表,與printf()函數一致format:格式控制字符,與printf()函數一致fp:文件指針,指向一個已經打開的文件例:fprintf(fp,"%d%s\n",i,name);作用:向fp指針所指文件位置寫兩個數據,一個整數,一個字符串。變量i和name已經正確定義,并存入數據。為了便于讀文件數據,格式符中加了空格進行分隔【例題10_8】編寫程序,輸入5名學生的成績、姓名,存在文本文件cj.txt中,每個學生一行,垂直對齊。

#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;intcj,i;charname[8];fp=fopen("cj.txt","w");if(fp==NULL){printf("fileopenerror!\n");

return; }for(i=1;i<=5;i++){printf("第%d名學生的成績、姓名:",i);

scanf("%d%s",&cj,name);

fprintf(fp,"%d\t%s\n",cj,name); }fclose(fp);}問:為何不需要定義結構體數組存學生成績?【例題10_9】編寫程序,將文本cj.txt文件中讀出,原樣顯示在屏幕上。

#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;intcj,i;charname[8];fp=fopen("cj.txt","r");if(fp==NULL){printf("fileopenerror!\n");exit(0);}for(i=1;i<=5;i++){ printf("第%d名學生:",i);

fscanf(fp,"%d%s",&cj,name);printf("%d\t%s\n",cj,name); }fclose(fp);}【例題10_10】用格式化讀寫函數讀寫二進制文件

#include<stdio.h>#include<stdlib.h>voidmain(){FILE*fp;intcj,i;charname[8];fp=fopen("cj.dat","wb+");if(fp==NULL){printf("fileopenerror!\n");exit(0);}printf("【輸入數據】\n");for(i=1;i<=3;i++)

{ printf("第%d名學生的成績、姓名:",i); scanf("%d%s",&cj,name);

fprintf(fp,"%d\t%s\n",cj,name);

}

rewind(fp);//文件位置指針重新返回到文件的開頭printf("\n【輸出數據】\n");

for(i=1;i<=3;i++){printf("第%d名學生:",i);

fscanf(fp,"%d%s",&cj,name);

printf("%d\t%s\n",cj,name);

}fclose(fp);}【輸入數據】第1名學生的成績、姓名:90張三第2名學生的成績、姓名:87李四第3名學生的成績、姓名:97王五【輸出數據】第1名學生:90張三第2名學生:87李四第3名學生:97王五10.2文件的相關操作3.文件讀寫函數4)按塊讀寫函數①按塊讀函數:原型:intfread(void*buf,intsize,intcount,FILE*fp);buf:數據塊指針,準備讀數據的內存首地址,通常為字符數組size:每個數據塊的字節數count:每讀寫一次,輸入或輸出的數據塊個數fp:文件指針,指向一個已經打開的文件返回值:成功→返回數據項數(count的值),出錯或到達文件尾→返回小于count的值作用:從fp所指的文件中讀取count個數據項,每一個數據項的長度為

size個字節,放到由buf所指的塊中(buf通常為字符數組)。讀取的

字節總數為size×count。10.2文件的相關操作3.文件讀寫函數4)按塊讀寫函數②按塊寫函數:原型:intfwrite(void*buf,intsize,intcount,FILE*fp)buf:數據塊指針,準備寫數據的內存首地址,通常為字符數組size:每個數據塊的字節數count:每讀寫一次,輸入或輸出的數據塊個數fp:文件指針,指向一個已經打開的文件返回值:成功→返回數據項數(count的值),出錯→返回小于count的值作用:將count個長度為size的數據項寫到fp所指的文件流中去【例題10_11】輸入5名學生的序號、姓名、成績,使用按塊讀寫函數保存在二進制文件st.dat中,每個學生一行,垂直對齊#include<stdio.h>#include<stdlib.h>voidmain(){

FILE*fp; inti;structs

{intxh;charname[8];intcj;}ss[5];fp=fopen("st.dat","ab");if(fp==NULL)

{printf("fileopenerror!\n");exit(0); }for(i=0;i<5;i++)

{

ss[i].xh=i+1; printf("第%d名學生的姓名:",i+1); scanf("%s",&ss[i].name); printf("第%d名學生的成績:",i+1); scanf("%d",&ss[i].cj);

fwrite(&ss[i],sizeof(structs),1,fp);

}fclose(fp);}【例題10_12】編寫程序,將二進制文件st.dat中的學生數據讀出來,顯示在屏幕上。st.dat中,每個學生一行,垂直對齊#include<stdio.h>#include<stdlib.h>voidmain(){

FILE*fp;inti=0;structs

{intxh;charname[8];intcj;}ss[30];fp=fopen("st.dat","rb");if(fp==NULL)

{printf("fileopenerror!\n");exit(0); }fread(&ss[i],sizeof(structs),1,fp);while(!feof(fp))

{

printf("序號:%d\t姓名:%s",ss[i].xh,ss[i].name); printf("\t成績:%d:\n",ss[i].cj); i++;

fread(&ss[i],sizeof(structs),1,fp);

}fclose(fp);}序號:1姓名:張三成績:80:序號:2姓名:李四成績:90:序號:3姓名:王五成績:87:序號:4姓名:趙六成績:79:序號:5姓名:鄭琦成績:86:1

溫馨提示

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

評論

0/150

提交評論