C語言第9章文件【皓月】_第1頁
C語言第9章文件【皓月】_第2頁
C語言第9章文件【皓月】_第3頁
C語言第9章文件【皓月】_第4頁
C語言第9章文件【皓月】_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計第9章文件煙臺大學計算機學院軟件教研室本章要點C文件的概念文件類型及文件指針文件的打開和關(guān)閉文件的讀寫其它和文件有關(guān)的庫函數(shù)29.1C文件的概念所謂文件(file),是指存儲在外部存儲介質(zhì)(外存)上的數(shù)據(jù)集合。這些數(shù)據(jù)經(jīng)過分類、整理后被分“塊”存儲在外存中。每一塊便稱為一個“文件”。在其中可以存放彼此相關(guān)的數(shù)據(jù),如一篇文章、一幅圖像、一段錄音、一段程序、一組人員的信息等。組成操作系統(tǒng)是以文件為單位對數(shù)據(jù)進行管理的。在操作系統(tǒng)中,每個文件都通過唯一的“文件標識”(FileIdentifier)來定位。一個文件標識由兩部分:文件所在路徑和文件名。39.1.2磁盤文件的打開與關(guān)閉由于程序只能處理內(nèi)存中的數(shù)據(jù),不能直接處理磁盤中的數(shù)據(jù)。只有把磁盤文件中的數(shù)據(jù)讀取到內(nèi)存中,才能對數(shù)據(jù)進行修改。修改后再存回到磁盤上,才能保證文件中的數(shù)據(jù)得到修改。通常把從磁盤文件中讀取數(shù)據(jù)到內(nèi)存稱為“文件的打開”;把內(nèi)存中的數(shù)據(jù)存回到磁盤文件稱為“文件的關(guān)閉”。因此,對文件的操作必須先打開,使用后再關(guān)閉。49.1.3文件緩沖區(qū)

程序在讀寫文件的數(shù)據(jù)時,系統(tǒng)并不是只對處理的那個數(shù)據(jù)進行讀寫,而是一次讀寫一批數(shù)據(jù)存放在內(nèi)存的某個區(qū)域中。這樣做的目的是加快讀寫磁盤文件的速度。這個內(nèi)存區(qū)域,稱為“文件緩沖區(qū)”。C語言規(guī)定,緩沖文件系統(tǒng)是系統(tǒng)自動設(shè)定的,隨著一個文件的打開,自動設(shè)置一個區(qū)域作為這個文件的“緩沖區(qū)”。59.14

磁盤文件分類磁盤文件分兩類:一類按文件的數(shù)據(jù)格式分類;另一類按文件的讀寫方式分類。1、按數(shù)據(jù)格式分類文本文件與二進制文件c語言把文件看作是一個字符的序列。根據(jù)數(shù)據(jù)的組成形式ASCII文件:又稱文本文件(text),每個字節(jié)存放一個ASCII代碼,代表一個字符。二進制文件:二進制文件中的數(shù)據(jù)都是按其二進制方式存放的。區(qū)別:以二進制形式存儲數(shù)據(jù)要比以ASCII形式節(jié)省空間。6例如一個整型數(shù)據(jù)-1234在二進制文件中只占2個字節(jié),一個單精度型數(shù)據(jù)-12.34在二進制文件中要占4個字節(jié)。文本文件中數(shù)據(jù)都是將其轉(zhuǎn)換成對應的ASCⅡ代碼字符來存放的。例如一個整型數(shù)據(jù)-1234在文本文件中要占5個字節(jié),依次存放表示"-1234"的5個字符:’-’、’1’、’2’、’3’、’4’;一個單精度型數(shù)據(jù)-12.34在文本文件中要占6個字節(jié),依次存放表示"-12.34"的6個字符:’-’、’1’、’2’、’.’、’3’、’4’。7整數(shù)10000的兩種存儲方式82、按讀寫方式分類按讀寫方式可以把文件分為:順序文件和隨機文件順序文件:讀寫必須從頭開始,即只能從第一個數(shù)據(jù)開始讀取。隨機文件:讀寫的過程是隨機的。99.2文件類型及文件指針文件類型指針的定義C語言中,在對某個文件進行讀寫等操作之前,必須先在內(nèi)存中開辟一個區(qū)域,用來存放與該文件有關(guān)的一些信息,這些信息保存在一個FILE類型的結(jié)構(gòu)變量之中。10結(jié)構(gòu)類型名FILE:存放文件的有關(guān)信息,通常在stdio.h中如下定義數(shù)據(jù)類型FILE:

typedef

struct

{int_fd_; /*文件描述符*/

int_cleft; /*緩沖區(qū)中剩下的字符*/

int_mode; /*文件操作模式*/

char*_nexto; /*下一個字符位置*/

char*_buff; /*文件緩沖區(qū)位置*/}FILE;可以直接使用這個用戶自定義的類型名FILE來定義結(jié)構(gòu)型的指針變量。文件型指針的格式為:FILE*文件型指針名例如:FILE*fp1;FILE*fp[5];119.2.3文件的打開和關(guān)閉對文件讀寫之前:打開文件;對文件進行讀寫;在使用結(jié)束:關(guān)閉文件。打開文件要有三件事通知系統(tǒng):打算訪問的文件名;怎樣使用那個文件;到什么地方去找該文件的有關(guān)信息。12C規(guī)定了標準輸入輸出函數(shù)庫。用fopen()函數(shù)來實現(xiàn)打開文件。fopen函數(shù)的調(diào)用方式為:

FILE*fp;(文件類型的指針)

fp=fopen(文件名,文件存取方式);例如:

FILE*fp;

fp=fopen(“FILE1”,“w”);9.2.3文件的打開和關(guān)閉139.2.3文件的打開和關(guān)閉打開文件函數(shù)fopen()fopen的說明形式為:

FILE*fopen(char*filename,char*mode)

參數(shù)filename是一個字符串,用來指明要打開文件的文件標識(包括文件所在路徑和文件名)。參數(shù)mode也是一個字符串,用來指明要打開文件的使用方式。例如:以只讀方式打開文件“c:\turboc3\file1”。

FILE*fp;

fp=fopen("c:\turboc3\file1","r");

14文件存取方式:“r”

(只讀read)打開一個已存在的文本文件,只能讀取數(shù)據(jù)“w”

(只寫write)打開一個文本文件,只能寫入數(shù)據(jù)“a”

(追加append)打開一個已存在的文本文件,只能寫入數(shù)據(jù)并且追加在文件尾部“r+”

(讀寫)為讀/寫打開一個文本文件“w+”

(讀寫)為讀/寫建立一個新的文本文件“a+”

(讀寫)為讀/寫打開一個文本文件,追加數(shù)據(jù)在文件尾部“rb”

(只讀)打開一個已存在二進制的文件,只能讀取數(shù)據(jù)?!皐b” (只寫)打開一個二進制的文件,只能寫入數(shù)據(jù)?!癮b”

(追加)打開一個已存在二進制的文件,只能寫入數(shù)據(jù)并且追加在文件尾部?!皉b+”

(讀寫)為讀/寫打開一個二進制文件“wb+”

(讀寫)為讀/寫建立一個新的二進制文件“ab+”

(讀寫)為讀/寫打開一個二進制文件)15說明:如果不能實現(xiàn)“打開”的任務(wù),fopen函數(shù)將會帶回一個出錯信息,此時fopen函數(shù)將帶回一個空指針NULL。一種常用的打開文件的方法:

if((fp=fopen(“file1”,“r”))==NULL){printf(“Cannotopenthisfile\n”);exit(0);}/*使用exit(0)中止程序運行*/對C語言的語句fp=fopen("test.dat","rb")

中的rb的含義是:打開一個已存在二進制的文件,只能讀取數(shù)據(jù)。

9.2.3文件的打開和關(guān)閉16關(guān)閉文件函數(shù)fclose函數(shù)的功能fclose函數(shù):關(guān)閉文件,文件處理即告結(jié)束,并釋放所有與之有關(guān)的資源。如果已經(jīng)對該文件進行了寫操作,在文件關(guān)閉前把緩沖區(qū)中的數(shù)據(jù)自動寫回到該文件中,釋放緩沖區(qū)。調(diào)用fclose函數(shù):fclose(文件指針);例如:fclose(fp);fclose函數(shù)也帶回一個值:當順利地執(zhí)行了關(guān)閉操作,則返回值是0;如果返回值非0,表示關(guān)閉文件時發(fā)生了錯誤。179.2.3文件的打開和關(guān)閉下面的程序說明了文件的打開和關(guān)閉的常用方式如:#include<stdio.h>#defineNULL0FILE*fp1;/*定義文件型指針*/

if((fp1=fopen(“文件名”,“文件使用方式”))==NULL)/*打開文件用于讀寫*/ {printf(“filecannotopen!\n”);/*打開文件出錯的提示*/ exit(0);/*關(guān)閉所有文件,中止程序運行*/ } ┇/*文件正確打開,可對文件操作*/ fclose(fp1);/*關(guān)閉fp1所指向的文件*/189.2.3文件的打開和關(guān)閉C程序運行時,系統(tǒng)自動打開的標準文件

標準輸入文件(stdin)

標準輸出文件(stdout)

標準錯誤輸出文件(stderr)

上述三個標準文件的指針被自動賦給了下面三個事先定義好的變量:FILE*stdin;FILE*stdout;FILE*stderr;

stdin和標準輸入文件相關(guān)聯(lián),它通常是控制臺的鍵盤,所以它是一個輸入流;stdout則和標準輸出文件相關(guān)聯(lián),它通常是控制臺的屏幕,它是一個輸出流;stderr和標準錯誤輸出文件相關(guān)聯(lián),當系統(tǒng)運行出錯時,錯誤信息往往輸出到標準錯誤輸出文件中,在大多數(shù)情況下它和stdout一樣,也是指控制臺的屏幕,所以它也是一個輸出流。199.2.4文件的讀寫文件打開之后,就可以對它進行讀寫了。常用的文件讀寫函數(shù)如下:getc和putc(單字符輸入輸出)

getc函數(shù)的說明格式是:int

getc(FILE*fp)功能:從文件指針fp所指的輸入流文件的當前位置讀取一個字符,然后將該文件的當前位置指針加一,即讓其指向下一個字符。如果碰到文件結(jié)束或產(chǎn)生錯誤,則返回EOF。putc函數(shù)的格式是:int

putc(intc,FILE*fp)

功能:

putc向文件指針fp所指的輸出流文件中輸出字符c。

209.4文件的讀寫[例11.3]編寫一個程序test.c,它在屏幕上顯示其自身的內(nèi)容。#include<stdio.h>voidmain(){FILE*fp;charch;

if((fp=fopen("test.c","rt"))==NULL){puts("Can'topenfile:TEST.C"); exit(0); }

while((ch=getc(fp))!=EOF)putchar(ch);

fclose(fp);}213.fscanf和fprintffscanf函數(shù)只能從文本文件中按格式輸入,調(diào)用形式如下:fscanf(文件指針,格式字符串,指針列表)例:fscanf(stdin,“%d%d”,&a,&b);

scanf(“%d%d”,&a,&b);fprintf函數(shù)按格式將內(nèi)存中的數(shù)據(jù)轉(zhuǎn)換成對應的字符,并以ASCII形式輸出到文本文件中。調(diào)用形式如下:

fprintf(文件指針,格式字符串,輸出列表)例:fprintf(stdout,“%d%d”,x,y);

printf(“%d%d”,x,y);9.2.4文件的讀寫229.2.5其它和文件有關(guān)的庫函數(shù)feof(文件結(jié)束判斷)feof的說明格式是:int

feof(FILE*fp)功能:feof用來判斷文件指針fp所指的文件是否結(jié)束,即是否遇到文件結(jié)束(end-of-file)符。ungetc(回推字符)

ungetc的格式是:int

ungetc(charc,FILE*fp)功能:

ungetc把一個字符c“推回”到文件指針fp所指的流文件中,這樣在下次對fp所指文件調(diào)用getc時將讀入此字符。rewind(回繞文件)

rewind的形式為:voidrewind(FILE*fp)功能:rewind將使文件指針fp所指流文件的當前位置指針重新指向該文件的開頭。即其后對該文件的讀寫操作將從其頭部進行。239.2.5其它和文件有關(guān)的庫函數(shù)ferror(出錯判斷)ferror的說明格式是:int

ferror(FILE*fp)功能:ferror用來判斷對文件指針fp所指的流文件的最后一次讀寫操作是否出錯。ftell(返回文件的當前位置)

ftell的格式是:longftell(FILE*fp)功能:ftell返回文件指針fp所指流文件的當前位置,即從文件的開頭到其當前位置所跨越的字節(jié)數(shù)。fseek(設(shè)置當前位置)fseek的形式為:

溫馨提示

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

評論

0/150

提交評論