高級(jí)語言程序設(shè)計(jì) 課件 第10章 文件_第1頁(yè)
高級(jí)語言程序設(shè)計(jì) 課件 第10章 文件_第2頁(yè)
高級(jí)語言程序設(shè)計(jì) 課件 第10章 文件_第3頁(yè)
高級(jí)語言程序設(shè)計(jì) 課件 第10章 文件_第4頁(yè)
高級(jí)語言程序設(shè)計(jì) 課件 第10章 文件_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第10章文件10.1文件概述

文件的打開和關(guān)閉函數(shù)10.2

文件的讀/寫函數(shù)10.310.4文件的定位函數(shù)本章內(nèi)容導(dǎo)讀本章主要介紹與文件操作相關(guān)的一些庫(kù)函數(shù),包括文件打開、關(guān)閉、字符讀/寫、字符串讀/寫、數(shù)據(jù)塊讀/寫、格式化讀/寫和定位函數(shù)及其使用方法等。通過學(xué)習(xí)本章,讀者應(yīng)掌握以下內(nèi)容:掌握緩沖文件系統(tǒng)中有關(guān)文件操作的庫(kù)函數(shù)的使用方法;掌握對(duì)文件進(jìn)行簡(jiǎn)單處理。文件:存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合,是操作系統(tǒng)數(shù)據(jù)管理的單位。文件命名

為標(biāo)識(shí)一個(gè)文件,文件都必須有文件名。

文件名結(jié)構(gòu)盤符:路徑\文件主名[.擴(kuò)展名]。

注意:文件主名和擴(kuò)展名均由字母和數(shù)字等字符組成。

讀文件

將磁盤文件中的數(shù)據(jù)傳送到計(jì)算機(jī)內(nèi)存的操作。

寫文件

從計(jì)算機(jī)內(nèi)存向磁盤文件中傳送數(shù)據(jù)的操作。

10.1文件概述

文件分類按文件的邏輯結(jié)構(gòu)劃分

記錄文件:由具有一定結(jié)構(gòu)的記錄組成(定長(zhǎng)和不定長(zhǎng))。

流式文件:由一個(gè)個(gè)字符(字節(jié))數(shù)據(jù)順序組成。按文件的存儲(chǔ)介質(zhì)劃分

普通文件:存儲(chǔ)介質(zhì)(磁盤、磁帶等)文件。

設(shè)備文件:非存儲(chǔ)介質(zhì)(鍵盤、顯示器、打印機(jī)等)文件。按文件的組織形式劃分

順序存取文件和隨機(jī)存取文件。按文件的內(nèi)容劃分

程序文件和數(shù)據(jù)文件,其中程序文件又可分為源文件、目標(biāo)文件和可執(zhí)行文件。10.1文件概述文件分類按文件的存儲(chǔ)形式劃分ASCII文件(文本文件):每一字節(jié)存儲(chǔ)一個(gè)字符,便于對(duì)字符逐個(gè)處理。但一般占用存儲(chǔ)空間較多,而且要花費(fèi)轉(zhuǎn)換時(shí)間(二進(jìn)制與ASCII碼之間的轉(zhuǎn)換)。二進(jìn)制文件:數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣存放。二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù),原樣輸出到磁盤文件中。可以節(jié)省存儲(chǔ)空間和轉(zhuǎn)換時(shí)間,但一個(gè)字節(jié)并不對(duì)應(yīng)一個(gè)字符,不能直接輸出字符形式。文件存取方式順序存取:自上而下逐一地存取文件的內(nèi)容。保存數(shù)據(jù)時(shí),將數(shù)據(jù)附加到文件的尾部,常用于文本文件。隨機(jī)存取:以一個(gè)完整的單位進(jìn)行數(shù)據(jù)讀寫,常用于二進(jìn)制文件。

10.1文件概述1、文件例

inta=10000;0010011100010000內(nèi)存存儲(chǔ)形式0010011100010000二進(jìn)制形式0011000100110000001100000011000000110000ASCII碼形式文本文件特點(diǎn):存儲(chǔ)量大,轉(zhuǎn)換為二進(jìn)制速度慢,直觀易記。二進(jìn)制文件特點(diǎn):存儲(chǔ)量小,無需轉(zhuǎn)換。但因1個(gè)字節(jié)不對(duì)應(yīng)1個(gè)字符,故不能直接輸出其字符形式。

文件系統(tǒng)緩沖文件系統(tǒng)(標(biāo)準(zhǔn)I/O):系統(tǒng)自動(dòng)為正在使用的文件開辟內(nèi)存緩沖區(qū)。非緩沖文件系統(tǒng)(系統(tǒng)I/O):由用戶在程序中為每個(gè)文件設(shè)定緩沖區(qū)。磁盤文件輸出文件緩沖區(qū)輸入文件緩沖區(qū)程序數(shù)據(jù)區(qū)a緩沖文件系統(tǒng)緩沖區(qū)指令區(qū)程序用戶數(shù)據(jù)區(qū)非緩沖文件系統(tǒng)注意:緩沖文件系統(tǒng)操作簡(jiǎn)單,所以ANSIC僅采用緩沖文件系統(tǒng)處理文件。定義格式

FILE*文件型指針名1,*文件型指針名2,…;結(jié)構(gòu)體FILE緩沖文件系統(tǒng)為每個(gè)正使用的文件在內(nèi)存開辟文件信息區(qū)。文件信息用系統(tǒng)定義的名為FILE的結(jié)構(gòu)體描述。FILE定義在stdio.h中。typedef

struct/*文件類型聲明*/{

shortlevel;

/*緩沖區(qū)滿/空程度*/unsignedflags;/*文件狀態(tài)標(biāo)志*/charfd;/*文件描述符*/unsignedcharhold;/*檢查緩沖區(qū)狀態(tài),若無緩沖區(qū)不讀取字符*/shortbsize;/*緩沖區(qū)大小*/unsignedchar*buffer;/*數(shù)據(jù)傳送緩沖區(qū)位置*/unsignedchar*curp;/*當(dāng)前讀寫位置*/unsignedistemp;/*臨時(shí)文件指示*/shorttoken;/*用作有效檢測(cè)*/}FILE;/*結(jié)構(gòu)體類型名FILE*/10.1文件概述2、文件型指針用法文件打開時(shí),系統(tǒng)自動(dòng)建立文件類型,并返回指向它的指針,程序通過該指針獲得文件信息,以訪問文件。文件關(guān)閉時(shí),文件類型被釋放。文件名文件使用方式文件類型指針C程序操作系統(tǒng)磁盤注意:結(jié)構(gòu)體類型名FILE必須大寫。10.1文件概述2、文件型指針對(duì)文件進(jìn)行操作之前,必須先打開該文件;使用結(jié)束后,應(yīng)立即關(guān)閉,以免數(shù)據(jù)丟失。C語言規(guī)定了標(biāo)準(zhǔn)輸入/輸出函數(shù)庫(kù),用fopen()函數(shù)打開一個(gè)文件,用fclose()函數(shù)關(guān)閉一個(gè)文件。為增強(qiáng)程序的可靠性,打開一個(gè)文件的常用方法:

if((fp=fopen("文件名","操作方式"))==NULL)

{

printf("cannotopenthisfile\n");exit(0);

}

10.2文件的打開和關(guān)閉函數(shù)文件打開函數(shù)fopen()函數(shù)首部

FILE*fopen(char*filename,char*mode)功能:按mode指定的“使用方式”打開filename指定的“文件名”對(duì)應(yīng)的文件,同時(shí)自動(dòng)地為該文件分配一個(gè)內(nèi)存緩沖區(qū)。返回值:若打開文件正確,則返回一個(gè)指向“文件型”的指針,系統(tǒng)自動(dòng)建立文件類型,并返回指向它的指針,程序通過該指針獲得文件信息,訪問文件并進(jìn)行各種操作。若打開文件出錯(cuò),則返回值為“NULL”,其中NULL是在頭文件“stdio.h”中定義的符號(hào)常量,其值為0,含義是“空地址”。要打開的文件名使用文件方式例:文件打開與測(cè)試。

FILE*fp;if((fp=fopen("filename","rb+"))==NULL){printf("cannotopenthisfile\n");exit(0);}例FILE*fp;

fp=fopen

("c:\test",

"rb+");

"r+/rb+"

(讀寫)"a/ab"

(追加)"w/wb"

(只寫)"r/rb"

(只讀)"w+/wb+"

(讀寫)"a+/ab+"

(讀寫)為輸入打開一個(gè)文本/二進(jìn)制文件為輸出打開或建立一個(gè)文本/二進(jìn)制文件為讀/寫打開一個(gè)文本/二進(jìn)制文件為讀/寫建立一個(gè)文本/二進(jìn)制文件為讀/寫打開或建立一個(gè)文本/二進(jìn)制文件向文本/二進(jìn)制文件尾追加數(shù)據(jù)文件使用方式含義程序開始運(yùn)行時(shí),系統(tǒng)自動(dòng)打開和關(guān)閉的三個(gè)標(biāo)準(zhǔn)設(shè)備文件,并分別定義了相應(yīng)的文件型指針。文件型指針名標(biāo)準(zhǔn)設(shè)備名稱標(biāo)準(zhǔn)設(shè)備文件名稱stdin標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)標(biāo)準(zhǔn)輸入stdout標(biāo)準(zhǔn)輸出設(shè)備(顯示器)標(biāo)準(zhǔn)輸出stderr標(biāo)準(zhǔn)錯(cuò)誤輸出設(shè)備(顯示器)標(biāo)準(zhǔn)錯(cuò)誤輸出10.2文件的打開和關(guān)閉函數(shù)文件關(guān)閉函數(shù)fclose()函數(shù)首部:int

fclose(FILE*fp)功能:關(guān)閉fp所指向的文件,同時(shí)自動(dòng)釋放分配給該文件的內(nèi)存緩沖區(qū)。返回值:若正確關(guān)閉指定的文件,則返回0;否則,返回非0。文件打開時(shí)返回的文件類型指針磁盤文件輸出文件緩沖區(qū)輸入文件緩沖區(qū)程序數(shù)據(jù)區(qū)a緩沖文件系統(tǒng):fclose不關(guān)閉文件可能會(huì)丟失數(shù)據(jù)10.2文件的打開和關(guān)閉函數(shù)

符號(hào)常量EOF對(duì)文本文件執(zhí)行讀操作時(shí),如果遇到文件尾,則返回一個(gè)文件結(jié)束標(biāo)志EOF(其值在頭文件stdio.h中被定義為-1,含義是文件尾);對(duì)二進(jìn)制文件執(zhí)行讀操作時(shí),必須使用庫(kù)函數(shù)feof()判斷是否遇到文件尾。

文件尾測(cè)試函數(shù)feof()函數(shù)首部

int

feof(FILE*fp)功能:判斷fp所指向的文件是否到達(dá)文件尾。同時(shí)適用于ASCII碼文件和二進(jìn)制文件。例如:!feof(input))表示源文件(用于輸入)未結(jié)束,循環(huán)繼續(xù)。返回值:若遇到文件尾,則返回值非0;否則,返回值0。1、字符尾測(cè)試函數(shù)10.3文件的讀/寫函數(shù)寫字符函數(shù)fputc()函數(shù)首部int

fputc(charch,FILE*fp)功能:將ch中的字符寫入fp所指向文件的當(dāng)前位置,同時(shí)將讀/寫位置指針后移1字節(jié),即指向下一個(gè)讀/寫位置。返回值:若正確寫入字符,則返回剛寫入到文件的字符;否則,返回EOF。

讀字符函數(shù)fgetc()函數(shù)首部int

fgetc(FILE*fp)功能:從fp所指向文件的當(dāng)前位置讀取一個(gè)字符,同時(shí)將讀/寫位置指針后移1字節(jié),即指向下一個(gè)讀/寫位置。返回值:若正確讀取字符,則返回讀取的單個(gè)字符;否則,返回EOF。上述兩個(gè)函數(shù)主要用于文本文件,也可用于二進(jìn)制文件。2、字符讀/寫函數(shù)10.3文件的讀/寫函數(shù)【例10-1】從鍵盤輸入一些字符,逐個(gè)把它們存到磁盤文件中,直到輸入#結(jié)束。#include<stdio.h>

intmain(void){charch,filename[20];FILE*fp;

scanf("%s",filename);if((fp=fopen(filename,"w"))==NULL){

printf("cannotopenthisfile\n");

exit(0);}while((ch=getchar())!='#'){

fputc(ch,fp);

putchar(ch);}

fclose(fp);return0;}file1.txtComputerandC#computerandC讀字符串函數(shù)fgets()函數(shù)首部

char*fgets(char*str,int

length,FILE*fp)功能:從fp所指向文件的當(dāng)前位置讀入一個(gè)字符串,即讀取length-1個(gè)字符,并在尾部自動(dòng)補(bǔ)充一個(gè)字符串結(jié)束標(biāo)志符'\0',組成字符串后存入str所指定的內(nèi)存區(qū),同時(shí)將讀寫位置指針后移實(shí)際讀出的字符個(gè)數(shù)字節(jié)。如果在讀取前n-1個(gè)字符中遇到文件尾EOF或回車,則讀取結(jié)束,并在讀取的字符后面補(bǔ)充一個(gè)字符串結(jié)束標(biāo)志符'\0'組成字符串。返回值:若正確讀取字符串,則返回str對(duì)應(yīng)的地址;否則,返NULL。3、字符串讀/寫函數(shù)10.3文件的讀/寫函數(shù)寫字符串函數(shù)fputs()函數(shù)首部int

fputs(char*str,FILE*fp)功能:把str所指向的一個(gè)字符串,舍去字符串結(jié)束標(biāo)志符'\0'后寫入fp所指向文件的當(dāng)前位置。同時(shí)將讀寫位置指針向后移動(dòng)字符串長(zhǎng)度的字節(jié)。返回值:若正確寫入字符串,則返回寫入文件的實(shí)際字符數(shù);否則,返回EOF。注意:不同的C語言編譯系統(tǒng)的返回值可能不同。3、字符串讀/寫函數(shù)10.3文件的讀/寫函數(shù)

寫數(shù)據(jù)塊函數(shù)fwrite()函數(shù)首部

int

fwrite(void*buffer,int

size,int

count,FILE*fp)功能:將從buffer開始的count個(gè)數(shù)據(jù)(每個(gè)數(shù)據(jù)占用size個(gè)字節(jié))一次性寫入fp所指向的文件。同時(shí),將讀/寫位置指針向后移動(dòng)size×count個(gè)字節(jié)。返回值:若正確寫入數(shù)據(jù)塊,則返回值是count;否則,返回0。說明buffer:指向要輸入/輸出數(shù)據(jù)存儲(chǔ)區(qū)的首地址的指針size:每個(gè)要寫入數(shù)據(jù)的字節(jié)數(shù)count:要寫入的數(shù)據(jù)個(gè)數(shù)fp:要寫入的文件指針fread與fwrite

一般用于二進(jìn)制文件的讀/寫。4、數(shù)據(jù)塊讀/寫函數(shù)10.3文件的讀/寫函數(shù)讀數(shù)據(jù)塊函數(shù)fread()函數(shù)首部

int

fread(void*buffer,int

size,int

count,FILE*fp)功能:從fp所指向文件的當(dāng)前位置開始,一次性讀入count個(gè)數(shù)據(jù)(每個(gè)數(shù)據(jù)占用size個(gè)字節(jié)),并將讀入的數(shù)據(jù)存放到以buffer為首地址的內(nèi)存區(qū);同時(shí),將讀/寫位置指針向后移動(dòng)size×count個(gè)字節(jié)。返回值:若正確讀取數(shù)據(jù)塊,則返回值是count;否則,返回0。說明buffer:指向要讀取數(shù)據(jù)存儲(chǔ)區(qū)的首地址的指針size:每個(gè)要讀取數(shù)據(jù)的字節(jié)數(shù)count:要讀取的數(shù)據(jù)個(gè)數(shù)fp:要讀取的文件指針4、數(shù)據(jù)塊讀/寫函數(shù)10.3文件的讀/寫函數(shù)例floatf[2];FILE*fp;

fp=fopen("aa.dat","rb");

fread(f,4,2,fp);for(i=0;i<2;i++)

fread(&f[i],4,1,fp);例structstudent{intnum;charname[20];charsex;intage;floatscore[3];}stud[10];for(i=0;i<10;i++)

fread(&stud[i],sizeof(structstudent),1,fp);【例10-2】從鍵盤輸入4個(gè)學(xué)生數(shù)據(jù),并將其轉(zhuǎn)存到磁盤文件中去。#include<stdio.h>#defineSIZE4struct

student_type{charname[10];

int

num;

intage;charaddr[15];}stud[SIZE];intmain(void){

inti;for(i=0;i<SIZE;i++)

scanf("%s%d%d%s",stud[i].name,&stud[i].num,

&stud[i].age,stud[i].addr);

save();display();return0;}voidsave(){FILE*fp;

inti;if((fp=fopen("c:\stu_list","wb"))==NULL){printf("cannotopenfile\n");

exit(0);}for(i=0;i<SIZE;i++)if(fwrite(&stud[i],sizeof(struct

student_type),1,fp)!=1)

printf("filewriteerror\n");

fclose(fp);}voiddisplay(){FILE*fp;

inti;if((fp=fopen("c:\stu_list","rb"))==NULL){printf("cannotopenfile\n"); exit(0);}for(i=0;i<SIZE;i++){fread(&stud[i],sizeof(struct

student_type),1,fp);

printf("%-10s%4d%4d%-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);}

fclose(fp);}zhang100119room-101fun100220room-102tan100321room-103ling100421room-1045、格式化讀/寫函數(shù)

格式化寫函數(shù)fprint()函數(shù)首部

int

fprintf(FILE*fp,char*format[,argument…])功能:將argument的值以format指定的格式寫入fp所指向的文件。返回值:若正確寫入數(shù)據(jù),則返回實(shí)際輸出字符的個(gè)數(shù);否則,返回值是負(fù)數(shù)。格式化讀函數(shù)fscanf()函數(shù)首部int

fscanf(FILE*fp,char*format[,argument…])功能:根據(jù)format指定的格式從fp所指向文件中讀入數(shù)據(jù)保存至argument所指向的內(nèi)存單元。返回值:若正確讀入數(shù)據(jù),則返回值是已讀入的數(shù)據(jù)個(gè)數(shù);否則,返回值是EOF。例fscanf(fp,"%d%f",&i,&f);

//若文件中有3,4.5,則將3送入i,4.5送入t

fprintf(fp,"%d,%f",i,t);

//將i和t按%d,%f格式輸出到fp文件10.3文件的讀/寫函數(shù)【例10-3】從鍵盤按格式輸入數(shù)據(jù)存到磁盤文件中去,并回顯到屏幕上。#include<stdio.h>intmain(void){chars[80],c[80];

int

a,b;

FILE*fp;

if((fp=fopen("test","w"))==NULL)

{puts("can'topenfile");exit();}

fscanf(stdin,"%s%d",s,&a);/*鍵盤輸入*/

fprintf(fp,"%s%d",s,a);/*寫入文件*/

fclose(fp);

if((fp=fopen("test","r"))==NULL)

{puts("can'topenfile");exit();}

fscanf(fp,"%s%d",c,&b);/*從文件讀出*/

fprintf(stdout,"%s%d",c,b);/*屏幕顯示*/

fclose(fp);

return0;}

與scanf()和printf()函數(shù)的功能相似,區(qū)別在于fscanf()和fprintf()函數(shù)的操作對(duì)象是指定文件,而scanf()和printf()函數(shù)的操作對(duì)象是標(biāo)準(zhǔn)輸入(stdin)輸出(stdout)文件。例如,int

i=3;floatf=9.80;

fprintf(fp,"%2d,%6.2f",i,f);fprintf()的作用是將變量i按%2d格式、變量f按%6.2f格式,以逗號(hào)作分隔符,輸出到fp所指向的文件中:□3,□□9.80(□表示1個(gè)空格)。5、格式化讀/寫函數(shù)10.3文件的讀/寫函數(shù)文件位置指針:指向當(dāng)前讀寫位置的指針。讀寫方式順序讀寫:位置指針按字節(jié)位置順序移動(dòng)。隨機(jī)讀寫:位置指針按需要移動(dòng)到任意位置。文件指針復(fù)位函數(shù)函數(shù)首部

int

rewind(FILE*fp)功能:將fp所指向文件的位置指針重置到文件開頭,即把文件的位置指針重新定位到fp所指向文件的起始位置。返回值:若執(zhí)行正確,則返回值是0;否則,返回值是非0。10.4文件的定位函數(shù)文件隨機(jī)定

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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)論