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

下載本文檔

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

文檔簡(jiǎn)介

第12章文件12.1文件概述12.2文件的打開與關(guān)閉12.3文件的讀寫操作12.4位置指針與文件定位12.1文件概述1.文件的分類文件可以從不同的角度進(jìn)行分類:(1)根據(jù)文件的內(nèi)容來分:可分為源程序文件、目標(biāo)文件、可執(zhí)行文件和數(shù)據(jù)文件等。(2)根據(jù)文件的組織形式來分:可分為順序存取文件和隨機(jī)存取文件。(3)根據(jù)文件的存儲(chǔ)形式來分:可分為ASCⅡ碼文件(又稱文本文件)和二進(jìn)制文件。他的每一個(gè)字節(jié)存儲(chǔ)一個(gè)ASCⅡ碼(代表1個(gè)字符)。二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù),原樣輸出到磁盤文件中。下一頁返回12.1文件概述2.讀文件與寫文件所謂讀文件是指,將磁盤文件中的數(shù)據(jù)傳送到計(jì)算機(jī)內(nèi)存的操作。所謂寫文件是指,從計(jì)算機(jī)內(nèi)存向盤文件中傳送數(shù)據(jù)的操作。如圖12-2所示。3.文件類型系統(tǒng)給每個(gè)打開的文件都在內(nèi)存中開辟一個(gè)區(qū)域,用于存放文件的有關(guān)信息(如文件名、文件位置等)。這些信息保存在一個(gè)結(jié)構(gòu)類型變量中,該結(jié)構(gòu)類型由系統(tǒng)定義,取名為FILE(注意:“FILE”必須大寫)。并放在<stdio.h>頭文件中。上一頁下一頁返回12.1文件概述4.緩沖文件系統(tǒng)(標(biāo)準(zhǔn)I/O)

所謂緩沖文件系統(tǒng)是指,系統(tǒng)自動(dòng)地在內(nèi)存區(qū)為每個(gè)正在使用的文件開辟一個(gè)緩沖區(qū)。從磁盤文件向內(nèi)存讀入數(shù)據(jù)時(shí),首先將一批數(shù)據(jù)讀入到文件緩沖區(qū)中,再從文件緩沖區(qū)將數(shù)據(jù)逐個(gè)送到程序數(shù)據(jù)區(qū)。如圖12-3所示。從內(nèi)存向磁盤輸出數(shù)據(jù)時(shí),則正好相反;必須先將一批數(shù)據(jù)輸出到緩沖區(qū)中。待緩沖區(qū)裝滿后,再一起輸出到磁盤文件中。如圖12-4所示。上一頁返回12.2文件的打開與關(guān)閉12.2.1文件的打開(fopen()函數(shù))1.格式:fopen(“文件名”,“操作方式”);(1)“文件名”是指要打開(或創(chuàng)建)的文件名。如果使用字符數(shù)組(或字符指針),則不使用雙引號(hào)。(2)“操作方式”如表12-1所示。2.功能:返回一個(gè)指向指定文件的指針。下一頁返回12.2文件的打開與關(guān)閉3.說明(1)如果不能實(shí)現(xiàn)打開指定文件的操作,則fopen()函數(shù)返回一個(gè)空指針NULL(其值在頭文件stdio.h中被定為0)。常用下面的方法打開一個(gè)文件:

if((p=fopen(“文件名”,”操作方式’))==NULL){printf(“cannotopenthisfile\n”);exit(0);/*關(guān)閉打開的所有文件,程序結(jié)束運(yùn)行,返回操作系統(tǒng)*/}上一頁下一頁返回12.2文件的打開與關(guān)閉(2)“r(b)+”與“a(b)+”的區(qū)別:使用前者打開文件時(shí),讀寫指針指向文件頭;使用后者時(shí),讀寫指針指向文件尾。(3)使用文本文件向計(jì)算機(jī)系統(tǒng)輸入數(shù)據(jù)時(shí),系統(tǒng)自動(dòng)將回車換行符轉(zhuǎn)換成一個(gè)換行符;在輸出時(shí),將換行符轉(zhuǎn)換成回車和換行兩個(gè)字符。使用二進(jìn)制文件時(shí),內(nèi)存中的數(shù)據(jù)形式與數(shù)據(jù)文件中的形式完全一樣,就不再進(jìn)行轉(zhuǎn)換。(4)有些C編譯系統(tǒng),可能并不完全提供上述對(duì)文件的操作方式,或采用的表示符號(hào)不同,請(qǐng)注意所使用系統(tǒng)的規(guī)定。上一頁下一頁返回12.2文件的打開與關(guān)閉(5)在程序開始運(yùn)行時(shí),系統(tǒng)自動(dòng)打開三個(gè)標(biāo)準(zhǔn)文件,并分別定義了文件指針:

1)標(biāo)準(zhǔn)輸入文件——stdin:指向終端輸入(一般為鍵盤)。如果程序中指定要從stdin所指的文件輸入數(shù)據(jù),就是從終端鍵盤上輸入數(shù)據(jù)。

2)標(biāo)準(zhǔn)輸出文件——stdout:指向終端輸出(一般為顯示器)。

3)標(biāo)準(zhǔn)錯(cuò)誤文件——stderr:指向終端標(biāo)準(zhǔn)錯(cuò)誤輸出(一般為顯示器)。上一頁下一頁返回12.2文件的打開與關(guān)閉12.2.2文件的關(guān)閉(fclose()函數(shù))在使用完一個(gè)文件后,為防止被誤用或數(shù)據(jù)丟失,應(yīng)該及時(shí)關(guān)閉。(1)用法:fclose(文件指針);(2)功能:關(guān)閉“文件指針“所指向的文件。如果正常關(guān)閉了文件,則函數(shù)返回值為0;否則,返回值為非0。例如,fclose(fp);/*關(guān)閉fp所指向的文件*/上一頁返回12.3文件的讀寫操作12.3.1讀/寫文件中的一個(gè)字符——fgets()和fputs()函數(shù)1.將一個(gè)字符寫到文件中——fputc()函數(shù)#include”stdio.h”main(int

argc,char*argv[]){FILE*fp;charch;

if(argc!=2)/*參數(shù)個(gè)數(shù)不對(duì)*/{printf(“thenumberofargumentsnotcorrect\n\n”);

prinft(“Usage:可執(zhí)行文件名filename\n”);exit(0);}下一頁返回12.3文件的讀寫操作

if((fp=fopen(argv[1],”w”))==NULL)/*打開文件失敗*/{printf(“cannotopenthisfile\n”);exit(0)

}for(;(ch=getcher())!=’@’;)fputc(ch,fp);/*輸入字符并存儲(chǔ)到文件中*/

fclose(fp):/*關(guān)閉文件*/}

程序運(yùn)行準(zhǔn)備:在Options|Arguments文本框中,輸入文件名“temp.txt”。注:只要符合文件命名規(guī)則,讀者完全可以根據(jù)自己的習(xí)慣或愛好,給文件另外命名。程序運(yùn)行情況:

abcdefg1234567@←┘上一頁下一頁返回12.3文件的讀寫操作2.從文件中讀入一個(gè)字符——fgetc()函數(shù)和feof()函數(shù)【例12.2】順序顯示【例12.1】創(chuàng)建的ASCⅡ碼文件。#include”stdio.h”main(int

argc,char*argv[]){FILE*fp;charch;

if(argc!=2)/*參數(shù)個(gè)數(shù)不對(duì)*/{printf(“thenumberofargumentsnotcorrect\n”);上一頁下一頁返回12.3文件的讀寫操作

printf(“\nUsage:可執(zhí)行文件名sourcefile”)exit(0)}if((fp=fopen(argv[1],”r”))==NULL)/*打開源文件失敗*/{printf(“cannotopensourcefile\n”);exit(0)}/*順序輸出文件的內(nèi)容*/for(;(ch=fgect(fp))!=EOF;)putchar(ch);/*順序讀入并顯示*/

fclose(fp);/*關(guān)閉打開的文件*/}上一頁下一頁返回12.3文件的讀寫操作程序運(yùn)行準(zhǔn)備:在Options|Arguments文本框中,輸入文件名“temp.txt”。程序運(yùn)行情況:

abcdefg1234567@←┘程序說明:for(;(ch=fgetc(fp))!=EOF;)putchar(ch);語句(1)循環(huán)語句中的庫函數(shù)fgetc()

1)用法:int

fgetc(文件指針);

2)功能:從“文件指針”所指向的文件中,讀入一個(gè)字符,同時(shí)將讀寫位置指針向前移動(dòng)1個(gè)字節(jié)(即指向下一個(gè)字符)。該函數(shù)無出錯(cuò)返回值。上一頁下一頁返回12.3文件的讀寫操作12.3.2讀/寫一個(gè)字符串——fgetc()函數(shù)和fputs()函數(shù)【例12.4】將鍵盤上輸入的一個(gè)長(zhǎng)度不超過80的字符串,以ASCⅡ碼形式存儲(chǔ)到一個(gè)磁盤文件中;然后再輸出到屏幕上。

/*程序功能:從鍵盤上輸入一個(gè)字符串,存儲(chǔ)到一個(gè)磁盤文件中、并顯示輸出*//*參數(shù):帶參主函數(shù),使用格式:可執(zhí)行文件名要?jiǎng)?chuàng)建的磁盤文件名*/上一頁下一頁返回12.3文件的讀寫操作#include”stdio.h”main(int

argc,char*argv[]){FILE*fp;/*文件類型名“FILE”,必須大寫*/charstring[81];/*字符數(shù)組用于暫存輸入輸出的字符串*/

if(argc>2)/*參數(shù)太多,提示出錯(cuò)*/{printf(“Toomanyparamenters…\n\n”);exit(0);}

if(argc==1)/*缺磁盤文件名,提示輸入*/{printf(“Inputthefilename:”);上一頁下一頁返回12.3文件的讀寫操作

gets(string);/*借用string數(shù)組暫存輸入的文件名*/argv[1]=(char*)malloc(strlen(string)+1);/*給文件名參數(shù)申請(qǐng)內(nèi)存空間*/strcpy(argv[1],string);/*復(fù)制文件名到形參中*/}if((fp=fopen(argv[1],”w”))==NULL)/*打開文件失敗*/{printf(“cannotopenthisfile\n”);exit(0)}/*從鍵盤上輸入字符串,并存儲(chǔ)到指定文件中*/上一頁下一頁返回12.3文件的讀寫操作

printf(“Inputastring:“);gets(string);/*從鍵盤上輸入到字符串*/

fputs(string,fp);/*存儲(chǔ)到指定文件*/

fclose(fp);/*重新打開文件,讀出其中的字符串,并輸出到屏幕上*/if((fp=fopen(argv[1],”r”))==NULL)/*打開文件失敗*/{printf(“cannotopenthisfile\n”);exit(0);}fgets(string,strlen(string)+1,fp);/*從文件中讀出一個(gè)字符串*/printf(“Outputthestring:“);puts(string);/*將字符串輸出到屏幕上*/fclose(fp);}上一頁下一頁返回12.3文件的讀寫操作程序說明:(1)基本思路為增強(qiáng)程序的可靠性,程序中對(duì)參數(shù)過多的情況,提示出錯(cuò)、并終止程序運(yùn)行(當(dāng)然,也可以取第1個(gè)參數(shù)作為文件名,忽略多余的);而遺漏文件名時(shí),提示用戶輸入。同時(shí),為增強(qiáng)程序的人機(jī)交互性,凡是需要用戶輸入數(shù)據(jù)的地方,都設(shè)置提示輸入的信息;凡是輸出數(shù)據(jù)的地方,都設(shè)置輸出說明信息。一言以蔽之,程序設(shè)計(jì)的最高境界就是,一切為用戶著想!請(qǐng)讀者仔細(xì)體會(huì)。(2)缺磁盤文件名時(shí)的鍵盤輸入上一頁下一頁返回12.3文件的讀寫操作(3)fputs(str-in,fp);語句中的庫函數(shù)fputs()——向指定文件輸出一個(gè)字符串(4)fgets(str-out,strlen(str-in)+1,fp);語句中的庫函數(shù)fgets()——從文件中讀一個(gè)字符串(5)fgets()、fputs()函數(shù)與gets()、puts()函數(shù)比較。上一頁下一頁返回12.3文件的讀寫操作12.3.3讀/寫一個(gè)數(shù)據(jù)塊——fread()和fwrite()函數(shù)

fgetc()和fwrite()函數(shù)一次只能讀/寫的1個(gè)字節(jié)數(shù)據(jù),但實(shí)際應(yīng)用中卻常常要求1次讀/寫1個(gè)數(shù)據(jù)塊(連續(xù)的若干字節(jié))。為此,ANSIC標(biāo)準(zhǔn)設(shè)置了fread()和fwrite()函數(shù)。(1)用法:int

fread(void*buffer,intsize,intcount,FILE*fp);

int

fwrite(void*bu

ffer,intsize,intcount,FILE*fp);上一頁下一頁返回12.3文件的讀寫操作(2)功能:

fread()\——從fp所指向文件的當(dāng)前位置開始,一次讀入size個(gè)字節(jié),重復(fù)count次,并將讀入的數(shù)據(jù)存放到從buffer開始的內(nèi)存中;同時(shí)將讀寫位置指針向前移動(dòng)size*count個(gè)字節(jié)。其中,buffer是存放讀入數(shù)據(jù)的起始地址(即存放何處)。

fwrite()——從buffer開始,一次輸入size個(gè)字節(jié),重復(fù)count次,并將輸出的數(shù)據(jù)存放到fp所指向的文件中;同時(shí),將讀寫位置指針向前移動(dòng)size*count個(gè)字節(jié)。其中,buffer是要輸出數(shù)據(jù)在內(nèi)存中的起始地址(即從何處開始輸出)。如果調(diào)用fread()或fwrite()成功,則函數(shù)返回值等于count。

fread()和fwrite()函數(shù)一般用于二進(jìn)制文件的處理。上一頁下一頁返回12.3文件的讀寫操作12.3.4對(duì)文件進(jìn)行格式化讀/寫——fscanf()和fprintf()函數(shù)與scanf()和printf()函數(shù)的功能相似,它們都是格式化輸入輸出函數(shù),區(qū)別在于:fscanf()和fprintf()函數(shù)的操作對(duì)象是指定文件,而scanf()和printf()函數(shù)的操作對(duì)象是標(biāo)準(zhǔn)輸入(stdin)輸出(stdout)文件。

fscanf()和fprintf()函數(shù)的用法如下:

int

fscanf(文件指針,“格式符”,輸入變量首地址表);

int

fprintf(文件指針,“格式符”,輸入?yún)⒘勘恚簧弦豁撓乱豁摲祷?2.3文件的讀寫操作12.3.4讀/寫函數(shù)的選用原則從功能角度來說,fscanf()和fprintf()函數(shù)可以完成文件的任何數(shù)據(jù)讀/寫操作。但為方便起見,依下列原則選用:讀/寫一個(gè)字符(或字節(jié))數(shù)據(jù)時(shí):選用fgetc()函數(shù)和fputs()函數(shù)。讀/寫一個(gè)字符串時(shí):選用fgets()和fputs()函數(shù)。讀/寫一個(gè)(或多個(gè))不含格式的數(shù)據(jù)時(shí):選用fread()和fwrite()函數(shù)。讀/寫一個(gè)(或多個(gè))含格式的數(shù)據(jù)時(shí):選用fscanf()和fprintf()函數(shù)。上一頁返回12.4位置指針與文件定位1.位置指針復(fù)位函數(shù)rewind()用法:intrewind(文件指

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論