c語(yǔ)言程序中關(guān)于文件的操作_第1頁(yè)
c語(yǔ)言程序中關(guān)于文件的操作_第2頁(yè)
c語(yǔ)言程序中關(guān)于文件的操作_第3頁(yè)
c語(yǔ)言程序中關(guān)于文件的操作_第4頁(yè)
c語(yǔ)言程序中關(guān)于文件的操作_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

1、文件操作函數(shù)C 語(yǔ)言 (FILE fputc fgetc fputs fgets fscanf fprintf)在 ANSI C 中,對(duì)文件的操作分為兩種方式,即流式文件操作和I/O 文件操作,下面就分別介紹之。一、流式文件操作這種方式的文件操作有一個(gè)重要的結(jié)構(gòu)FILE , FILE 在 stdio.h 中定義如下:typedef struct int level; /* fill/empty level of buffer */unsigned flags; /* File status flags */char fd; /* File descriptor */unsigned char

2、hold; /* Ungetc char if no buffer */int bsize; /* Buffer size */unsigned char _FAR *buffer; /* Data transfer buffer */unsigned char _FAR *curp; /* Current active pointer */unsigned istemp; /* Temporary file indicator */short token; /* Used for validity checking */ FILE; /* This is the FILE object */

3、FILE 這個(gè)結(jié)構(gòu)包含了文件操作的基本屬性,對(duì)文件的操作都要通過(guò)這個(gè)結(jié)構(gòu)的指針來(lái)進(jìn)行,此種文件操作常用的函數(shù)見(jiàn)下表 函數(shù) 功能fopen() 打開(kāi)流fclose() 關(guān)閉流fputc() 寫一個(gè)字符到流中fgetc() 從流中讀一個(gè)字符fseek() 在流中定位到指定的字符fputs() 寫字符串到流fgets() 從流中讀一行或指定個(gè)字符fprintf() 按格式輸出到流fscanf() 從流中按格式讀取feof() 到達(dá)文件尾時(shí)返回真值ferror() 發(fā)生錯(cuò)誤時(shí)返回其值rewind() 復(fù)位文件定位器到文件開(kāi)始處remove() 刪除文件fread() 從流中讀指定個(gè)數(shù)的字符fwrite

4、() 向流中寫指定個(gè)數(shù)的字符tmpfile() 生成一個(gè)臨時(shí)文件流tmpnam() 生成一個(gè)唯一的文件名下面就介紹一下這些函數(shù)1.fopen()fopen 的原型是: FILE *fopen(const char *filename,const char *mode) , fopen 實(shí)現(xiàn)三個(gè)功能為使用而打開(kāi)一個(gè)流把一個(gè)文件和此流相連接給此流返回一個(gè)FILR 指針參數(shù) filename 指向要打開(kāi)的文件名, mode 表示打開(kāi)狀態(tài)的字符串,其取值如下表字符串 含義r 以只讀方式打開(kāi)文件w 以只寫方式打開(kāi)文件a 以追加方式打開(kāi)文件r+ 以讀/寫方式打開(kāi)文件,如無(wú)文件出錯(cuò)w+ 以讀/寫方式打開(kāi)文件

5、,如無(wú)文件生成新文件一個(gè)文件可以以文本模式或二進(jìn)制模式打開(kāi),這兩種的區(qū)別是:在文本模式中回車被當(dāng)成一個(gè)字符n ,而二進(jìn)制模式認(rèn)為它是兩個(gè)字符0 x0D,0 x0A ;如果在文件中讀到 0 x1B ,文本模式會(huì)認(rèn)為這是文件結(jié)束符,也就是二進(jìn)制模型不會(huì)對(duì)文件進(jìn)行處理,而文本方式會(huì)按一定的方式對(duì)數(shù)據(jù)作相應(yīng)的轉(zhuǎn)換。系 統(tǒng) 默 認(rèn) 的 是 以 文 本 模 式 打 開(kāi) , 可 以 修 改 全 部 變 量 _fmode 的 值 來(lái) 修 改 這 個(gè) 設(shè) 置 , 例 如 _fmode=O_TEXT ;就設(shè)置默認(rèn)打開(kāi)方式為文本模式;而 _fmode=O_BINARY ;則設(shè)置默認(rèn)打開(kāi)方式是二進(jìn)制 模式。我們也可以

6、在模式字符串中指定打開(kāi)的模式,如 rb”表示以二進(jìn)制模式打開(kāi)只讀文件,w+t或wt+”表示以文本模式打開(kāi)讀/寫文件。此函數(shù)返回一個(gè) FILE指針,所以申明一個(gè) FILE指針后不用初始化,而是用 fopen()來(lái)返回一個(gè)指針并與一個(gè)特定的文件相連,如果成敗,返回 NULL 。 例:FILE *fp;if(fp=fopen(123.456,wb)puts(打開(kāi)文件成功);elseputs(打開(kāi)文件成敗);2.fclose()fclose() 的功能就是關(guān)閉用 fopen() 打開(kāi)的文件,其原型是: int fclose(FILE *fp); 如果成功,返回0,失敗返回EOF。在程序結(jié)束時(shí)一定要記得

7、關(guān)閉打開(kāi)的文件,不然可能會(huì)造成數(shù)據(jù)丟失的情況,我以前就經(jīng)常犯這樣的毛病。例: fclose(fp);3.fputc()向流寫一個(gè)字符,原型是int fputc(int c, FILE *stream); 成功返回這個(gè)字符,失敗返回EOF。例: fputc(X,fp);4.fgetc()從流中讀一個(gè)字符,原型是int fputc(FILE *stream); 成功返回這個(gè)字符,失敗返回EOF。例: char ch1=fgetc(fp);5. fseek()此函數(shù)一般用于二進(jìn)制模式打開(kāi)的文件中,功能是定位到流中指定的位置,原型是int fseek(FILE*stream, long offset,

8、 int whence); 如果成功返回0 ,參數(shù)offset 是移動(dòng)的字符數(shù), whence 是移動(dòng)的基準(zhǔn),取值是符號(hào)常量 值 基準(zhǔn)位置SEEK_SET 0 文件開(kāi)頭SEEK_CUR 1 當(dāng)前讀寫的位置SEEK_END 2 文件尾部例: fseek(fp,1234L,SEEK_CUR);/ 把讀寫位置從當(dāng)前位置向后移動(dòng)1234 字節(jié) (L 后綴表示長(zhǎng)整數(shù))fseek(fp,0L,2);/ 把讀寫位置移動(dòng)到文件尾6.fputs()寫一個(gè)字符串到流中,原型int fputs(const char *s, FILE *stream);例: fputs(I Love You,fp);7.fgets(

9、)從流中讀一行或指定個(gè)字符,原型是char *fgets(char *s, int n, FILE *stream); 從流中讀取n-1 個(gè)字符,除非讀完一行,參數(shù)s 是來(lái)接收字符串,如果成功則返回 s 的指針,否則返回 NULL 。例:如果一個(gè)文件的當(dāng)前位置的文本如下Love ,I HaveBut 如果用fgets(str1,4,file1);則執(zhí)行后 str1=Lov ,讀取了 4-1=3 個(gè)字符,而如果用fgets(str1,23,file1);則執(zhí)行 str=Love ,I Have ,讀取了一行(不包括行尾的 n) 。8.fprintf()按格式輸入到流,其原型是int fprint

10、f(FILE *stream, const char *format, argument, .);其用法和 printf() 相同,不過(guò)不是寫到控制臺(tái),而是寫到流罷了例: fprintf(fp,%2d%s,4,Hahaha);9.fscanf()從流中按格式讀取,其原型是int fscanf(FILE *stream, const char *format, address, .); 其用法和 scanf() 相同,不過(guò)不是從控制臺(tái)讀取,而是從流讀取罷了。例: fscanf(fp,%d%d ,&x,&y);10.feof()檢測(cè)是否已到文件尾,是返回真,否則返回 0,其原型是int feof(

11、FILE *stream);例: if(feof(fp)printf( 已到文件尾);11.ferror()原型是 int ferror(FILE *stream); 返回流最近的錯(cuò)誤代碼,可用 clearerr() 來(lái)清除它, clearerr() 的原型是 voidclearerr(FILE *stream);例: printf(%d,ferror(fp);12.rewind()把 當(dāng) 前 的 讀 寫 位 置 回 到 文 件 開(kāi) 始 , 原 型 是 void rewind(FILE *stream); 其 實(shí) 本 函 數(shù) 相 當(dāng) 于 fseek(fp,0L,SEEK_SET);例: rew

12、ind(fp);12.remove()刪除文件,原型是int remove(const char *filename); 參數(shù)就是要?jiǎng)h除的文件名,成功返回 0。例: remove(c:io.sys);13.fread()從流中讀指定個(gè)數(shù)的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream); 參數(shù) ptr 是保存讀取的數(shù)據(jù), void* 的指針可用任何類型的指針來(lái)替換,如 char* 、 int * 等等來(lái)替換; size 是每塊的字節(jié)數(shù); n 是讀取的塊數(shù),如果成功,返回實(shí)際讀取的塊數(shù)(不是字節(jié)數(shù)),本函數(shù)一般用

13、于二進(jìn)制模式打開(kāi)的文件中。例:char x4230;FILE *file1=fopen(c:msdos.sys,r);fread(x,200,12 ,file1);/ 共讀取 200*12=2400 個(gè)字節(jié)14.fwrite()與 fread 對(duì)應(yīng),向流中寫指定的數(shù)據(jù),原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);參數(shù) ptr 是要寫入的數(shù)據(jù)指針, void* 的指針可用任何類型的指針來(lái)替換,如 char* 、 int *等等來(lái)替換; size 是每塊的字節(jié)數(shù); n 是要寫的塊數(shù),如果成功,返回實(shí)際

14、寫入的塊數(shù)(不是字節(jié)數(shù) ) ,本函數(shù)一般用于二進(jìn)制模式打開(kāi)的文件中。例:char x=I Love You;fwire(x, 6,12,fp);/ 寫入 6*12=72 字節(jié)將把 I Love 寫到流 fp 中 12 次,共 72 字節(jié)15.tmpfile()其原型是 FILE *tmpfile(void); 生成一個(gè)臨時(shí)文件,以w+b 的模式打開(kāi),并返回這個(gè)臨時(shí)流的指針,如果失敗返回 NULL 。在程序結(jié)束時(shí),這個(gè)文件會(huì)被自動(dòng)刪除。例: FILE *fp=tmpfile();16.tmpnam();其原型為char *tmpnam(char *s);生成一個(gè)唯一的文件名,其實(shí) tmpfile

15、()就調(diào)用了此函數(shù),參數(shù) s用來(lái)保存得到的文件名,并返回這個(gè)指針,如果失敗,返回 NULL 。例: tmpnam(str1);二、直接 I/O 文件操作這是 C 提供的另一種文件操作,它是通過(guò)直接存/取文件來(lái)完成對(duì)文件的處理,而上篇所說(shuō)流式文件操作是通過(guò)緩沖區(qū)來(lái)進(jìn)行;流式文件操作是圍繞一個(gè)FILE 指針來(lái)進(jìn)行,而此類文件操作是圍繞一個(gè)文件的“句柄”來(lái)進(jìn)行,什么是句柄呢?它是一個(gè)整數(shù),是系統(tǒng)用來(lái)標(biāo)識(shí)一個(gè)文件(在 WINDOWS 中,句柄的概念擴(kuò)展到所有設(shè)備資源的標(biāo)識(shí))的唯一的記號(hào)。此類文件操作常用的函數(shù)如下表,這些函數(shù)及其所用的一些符號(hào)在io.h 和 fcntl.h 中定義,在使用時(shí)要加入相應(yīng)的

16、頭文件。函數(shù) 說(shuō)明open() 打開(kāi)一個(gè)文件并返回它的句柄close() 關(guān)閉一個(gè)句柄lseek() 定位到文件的指定位置read() 塊讀文件write() 塊寫文件eof() 測(cè)試文件是否結(jié)束filelength() 取得文件長(zhǎng)度rename() 重命名文件chsize() 改變文件長(zhǎng)度下面就對(duì)這些函數(shù)一一說(shuō)明:1.open()打開(kāi)一個(gè)文件并返回它的句柄,如果失敗,將返回一個(gè)小于0 的值,原型是int open(const char *path, intaccess , unsigned mode);參數(shù)path是要打開(kāi)的文件名,access是打開(kāi)的模式,mode是可選項(xiàng)。表示文件的屬性,

17、主要用于UNIX 系統(tǒng)中,在DOS/WINDOWS 這個(gè)參數(shù)沒(méi)有意義。其中文件的打開(kāi)模式如下表。符號(hào) 含義 符號(hào) 含義 符號(hào) 含義O_RDONLY 只讀方式 O_WRONLY 只寫方式 O_RDWR 讀 /寫方式O_NDELAY 用于 UNIX 系統(tǒng) O_APPEND 追加方式 O_CREAT 如果文件不存在就創(chuàng)建O_TRUNC 把文件長(zhǎng)度截為 0 O_EXCL 和 O_CREAT 連用,如果文件存在返回錯(cuò)誤O_BINARY 二進(jìn)制方式O_TEXT 文本方式對(duì)于多個(gè)要求,可以用 |運(yùn)算符來(lái)連接,如 O_APPEND|O_TEXT 表示以文本模式和追加方式打開(kāi)文 件。例: int handle=

18、open(c:msdos.sys,O_BINARY|O_CREAT|O_WRITE)2.close()關(guān)閉一個(gè)句柄,原型是int close(int handle); 如果成功返回 0例: close(handle)3.lseek()定位到指定的位置,原型是: long lseek(int handle, long offset, int fromwhere); 參數(shù) offset 是移動(dòng)的量,fromwhere是移動(dòng)的基準(zhǔn)位置,取值和前面講的fseek()一樣,SEEK_SET :文件首部;SEEK_CUR :文件當(dāng)前位置; SEEK_END :文件尾。此函數(shù)返回執(zhí)行后文件新的存取位置。例:

19、lseek(handle,-1234L,SEEK_CUR);/ 把存取位置從當(dāng)前位置向前移動(dòng)1234 個(gè)字節(jié)。x=lseek(hnd1,0L,SEEK_END);/把存取位置移動(dòng)到文件尾,x=文件尾的位置即文件長(zhǎng)度.read()從文件讀取一塊,原型是int read(int handle, void *buf, unsigned len); 參數(shù) buf 保存讀出的數(shù)據(jù), len 是讀取的字節(jié)。函數(shù)返回實(shí)際讀出的字節(jié)。例: char x200;read(hnd1,x,200);.write()寫一塊數(shù)據(jù)到文件中,原型是int write(int handle, void *buf, unsigned len); 參數(shù)的含義同read() ,返回實(shí)際寫入的字節(jié)。例: char x=I Love You;write(handle,x,strlen(x);.eof()類似 feof() ,測(cè)試文件是否結(jié)束,是返回1,否則返回0;原型是: int eof(int handle);例:while(!eof(handle1) ;.filelength()返回文件長(zhǎng)度,原型是long filelength(int handle); 相當(dāng)于 lseek(handle,0L,SEEK_END)例: long x=filelength(handle);

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論