




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第10章 文件操作哈爾濱工業(yè)大學(xué)計算機科學(xué)與技術(shù)學(xué)院蘇小紅 C語言大學(xué)實用教程I/O設(shè)備輸入設(shè)備鍵盤、鼠標軟盤、硬盤(以文件的形式)串行口、并行口、USB接口、網(wǎng)絡(luò)端口掃描儀、視頻采集卡、電視卡、游戲桿、話筒輸出設(shè)備顯示器、打印機軟盤、硬盤(以文件的形式)串行口、并行口、USB接口、網(wǎng)絡(luò)端口音箱單純的輸入設(shè)備或者單純的輸出設(shè)備越來越少標準輸入輸出字符界面的操作系統(tǒng)一般都提供標準輸入與輸出設(shè)備DOS、Linux、Unix一般情況,標準輸入就是鍵盤,標準輸出就是終端顯示器操作系統(tǒng)有能力重定向標準輸入與輸出,比如讓文件作為標準輸入(標準輸出)這種重定向程序本身是感覺不到的自來水廠DOS下的標準輸入輸
2、出重定向程序prog如下main() char c; while (c=getchar() != n) putchar(+c);輸入重定向prog outfile.txt流(Stream)水流“子在川上曰:逝者如斯夫”計算機中的流的概念一般稱為數(shù)據(jù)流,也有叫做字節(jié)流、比特流的,還有很具體的文件流、視頻流、音頻流等時光不能倒流,但計算機中的很多流都是會倒流的如果你想重新讀已經(jīng)讀過的數(shù)據(jù),或者要修改已經(jīng)寫入的數(shù)據(jù),可以發(fā)出流控(Flow Control)命令不會倒流的數(shù)據(jù)流也很多,例如網(wǎng)絡(luò)上的數(shù)據(jù)流。網(wǎng)絡(luò)和數(shù)據(jù)線等介質(zhì)只有很小的數(shù)據(jù)緩沖區(qū),沒有大量存儲的能力 文件(File)的概念計算機的內(nèi)存容易
3、健忘,所以數(shù)據(jù)必須保存在硬盤、軟盤、光盤和磁帶等“不健忘”的外存上這些能大量、永久保存信息的媒介,一般都以文件的形式給用戶及應(yīng)用程序使用文件一般指存儲在外部介質(zhì)上具有名字(文件名)的一組相關(guān)數(shù)據(jù)的集合用文件可長期保存數(shù)據(jù),并實現(xiàn)數(shù)據(jù)共享程序中的文件 在程序運行時由程序在磁盤上建立一個文件,并通過寫操作將數(shù)據(jù)存入該文件;或由程序打開磁盤上的某個已有文件,并通過讀操作將文件中的數(shù)據(jù)讀入內(nèi)存供程序使用文件的存放可以建立若干目錄(文件夾),在目錄里保存文件,同一級目錄里保存的文件不能同名。對使用者而言,只要知道文件的路徑(全目錄)和文件名,就能使用該文件C:homeSunnermain.c 這都是托O
4、S的福文件的類型二進制文件是一種字節(jié)序列,沒有字符變換按照數(shù)據(jù)在內(nèi)存中的存儲形式存儲到文件如整數(shù)127,在內(nèi)存占2個字節(jié),為0000000001111111,則文件中也存儲為0000000001111111,占2個字節(jié)文本文件/ASCII碼文件是一種字符序列文件中存儲每個字符的ASCII碼如整數(shù)127在文件中占3個字節(jié),分別存放這3個字符的ASCII碼,即49,50,55文件的格式數(shù)據(jù)必須按照存入的類型讀出,才能恢復(fù)其本來面貌 公開的標準格式如bmp、tif、gif、jpg和mp3等類型的文件 ,有大量軟件能生成和使用這些類型的文件 也有不公開、甚至加密的文件格式如Microsoft Word
5、的doc格式就不公開,所以至今還沒有Word以外的其它軟件能完美地讀出doc文件 文件訪問基本模式open:打開文件獲得對此文件的指針、引用和句柄等,以證明可以使用此文件read:讀文件參數(shù)一般指明要讀多少字節(jié),讀到哪塊內(nèi)存。每次調(diào)用此功能,都是接著上次調(diào)用的結(jié)束位置讀(所以是個輸入流)write:寫文件參數(shù)一般指明把哪塊內(nèi)存的內(nèi)容寫入文件,要寫多少字節(jié)。每次調(diào)用此功能,都是接著上次調(diào)用的結(jié)束位置寫 (所以是個輸出流)close:關(guān)閉文件表明操作結(jié)束,不再使用此文件。文件使用完畢必須關(guān)閉,否則影響系統(tǒng)性能seek:文件定位隨機控制流的當前位置C語言中的文件訪問#include #include
6、 int open(const char *pathname, int access);int fd = open(C:CONFIG.SYS, O_RDWR | O_CREAT);pathname是文件名,包含路徑。如果不含路徑,表示打開當前目錄下的文件access是打開方式,常用為O_RDONLY、O_WRONLY、O_RDWR與O_CREAT、O_TRUNC、O_APPEND的或運算返回值為文件句柄(File Handle),留待以后使用。如果打開失敗,返回值為-1C語言中的文件訪問int read(int handle, void *buf, unsigned len);int n_re
7、ad = read(fd, buf, BUFSIZ);從文件中讀len個字節(jié)存到buf開始的地址單元中handle是open獲得的文件句柄buf是保存讀入內(nèi)容的內(nèi)存指針len是最大可以讀入的字節(jié)數(shù)返回值為實際讀入的字節(jié)數(shù),可能大于len。返回0表示讀到了末尾,返回-1表示出錯C語言中的文件訪問int write(int handle, void *buf, unsigned len);int n_write = write(fd, buf, BUFSIZ);把從buf開始的len個字節(jié)寫入文件handle是open獲得的文件句柄buf是要寫入內(nèi)容的內(nèi)存指針len是寫入多少字節(jié)返回值為實際寫入的
8、字節(jié)數(shù),可能小于len。返回-1表示出錯C語言中的文件訪問int close(int handle);int ret = close(fd);把遺留在緩沖區(qū)中的數(shù)據(jù)寫入文件handle是open獲得的文件句柄關(guān)閉成功返回0,否則返回-1驅(qū)動器中無盤或盤空間不夠時會引起關(guān)閉失敗C語言中的文件訪問long lseek(int handle long offset int fromwhere);int pos = lseek(fd, 100L, SEEK_CUR);handle是open獲得的文件句柄offset是相對fromwhere的位置偏移多少,可以為負數(shù)fromwhere:SEEK_SET-
9、文件開始 SEEK_CUR-當前位置 SEEK_END-文件末尾成功返回移位后的當前位置,從文件頭算起;否則返回-1L幾個巧妙運用curPos = lseek(fh, 0L, SEEK_CUR);得到當前位置指針的位置fileLength = lseek(fh, 0L, SEEK_END);得到文件長度C語言獨特的文件訪問下面介紹的函數(shù)均定義在中FILE *fopen(const char *filename, const char *mode);FILE *fp = fopen(C:CONFIG.SYS, rw);filename是文件名包含路徑。如果不含路徑,表示打開當前目錄下的文件mod
10、e是打開方式常用為r、w、rw和a,分別表示只讀、只寫、讀寫和添加rb表示只讀二進制文件返回值為指向此文件的指針,留待以后使用如果打開失敗,返回值為NULLint fclose(FILE *fp);文件指針(File Pointer)FILE *fp ;是FILE型指針變量標識一個特定的磁盤文件typedef struct short level; /*緩沖區(qū)滿或空的程度*/ unsigned flags; /*文件狀態(tài)標志*/ char fd; /*文件描述符*/ unsigned char hold; /*如無緩沖區(qū)不讀字符*/ short bsize; /*緩沖區(qū)的大小*/ unsign
11、ed char *buffer;/*數(shù)據(jù)緩沖區(qū)的位置*/ unsigned char *curp; /*指針當前的指向*/ unsigned istemp; /*臨時文件指示器*/ short token; /*用于有效性檢查*/ FILE;在stdio.h文件中定義C語言獨特的文件訪問字符讀寫int fgetc(FILE *fp);從fp讀出一個字符并返回若讀到文件尾,則返回EOFint fputc(int c, FILE *fp);向fp輸出字符c若寫入錯誤,則返回EOF,否則返回cC語言獨特的文件訪問字符串讀寫char *fgets(char *s,int n,FILE *fp);特例f
12、gets(buf, sizeof(buf), stdin);int fputs(const char *s, FILE *fp);C語言獨特的文件訪問格式化讀寫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語言獨特的文件訪問按數(shù)據(jù)塊讀寫unsigned fread(void *ptr, unsigned size, unsigned nmemb, F
13、ILE *fp);從fp讀數(shù)據(jù)塊到ptrsize是每個數(shù)據(jù)塊的大小nmemb是最多允許寫的數(shù)據(jù)塊個數(shù)返回實際讀到的數(shù)據(jù)塊個數(shù)unsigned fwrite(const void *ptr, unsigned size, unsigned nmemb, FILE *fp);把ptr指向的數(shù)據(jù)塊寫入fpC語言獨特的文件訪問文件定位,用于文件的隨機讀寫打開的文件中有一個位置指針指示當前讀寫位置對文件每進行一次順序讀寫,文件指針自動指向下一讀寫位置int fseek(FILE *fp, long offset, int fromwhere);把fp的位置指針從fromwhere開始移動offset個字
14、節(jié)fromwhere:SEEK_SET或0-文件開始 SEEK_CUR或1-當前位置 SEEK_END或2-文件末尾int ftell(FILE *fp); 返回fp的當前位置指針int rewind(FILE *fp); 讓fp的位置指針指向文件首字節(jié)C語言獨特的文件訪問判斷文件是否結(jié)束int feof(FILE *fp);當文件位置指針指向fp末尾時,返回非0值,否則返回0錯誤處理錯誤處理文件錯誤一般都是外界造成的,出錯率很高被刪除、修改、磁盤空間滿、被其他文件打開通過判斷返回值發(fā)現(xiàn)錯誤所有文件操作出錯時都返回-1出錯處理打印錯誤信息給用戶,等待用戶的處理void perror(const
15、 char *s);向標準錯誤輸出字符串s,隨后附上錯誤的文字說明錯誤處理例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族通常情況能直接反映文件的真實情況,因為它的操作都不假定文件的任何結(jié)構(gòu)fopen族的函數(shù)包裝了open族的函數(shù),提供更強大的功能,但是效率略遜fopen族比較適合處理文本文件,或者結(jié)構(gòu)單一的文件。實驗10 文件復(fù)制與追加程序1:根據(jù)程序提示從鍵盤輸入一個已存在的文本文件的完整文件名,并再輸入一個新文本文件的完整文件名然后編程將已存在文本文件中的內(nèi)容全部拷貝到新文本文件中去利用文本編輯軟件,通過查看文件內(nèi)容驗證程序執(zhí)行結(jié)果。實驗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;/* 目標文件名 */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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO 24204:2025 EN Oil and gas industries including lower carbon energy - Bulk material for offshore projects - Design for architectural supports
- GB/T 45211.8-2025小麥抗病蟲性評價技術(shù)規(guī)程第8部分:吸漿蟲
- 【正版授權(quán)】 IEC 60601-2-16:2025 EN-FR Medical electrical equipment - Part 2-16: Particular requirements for the basic safety and essential performance of haemodialysis,haemodiafiltrati
- 【正版授權(quán)】 IEC 60364-5-53:2019/AMD2:2024 EN-FR Amendment 2 - Low-voltage electrical installations - Part 5-53: Selection and erection of electrical equipment - Devices for protection f
- 【正版授權(quán)】 IEC 63310:2025 EN Functional performance criteria for AAL robots used in connected home environment
- 樹木買賣合同協(xié)議
- 人民醫(yī)院安保服務(wù)采購合同
- 委托書合同范文(32篇)
- 場地租賃補充協(xié)議
- 吊車機械租賃合同
- 年獸的故事之The Legend of Nian
- 初中美術(shù)教學(xué)策略與方法
- 2024年高考二輪復(fù)習(xí) 微主題熱練5 新情境下陌生反應(yīng)化學(xué)(或離子)方程式的書寫 作業(yè)
- 農(nóng)田春耕安全生產(chǎn)培訓(xùn)
- 大象版科學(xué)小學(xué)二年級下冊教學(xué)課件(全套)
- 再生棉項目融資計劃書
- 甲流護理查房病例
- 人教版小學(xué)勞動教育三年級下冊第二章勞動項目5《蒸蛋羹》優(yōu)質(zhì)課教學(xué)設(shè)計
- 概率論與數(shù)理統(tǒng)計智慧樹知到課后章節(jié)答案2023年下四川師范大學(xué)
- 新生兒敗血癥護理查房查房
- 中級會計實務(wù)所得稅課件
評論
0/150
提交評論