C語言程序設計文件程序設計_第1頁
C語言程序設計文件程序設計_第2頁
C語言程序設計文件程序設計_第3頁
C語言程序設計文件程序設計_第4頁
C語言程序設計文件程序設計_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

9.1文件概述9.1.1文件的概念9.1.2文件的分類9.1.3文件的一般操作過程9.1.4文件的指針第1頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第1頁。9.1.1文件的概念文件是計算機中的一個重要概念,通常是指存儲在外部介質(zhì)上的信息的集合。存儲程序代碼的文件稱為程序文件,存儲數(shù)據(jù)的文件稱為數(shù)據(jù)文件。另外,C語言把輸入輸出設備也視為一類特殊的文件。計算機對文件的操作總體上分成輸入和輸出兩大類,對文件的輸人輸出(I/0)過程是通過操作系統(tǒng)進行管理的。C語言程序?qū)ξ募奶幚硎峭ㄟ^標準函數(shù)庫中的文件操作函數(shù)實現(xiàn)的,使用這些函數(shù),可以簡單、高效、安全地訪問外部數(shù)據(jù)。第2頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第2頁。9.1.1文件的概念1.設備文件在C語言中,所有的外部設備均被作為文件對待,這種文件稱為設備文件。對外部設備的輸人輸出處理就是讀寫設備文件的過程。

2.文件緩沖區(qū)在程序的運行過程中,程序要將保存在內(nèi)存中的數(shù)據(jù)寫入磁盤,首先要建立一個“輸出文件緩沖區(qū)”,這個緩沖區(qū)是一個連接計算機內(nèi)存數(shù)據(jù)與外存文件的橋梁,當向文件輸出數(shù)據(jù)時,準備輸出的數(shù)據(jù)先寫入文件緩沖區(qū),等文件緩沖區(qū)填滿后再輸出到文件中。這一過程稱為“寫文件”,是數(shù)據(jù)輸出過程。與“寫文件”過程相對的是要將保存在文件中的數(shù)據(jù)裝入內(nèi)存。首先要建立一個“輸入文件緩沖區(qū)”,當從文件中輸入數(shù)據(jù)時,也是把讀入的數(shù)據(jù)先寫入文件緩沖區(qū),等文件緩沖區(qū)數(shù)據(jù)裝滿之后再整個送給程序。這一過程稱為“讀文件”,是數(shù)據(jù)輸入過程。第3頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第3頁。9.1.1文件的概念使用緩沖區(qū)的文件讀、寫示意圖

第4頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第4頁。9.1.2文件的分類以ASCII碼字符形式存儲的文件稱為文本文件,又叫ASCII文件。例如用高級程序語言編寫的程序文件是文本文件,用Windows“記事本”程序創(chuàng)建的文件也是文本文件。文本文件是一種字符流文件,文本文件的一個字符就是一個字節(jié),因而方便了字符的處理,不過文本文件一般要占用較大的存儲空間。二進制文件是按照數(shù)據(jù)在內(nèi)存中的字節(jié)序列形成的字節(jié)流文件。例如C程序的目標文件(擴展名為obj)和可執(zhí)行文件(擴展名為exe)都是二進制文件。在二進制文件中,字節(jié)信息與實際的數(shù)據(jù)位并不一一對應,因此,若直接顯示二進制文件內(nèi)容時,用戶看到的是一些不能識別的字符。

文本文件

二進制文件第5頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第5頁。9.1.3文件的一般操作過程使用文件的一般步驟打開文件→操作文件→關閉文件打開文件:建立用戶程序與文件的聯(lián)系,系統(tǒng)為文件開辟文件緩沖區(qū)。操作文件:是指對文件的讀、寫、追加和定位操作。讀操作:從文件中讀出數(shù)據(jù),即將文件中的數(shù)據(jù)輸入到計算機內(nèi)存。寫操作:向文件中寫入數(shù)據(jù),即將計算機內(nèi)存中的數(shù)據(jù)輸出到文件。追加操作:將新的數(shù)據(jù)寫到文件原有數(shù)據(jù)的后面。定位操作:移動文件讀寫位置指針。關閉文件:切斷文件與程序的聯(lián)系,將文件緩沖區(qū)的內(nèi)容寫入磁盤,并釋放文件緩沖區(qū)。第6頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第6頁。9.1.4文件的指針文件型指針變量的定義FILE*變量名;例如:FILE*p;注意:由于文件類型FILE在頭文件stdio.h中定義,所以在使用FILE類型前必須先打開stdio.h文件。如果需要對某一個文件進行讀寫操作,必須首先要指定指向它的文件指針。只有通過文件指針,才能調(diào)用相應的文件。當程序需要同時處理多個文件時,則需要說明多個FILE型的指針變量,使它們分別指向多個不同的文件。第7頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第7頁。9.2文件的基本操作9.2.1打開和關閉文件9.2.2最基本的文件讀寫函數(shù)第8頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第8頁。9.2.1打開和關閉文件打開文件操作是使用文件的第一個步驟,而關閉文件操作則是使用文件的最后一個步驟。C語言系統(tǒng)分別使用fopen()函數(shù)和fclose()函數(shù)實現(xiàn)文件的打開和關閉操作。1.文件打開函數(shù)fopen()fopen()函數(shù)用來實現(xiàn)打開文件,它解決如下3個問題:⑴指定要打開的文件名;⑵指定文件的使用方式,如是讀文件還是寫文件等;⑶為打開的文件指定一個指針變量,以便使用這個指針變量對文件進行訪問。fopen()函數(shù)的調(diào)用方式FILE*fp;fp=fopen(文件名,使用文件的方式);例如:fp=("example.txt","r");表示要打開的文件名為example.txt,使用文件的方式是“r”方式,文件指針是fp。第9頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第9頁。9.2.1打開和關閉文件文件使用方式文件使用方式作用r以“只讀”方式打開一個文本文件w以“只寫”方式打開一個文本文件a向文本文件尾增加數(shù)據(jù)rb以“只讀”方式打開一個二進制文件wb以“只寫”方式打開一個二進制文件ab向二進制文件尾增加數(shù)據(jù)r+以“讀/寫”方式打開一個文本文件w+以“讀/寫”方式建立一個新的文本文件a+以“讀/寫/追加”方式打開一個文本文件rb+以“讀/寫”方式打開一個二進制文件wb+以“讀/寫”方式建立一個新的二進制文件ab+以“讀/寫/追加”方式打開一個二進制文件第10頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第10頁。9.2.1打開和關閉文件2.關閉文件函數(shù)fclose()fclose()函數(shù)的一般格式fclose(文件指針);功能關閉“文件指針”所指向的文件,釋放打開文件時使用的結(jié)構體變量,斷開文件指針與文件的聯(lián)系。例如:

fclose(fp);第11頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第11頁。9.2.2最基本的文件讀寫函數(shù)1.fputc()函數(shù)一般形式fputc(ch,fp);功能將字符(ch的值)輸出到fp所指向的文件中。第12頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第12頁。9.2.2最基本的文件讀寫函數(shù)例9-1使用fputc()函數(shù)在屏幕顯示一個字符串。/*programe9-1.c*/

#include<stdio.h>voidmain(){char*p="Thisisaexample.";while(*p!='\0')fputc(*p++,stdout);}設備文件第13頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第13頁。9.2.2最基本的文件讀寫函數(shù)例9-2

把從鍵盤輸入的一個字符串寫入到磁盤文件example.txt中。/*programe9-2.c*/#include<stdio.h>voidmain(){ charch; FILE*fp; fp=fopen("example.txt","w"); printf("Enterastring:"); while((ch=getchar())!='\n')

fputc(ch,fp);

fclose(fp);}

第14頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第14頁。9.2.2最基本的文件讀寫函數(shù)2.fgetc()函數(shù)從指定文件讀入一個字符,該文件必須是以讀或讀寫方式打開的。通常使用如下的形式調(diào)用fgetc()函數(shù)ch=fgetc(fp);其中,fp為文件型指針變量,ch為字符變量。正常情況下fgetc()函數(shù)的返回值是從文件中讀出的一個字符。當打開文件并立即使用fgetc()讀文件時,fgetc()函數(shù)從文件開始位置讀取一個字符。每讀取一個字符后,文件的位置指針后移一個字符位置。若當前讀取的是文本文件,當遇到文件結(jié)束標志時,fgetc()函數(shù)的返回值為EOF。第15頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第15頁。9.2.2最基本的文件讀寫函數(shù)例9-3

使用fgetc()函數(shù)輸出文件example.txt的內(nèi)容。/*programe9-3.c*/#include<stdio.h>voidmain(){ charch; FILE*fp; fp=fopen("example.txt","r"); while((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp);}

第16頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第16頁。9.2.2最基本的文件讀寫函數(shù)例9-4

使用feof()進行文件讀取控制,輸出文件example.txt的內(nèi)容。/*programe9-4.c*/#include<stdio.h>voidmain(){FILE*fp;if((fp=fopen("example.txt","r"))==NULL){printf("filecannotopen!\n");exit(1);}

while(!feof(fp))

putchar(fgetc(fp));fclose(fp);}判斷被讀取的文件是否已經(jīng)讀完。當未遇文件結(jié)束標志時,feof()的值是0,否則feof()的值是1。第17頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第17頁。9.3文件的數(shù)據(jù)塊讀寫操作9.3.1fwrite()函數(shù)9.3.2fread()函數(shù)第18頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第18頁。9.3.1fwrite()函數(shù)fwrite()函數(shù)的功能是把內(nèi)存中的一些數(shù)據(jù)塊寫到指定的文件中。一般調(diào)用形式fwrite(buffer,size,count,fp);其中:fp是接受數(shù)據(jù)的文件指針;buffer是數(shù)據(jù)塊的內(nèi)存首地址,通常是指針變量名、數(shù)組名等;size是一個數(shù)據(jù)塊的字節(jié)數(shù)(即數(shù)據(jù)塊的大小);count是執(zhí)行一次fwrite()函數(shù)從內(nèi)存輸出到fp文件的數(shù)據(jù)塊數(shù)目。第19頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第19頁。9.3.1fwrite()函數(shù)例9-5

從鍵盤上輸入一批學生數(shù)據(jù),然后以“stu_list”文件名存儲到磁盤上。/*programe9-5.c*/#include<stdio.h>#defineN4structstudent_type{charname[10];intnum;intscore;}stud;voidmain(){ inti; FILE*fp; if((fp=fopen("stu_list","wb"))==NULL) { printf("Cannotopenfile\n"); exit(1); } printf("Inputdata,please!\n"); for(i=0;i<N;i++) {scanf("%s%d%d",,&stud.num,&stud.score);

fwrite(&stud,sizeof(structstudent_type),1,fp); } fclose(fp); printf("Allright.\n");}第20頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第20頁。9.3.2fread()函數(shù)fread()函數(shù)把指定文件中的一個數(shù)據(jù)塊讀到內(nèi)存中。一般調(diào)用形式fread(buffer,size,count,fp);其中:fp是讀取數(shù)據(jù)的文件指針;buffer是接受文件數(shù)據(jù)的內(nèi)存首地址,通常是指針變量名、數(shù)組名等;size是一個數(shù)據(jù)塊的字節(jié)數(shù)(即數(shù)據(jù)塊的大小);count是執(zhí)行一次fread()函數(shù)讀取的數(shù)據(jù)塊的數(shù)目。例9-6

將上述stu_list文件的內(nèi)容顯示在屏幕上。/*programe9-6-1.c*/#include<stdio.h>#defineN4structstudent_type{ charname[10]; intnum; intscore;}stud;voidmain(){ inti; FILE*fp; if((fp=fopen("stu_list","rb"))==NULL) { printf("Cannotopenfile.\n"); exit(1); } for(i=0;i<N;i++) { fread(&stud,sizeof(structstudent_type),1,fp); printf("%-10s%4d%4d\n",,stud.num,stud.score); } fclose(fp);}第21頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第21頁。9.3.2fread()函數(shù)再如,設有如下定義:structstudent_type{charname[10];intnum;intage;}stud[40];其中,結(jié)構體數(shù)組stud的每一個元素用來存放一個學生的有關數(shù)據(jù),假設學生的數(shù)據(jù)已存放在磁盤文件中,且該文件已打開,并由fp指向,則可以用下面的語句把文件中前40個學生的數(shù)據(jù)輸入到結(jié)構體數(shù)組stud中:for(i=0;i<40;i++)

fread(&stud[i],sizeof(structstudent_type),1,fp);第22頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第22頁。9.4文件的其他操作9.4.1文件的格式化讀寫9.4.2文件的隨機讀寫操作9.4.3ftell()函數(shù)9.4.4文件的字符串操作第23頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第23頁。9.4.1文件的格式化讀寫1.文件的格式化讀操作由fscanf()函數(shù)實現(xiàn),從指定的文件中,按照說明的格式向變量提供數(shù)據(jù)。一般使用格式fscanf(fp,格式字符串,輸入表列);其中fp是文件指針“格式字符串”和“輸入表列”與scanf()函數(shù)的相關內(nèi)容相同。例如:fscanf(fp,“%d”,&m);該語句將磁盤文件中的數(shù)據(jù)送給變量m,其中的磁盤文件由fp指向。第24頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第24頁。9.4.1文件的格式化讀寫2.文件的格式化寫操作由fprintf()函數(shù)實現(xiàn),將指定變量的值按照一定的格式寫到指定的文件中。一般使用格式fprintf(fp,格式字符串,輸出表列);說明:⑴fp是要寫入數(shù)據(jù)的文件指針。⑵“格式字符串”和“輸出表列”與printf()函數(shù)的相關內(nèi)容形同。例如:

fprintf(fp,"%d",m);該語句將整型變量m按%d格式輸出到fp指向的文件中。例9-7從鍵盤輸入一個字符串和一個十進制整數(shù),將它們寫入test文件中,然后再從test文件中讀出并顯示在屏幕上。/*programe9-7.c*/#include<stdio.h>voidmain(){ chars[100]; inta; FILE*fp; if((fp=fopen("test","w"))==NULL) {printf("fileopenerror.\n");exit(0);} fscanf(stdin,"%s%d",s,&a); fprintf(fp,"%s%d",s,a); fclose(fp); if((fp=fopen("test","r"))==NULL) {printf("Cannotopenfile.\n");exit(0);} fscanf(fp,"%s%d",s,&a); fprintf(stdout,"%s%d\n",s,a); fclose(fp);}

第25頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第25頁。9.4.2文件的隨機讀寫操作1.fseek()函數(shù)功能:改變文件位置指針。調(diào)用形式fseek(fp,offset,position);其中:⑴fp為文件型指針;⑵文件位置指針的定位由參數(shù)offset和position共同確定。position規(guī)定指針定位時的基準位置,offset規(guī)定文件位置指針離開基準位置的偏移量,它的單位是字節(jié)。position的值用整常數(shù)表示,取值范圍是0、1、2三個數(shù)之一,其意義如下:0:表示基準位置為文件的開頭位置;1:表示基準位置為文件的當前位置;2:表示基準位置為文件的結(jié)尾位置,該位置在文件內(nèi)容的最后一個字節(jié)之后。第26頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第26頁。9.4.2文件的隨機讀寫操作fseek()函數(shù)調(diào)用的實例:fseek(fp,50L,0);

將位置指針移到文件頭起始第50個字節(jié)處fseek(fp,100L,1);

將位置指針從當前位置向文件尾方向移動100個字節(jié)fseek(fp,-20L,2);將位置指針從文件末尾向文件頭方向移動20個字節(jié)第27頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第27頁。9.4.2文件的隨機讀寫操作例9-8

在例9-6中建立了學生數(shù)據(jù)文件stu_list,將其中第3個學生的成績修改為97。/*programe9-8.c*/#include<stdio.h>structstudent_type{ charname[10]; intnum; intscore;}stud;voidmain(){ inti,size; FILE*fp; size=sizeof(structstudent_type); if((fp=fopen("stu_list","rb+"))==NULL) { printf("fileopenerror.\n"); exit(1); } fseek(fp,2*size,0); fread(&stud,size,1,fp); printf("%s%d%d\n",,stud.num,stud.score); printf("newscore:"); scanf("%d",&stud.score); fseek(fp,-size,1); fwrite(&stud,size,1,fp); fclose(fp);}第28頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第28頁。9.4.2文件的隨機讀寫操作2.rewind()函數(shù)作用:將文件位置指針復位。調(diào)用形式rewind(fp);其中:fp為文件型指針。執(zhí)行rewind()函數(shù)后,對于fp指向的文件,不管當前的文件位置指針在何處,都使它復位到文件的開始位置。第29頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第29頁。9.4.2文件的隨機讀寫操作例9-9

在屏幕上顯示文件e9-6-2.c的內(nèi)容,并將該文件復制為文件e9-6-3.c。#include<stdio.h>voidmain(){ FILE*fp1,*fp2; fp1=fopen("e9-6-2.c","r"); fp2=fopen("e9-6-3.c","w"); while(!feof(fp1)) putchar(fgetc(fp1)); rewind(fp1); while(!feof(fp1)) fputc(fgetc(fp1),fp2); fclose(fp1); fclose(fp2);}第30頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第30頁。9.4.3ftell()函數(shù)ftell()函數(shù)用于獲取文件位置指針,其調(diào)用形式如下:ftell(fp);其中:fp為文件指針。ftell()函數(shù)的返回值是fp所指向文件的當前讀寫位置,該值是一個長整型數(shù),是位置指針從文件開始處到當前位置的位移量的字節(jié)數(shù)。第31頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第31頁。9.4.3ftell()函數(shù)例9-10

新建data.txt文件,檢查文件位置指針值;然后將字符串"Beijing2008"寫入文件中,再檢查文件位置指針的值。#include"stdio.h"main(){FILE*fp;longposition;fp=fopen("data.txt","w");position=ftell(fp);printf("position=%ld\n",position);fprintf(fp,"Beijing2008");

position=ftell(fp);

printf("position=%ld\n",position);fclose(fp);}第32頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第32頁。9.4.4文件的字符串操作1.fgets()函數(shù)一般調(diào)用形式fgets(buffer,n,fp);作用從fp指向的文件中讀取n-1個字符,然后存儲到以buffer為首地址的的內(nèi)存空間中,通常buffer是一個指針變量名、數(shù)組名等。如果在讀入n-1個字符的過程中遇到換行符或EOF,讀入即結(jié)束。字符串讀入后在最后加一個'\0'字符作為字符串結(jié)束標志。第33頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第33頁。9.4.4文件的字符串操作2.fputs()函數(shù)調(diào)用形式fputs(buffer,fp);作用將內(nèi)存buffer中的字符串寫到fp指向的文件中,buffer可以是一個字符串常量,也可以是字符串的首地址。第34頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第34頁。9.4.4文件的字符串操作例9-11

將字符串"VisualC++"和"Visualbasic"依次存入文件text中,然后將第一個字符串讀出并顯示出來。#include<stdio.h>voidmain(){ FILE*fp; charstring[20]; fp=fopen("text","w+"); fputs("VisualC++\n",fp); fputs("Visualbasic\n",fp); rewind(fp); fgets(string,20,fp); puts(string); fclose(fp);}第35頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第35頁。9.5文件應用舉例9.5.1文件復制9.5.2存儲在文件中的學生成績排序第36頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第36頁。9.5.1文件復制例9-12

設計一個程序,實現(xiàn)任意文本文件的復制。問題分析與算法設計⑴由于源文件是任意的,所以源文件名應通過鍵盤輸入;同樣,生成的目標文件名也應由鍵盤輸入。⑵源文件以只讀方式打開,目標文件以寫方式打開。⑶從第一個字符開始,順序逐字符讀出源文件,每讀出一個字符,立即寫入目標文件中,使用feof()函數(shù)判斷源文件的結(jié)束狀態(tài)。實現(xiàn)程序#include<stdio.h>voidmain(){ charch,source[20],target[20]; FILE*fp_s,*fp_t; printf("Enterthesourcefilename:"); scanf("%s",source); printf("Enterthetargetfilename:"); scanf("%s",target); if((fp_s=fopen(source,"r"))==NULL) { printf("Cannotopensourcefile.\n"); exit(1); } if((fp_t=fopen(target,"w"))==NULL) { printf("Cannotopentargetfile.\n"); exit(1); } while(!feof(fp_s)) fputc(fgetc(fp_s),fp_t); fclose(fp_s); fclose(fp_t);}第37頁/共40頁C語言程序設計文件程序設計全文共40頁,當前為第37頁。9.5.2存儲在文件中的學生成績排序例9-13

在例9-5中,我們建立了一個stu_list文件。編寫程序,對該文件的內(nèi)容按照學習成績降序排序后顯示出來。問題分析與算法設計⑴定義structstudent_type類型的結(jié)構體數(shù)組stud

溫馨提示

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

評論

0/150

提交評論