c語言實(shí)用教程電子課件第10章文件操作_第1頁(yè)
c語言實(shí)用教程電子課件第10章文件操作_第2頁(yè)
c語言實(shí)用教程電子課件第10章文件操作_第3頁(yè)
c語言實(shí)用教程電子課件第10章文件操作_第4頁(yè)
c語言實(shí)用教程電子課件第10章文件操作_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第10章 文件操作哈爾濱工業(yè)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院蘇小紅 C語言大學(xué)實(shí)用教程I/O設(shè)備輸入設(shè)備鍵盤、鼠標(biāo)軟盤、硬盤(以文件的形式)串行口、并行口、USB接口、網(wǎng)絡(luò)端口掃描儀、視頻采集卡、電視卡、游戲桿、話筒輸出設(shè)備顯示器、打印機(jī)軟盤、硬盤(以文件的形式)串行口、并行口、USB接口、網(wǎng)絡(luò)端口音箱單純的輸入設(shè)備或者單純的輸出設(shè)備越來越少標(biāo)準(zhǔn)輸入輸出字符界面的操作系統(tǒng)一般都提供標(biāo)準(zhǔn)輸入與輸出設(shè)備DOS、Linux、Unix一般情況,標(biāo)準(zhǔn)輸入就是鍵盤,標(biāo)準(zhǔn)輸出就是終端顯示器操作系統(tǒng)有能力重定向標(biāo)準(zhǔn)輸入與輸出,比如讓文件作為標(biāo)準(zhǔn)輸入(標(biāo)準(zhǔn)輸出)這種重定向程序本身是感覺不到的自來水廠DOS下的標(biāo)準(zhǔn)輸入輸

2、出重定向程序prog如下main() char c; while (c=getchar() != n) putchar(+c);輸入重定向prog outfile.txt流(Stream)水流“子在川上曰:逝者如斯夫”計(jì)算機(jī)中的流的概念一般稱為數(shù)據(jù)流,也有叫做字節(jié)流、比特流的,還有很具體的文件流、視頻流、音頻流等時(shí)光不能倒流,但計(jì)算機(jī)中的很多流都是會(huì)倒流的如果你想重新讀已經(jīng)讀過的數(shù)據(jù),或者要修改已經(jīng)寫入的數(shù)據(jù),可以發(fā)出流控(Flow Control)命令不會(huì)倒流的數(shù)據(jù)流也很多,例如網(wǎng)絡(luò)上的數(shù)據(jù)流。網(wǎng)絡(luò)和數(shù)據(jù)線等介質(zhì)只有很小的數(shù)據(jù)緩沖區(qū),沒有大量存儲(chǔ)的能力 文件(File)的概念計(jì)算機(jī)的內(nèi)存容易

3、健忘,所以數(shù)據(jù)必須保存在硬盤、軟盤、光盤和磁帶等“不健忘”的外存上這些能大量、永久保存信息的媒介,一般都以文件的形式給用戶及應(yīng)用程序使用文件一般指存儲(chǔ)在外部介質(zhì)上具有名字(文件名)的一組相關(guān)數(shù)據(jù)的集合用文件可長(zhǎng)期保存數(shù)據(jù),并實(shí)現(xiàn)數(shù)據(jù)共享程序中的文件 在程序運(yùn)行時(shí)由程序在磁盤上建立一個(gè)文件,并通過寫操作將數(shù)據(jù)存入該文件;或由程序打開磁盤上的某個(gè)已有文件,并通過讀操作將文件中的數(shù)據(jù)讀入內(nèi)存供程序使用文件的存放可以建立若干目錄(文件夾),在目錄里保存文件,同一級(jí)目錄里保存的文件不能同名。對(duì)使用者而言,只要知道文件的路徑(全目錄)和文件名,就能使用該文件C:homeSunnermain.c 這都是托O

4、S的福文件的類型二進(jìn)制文件是一種字節(jié)序列,沒有字符變換按照數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式存儲(chǔ)到文件如整數(shù)127,在內(nèi)存占2個(gè)字節(jié),為0000000001111111,則文件中也存儲(chǔ)為0000000001111111,占2個(gè)字節(jié)文本文件/ASCII碼文件是一種字符序列文件中存儲(chǔ)每個(gè)字符的ASCII碼如整數(shù)127在文件中占3個(gè)字節(jié),分別存放這3個(gè)字符的ASCII碼,即49,50,55文件的格式數(shù)據(jù)必須按照存入的類型讀出,才能恢復(fù)其本來面貌 公開的標(biāo)準(zhǔn)格式如bmp、tif、gif、jpg和mp3等類型的文件 ,有大量軟件能生成和使用這些類型的文件 也有不公開、甚至加密的文件格式如Microsoft Word

5、的doc格式就不公開,所以至今還沒有Word以外的其它軟件能完美地讀出doc文件 文件訪問基本模式open:打開文件獲得對(duì)此文件的指針、引用和句柄等,以證明可以使用此文件read:讀文件參數(shù)一般指明要讀多少字節(jié),讀到哪塊內(nèi)存。每次調(diào)用此功能,都是接著上次調(diào)用的結(jié)束位置讀(所以是個(gè)輸入流)write:寫文件參數(shù)一般指明把哪塊內(nèi)存的內(nèi)容寫入文件,要寫多少字節(jié)。每次調(diào)用此功能,都是接著上次調(diào)用的結(jié)束位置寫 (所以是個(gè)輸出流)close:關(guān)閉文件表明操作結(jié)束,不再使用此文件。文件使用完畢必須關(guān)閉,否則影響系統(tǒng)性能seek:文件定位隨機(jī)控制流的當(dāng)前位置C語言中的文件訪問#include #include

6、 int open(const char *pathname, int access);int fd = open(C:CONFIG.SYS, O_RDWR | O_CREAT);pathname是文件名,包含路徑。如果不含路徑,表示打開當(dāng)前目錄下的文件access是打開方式,常用為O_RDONLY、O_WRONLY、O_RDWR與O_CREAT、O_TRUNC、O_APPEND的或運(yùn)算返回值為文件句柄(File Handle),留待以后使用。如果打開失敗,返回值為-1C語言中的文件訪問int read(int handle, void *buf, unsigned len);int n_re

7、ad = read(fd, buf, BUFSIZ);從文件中讀len個(gè)字節(jié)存到buf開始的地址單元中handle是open獲得的文件句柄buf是保存讀入內(nèi)容的內(nèi)存指針len是最大可以讀入的字節(jié)數(shù)返回值為實(shí)際讀入的字節(jié)數(shù),可能大于len。返回0表示讀到了末尾,返回-1表示出錯(cuò)C語言中的文件訪問int write(int handle, void *buf, unsigned len);int n_write = write(fd, buf, BUFSIZ);把從buf開始的len個(gè)字節(jié)寫入文件handle是open獲得的文件句柄buf是要寫入內(nèi)容的內(nèi)存指針len是寫入多少字節(jié)返回值為實(shí)際寫入的

8、字節(jié)數(shù),可能小于len。返回-1表示出錯(cuò)C語言中的文件訪問int close(int handle);int ret = close(fd);把遺留在緩沖區(qū)中的數(shù)據(jù)寫入文件handle是open獲得的文件句柄關(guān)閉成功返回0,否則返回-1驅(qū)動(dòng)器中無盤或盤空間不夠時(shí)會(huì)引起關(guān)閉失敗C語言中的文件訪問long lseek(int handle long offset int fromwhere);int pos = lseek(fd, 100L, SEEK_CUR);handle是open獲得的文件句柄offset是相對(duì)fromwhere的位置偏移多少,可以為負(fù)數(shù)fromwhere:SEEK_SET-

9、文件開始 SEEK_CUR-當(dāng)前位置 SEEK_END-文件末尾成功返回移位后的當(dāng)前位置,從文件頭算起;否則返回-1L幾個(gè)巧妙運(yùn)用curPos = lseek(fh, 0L, SEEK_CUR);得到當(dāng)前位置指針的位置fileLength = lseek(fh, 0L, SEEK_END);得到文件長(zhǎng)度C語言獨(dú)特的文件訪問下面介紹的函數(shù)均定義在中FILE *fopen(const char *filename, const char *mode);FILE *fp = fopen(C:CONFIG.SYS, rw);filename是文件名包含路徑。如果不含路徑,表示打開當(dāng)前目錄下的文件mod

10、e是打開方式常用為r、w、rw和a,分別表示只讀、只寫、讀寫和添加rb表示只讀二進(jìn)制文件返回值為指向此文件的指針,留待以后使用如果打開失敗,返回值為NULLint fclose(FILE *fp);文件指針(File Pointer)FILE *fp ;是FILE型指針變量標(biāo)識(shí)一個(gè)特定的磁盤文件typedef struct short level; /*緩沖區(qū)滿或空的程度*/ unsigned flags; /*文件狀態(tài)標(biāo)志*/ char fd; /*文件描述符*/ unsigned char hold; /*如無緩沖區(qū)不讀字符*/ short bsize; /*緩沖區(qū)的大小*/ unsign

11、ed char *buffer;/*數(shù)據(jù)緩沖區(qū)的位置*/ unsigned char *curp; /*指針當(dāng)前的指向*/ unsigned istemp; /*臨時(shí)文件指示器*/ short token; /*用于有效性檢查*/ FILE;在stdio.h文件中定義C語言獨(dú)特的文件訪問字符讀寫int fgetc(FILE *fp);從fp讀出一個(gè)字符并返回若讀到文件尾,則返回EOFint fputc(int c, FILE *fp);向fp輸出字符c若寫入錯(cuò)誤,則返回EOF,否則返回cC語言獨(dú)特的文件訪問字符串讀寫char *fgets(char *s,int n,FILE *fp);特例f

12、gets(buf, sizeof(buf), stdin);int fputs(const char *s, FILE *fp);C語言獨(dú)特的文件訪問格式化讀寫int fscanf(FILE *fp, const char *format, .);fscanf(fp, %d,%6.2f, &i, &t);int fprintf(FILE *fp, const char *format, .);fprintf(fp, %d,%6.2f, i, t);C語言獨(dú)特的文件訪問按數(shù)據(jù)塊讀寫unsigned fread(void *ptr, unsigned size, unsigned nmemb, F

13、ILE *fp);從fp讀數(shù)據(jù)塊到ptrsize是每個(gè)數(shù)據(jù)塊的大小nmemb是最多允許寫的數(shù)據(jù)塊個(gè)數(shù)返回實(shí)際讀到的數(shù)據(jù)塊個(gè)數(shù)unsigned fwrite(const void *ptr, unsigned size, unsigned nmemb, FILE *fp);把ptr指向的數(shù)據(jù)塊寫入fpC語言獨(dú)特的文件訪問文件定位,用于文件的隨機(jī)讀寫打開的文件中有一個(gè)位置指針指示當(dāng)前讀寫位置對(duì)文件每進(jìn)行一次順序讀寫,文件指針自動(dòng)指向下一讀寫位置int fseek(FILE *fp, long offset, int fromwhere);把fp的位置指針從fromwhere開始移動(dòng)offset個(gè)字

14、節(jié)fromwhere:SEEK_SET或0-文件開始 SEEK_CUR或1-當(dāng)前位置 SEEK_END或2-文件末尾int ftell(FILE *fp); 返回fp的當(dāng)前位置指針int rewind(FILE *fp); 讓fp的位置指針指向文件首字節(jié)C語言獨(dú)特的文件訪問判斷文件是否結(jié)束int feof(FILE *fp);當(dāng)文件位置指針指向fp末尾時(shí),返回非0值,否則返回0錯(cuò)誤處理錯(cuò)誤處理文件錯(cuò)誤一般都是外界造成的,出錯(cuò)率很高被刪除、修改、磁盤空間滿、被其他文件打開通過判斷返回值發(fā)現(xiàn)錯(cuò)誤所有文件操作出錯(cuò)時(shí)都返回-1出錯(cuò)處理打印錯(cuò)誤信息給用戶,等待用戶的處理void perror(const

15、 char *s);向標(biāo)準(zhǔn)錯(cuò)誤輸出字符串s,隨后附上錯(cuò)誤的文字說明錯(cuò)誤處理例10.1#include #include #include #include main()/* c:abc.abc文件并不存在 */int fh = open(c:abc.abc, O_RDONLY | O_BINARY);if (fh = -1)/* fh必然為-1 */perror(Cant open c:abc.abc. Error);Cant open c:abc.abc. Error: No such file or directory兩種方式的區(qū)別open族的功能一般由OS直接提供,其使用方式也比較具有通

16、用性,在各種語言里基本一樣open族通常情況能直接反映文件的真實(shí)情況,因?yàn)樗牟僮鞫疾患俣ㄎ募娜魏谓Y(jié)構(gòu)fopen族的函數(shù)包裝了open族的函數(shù),提供更強(qiáng)大的功能,但是效率略遜fopen族比較適合處理文本文件,或者結(jié)構(gòu)單一的文件。實(shí)驗(yàn)10 文件復(fù)制與追加程序1:根據(jù)程序提示從鍵盤輸入一個(gè)已存在的文本文件的完整文件名,并再輸入一個(gè)新文本文件的完整文件名然后編程將已存在文本文件中的內(nèi)容全部拷貝到新文本文件中去利用文本編輯軟件,通過查看文件內(nèi)容驗(yàn)證程序執(zhí)行結(jié)果。實(shí)驗(yàn)10 文件復(fù)制與追加main() /*文件拷貝*/while (ch = fgetc(fpSrc) != EOF) if (fputc(

17、ch, fpDst) = EOF)printf(Copy failed!);exit(0);printf(Copy succeed.n);#include #define MAXLEN 80int CopyFile(const char* srcName, const char* dstName);main()char srcFilenameMAXLEN;/* 源文件名 */char dstFilenameMAXLEN;/* 目標(biāo)文件名 */printf(Input source filename:);scanf(%s, srcFilename);printf(Input destinatio

18、n filename:);scanf(%s, dstFilename);if (CopyFile(srcFilename, dstFilename)printf(Copy succeed.n);elseperror(Copy failed:);例10.4 文件復(fù)制int CopyFile(const char* srcName, const char* dstName)FILE* fpSrc = NULL;FILE* fpDst = NULL; int ch, rval=1;fpSrc = fopen(srcName, rb);if (fpSrc = NULL) goto ERROR;fpDst = fopen(dstName, wb);if (fpDst = NULL)goto ERROR;while (ch=fgetc(fpSrc) != EOF)if (fputc(ch, fpDst) = EOF)goto ERROR; /* 確保存盤 */ fflush(fpDst);goto EXIT;ERROR:rval=0;EXIT:if (fpSrc != NULL)fclose(fpSrc);if (fpDs

溫馨提示

  • 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)論