版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第12章文件12.1文件概述12.2文件的打開與關閉12.3文件的讀寫操作12.4位置指針與文件定位12.1文件概述1.文件的分類文件可以從不同的角度進行分類:(1)根據文件的內容來分:可分為源程序文件、目標文件、可執(zhí)行文件和數據文件等。(2)根據文件的組織形式來分:可分為順序存取文件和隨機存取文件。(3)根據文件的存儲形式來分:可分為ASCⅡ碼文件(又稱文本文件)和二進制文件。他的每一個字節(jié)存儲一個ASCⅡ碼(代表1個字符)。二進制文件是把內存中的數據,原樣輸出到磁盤文件中。下一頁返回12.1文件概述2.讀文件與寫文件所謂讀文件是指,將磁盤文件中的數據傳送到計算機內存的操作。所謂寫文件是指,從計算機內存向盤文件中傳送數據的操作。如圖12-2所示。3.文件類型系統給每個打開的文件都在內存中開辟一個區(qū)域,用于存放文件的有關信息(如文件名、文件位置等)。這些信息保存在一個結構類型變量中,該結構類型由系統定義,取名為FILE(注意:“FILE”必須大寫)。并放在<stdio.h>頭文件中。上一頁下一頁返回12.1文件概述4.緩沖文件系統(標準I/O)
所謂緩沖文件系統是指,系統自動地在內存區(qū)為每個正在使用的文件開辟一個緩沖區(qū)。從磁盤文件向內存讀入數據時,首先將一批數據讀入到文件緩沖區(qū)中,再從文件緩沖區(qū)將數據逐個送到程序數據區(qū)。如圖12-3所示。從內存向磁盤輸出數據時,則正好相反;必須先將一批數據輸出到緩沖區(qū)中。待緩沖區(qū)裝滿后,再一起輸出到磁盤文件中。如圖12-4所示。上一頁返回12.2文件的打開與關閉12.2.1文件的打開(fopen()函數)1.格式:fopen(“文件名”,“操作方式”);(1)“文件名”是指要打開(或創(chuàng)建)的文件名。如果使用字符數組(或字符指針),則不使用雙引號。(2)“操作方式”如表12-1所示。2.功能:返回一個指向指定文件的指針。下一頁返回12.2文件的打開與關閉3.說明(1)如果不能實現打開指定文件的操作,則fopen()函數返回一個空指針NULL(其值在頭文件stdio.h中被定為0)。常用下面的方法打開一個文件:
if((p=fopen(“文件名”,”操作方式’))==NULL){printf(“cannotopenthisfile\n”);exit(0);/*關閉打開的所有文件,程序結束運行,返回操作系統*/}上一頁下一頁返回12.2文件的打開與關閉(2)“r(b)+”與“a(b)+”的區(qū)別:使用前者打開文件時,讀寫指針指向文件頭;使用后者時,讀寫指針指向文件尾。(3)使用文本文件向計算機系統輸入數據時,系統自動將回車換行符轉換成一個換行符;在輸出時,將換行符轉換成回車和換行兩個字符。使用二進制文件時,內存中的數據形式與數據文件中的形式完全一樣,就不再進行轉換。(4)有些C編譯系統,可能并不完全提供上述對文件的操作方式,或采用的表示符號不同,請注意所使用系統的規(guī)定。上一頁下一頁返回12.2文件的打開與關閉(5)在程序開始運行時,系統自動打開三個標準文件,并分別定義了文件指針:
1)標準輸入文件——stdin:指向終端輸入(一般為鍵盤)。如果程序中指定要從stdin所指的文件輸入數據,就是從終端鍵盤上輸入數據。
2)標準輸出文件——stdout:指向終端輸出(一般為顯示器)。
3)標準錯誤文件——stderr:指向終端標準錯誤輸出(一般為顯示器)。上一頁下一頁返回12.2文件的打開與關閉12.2.2文件的關閉(fclose()函數)在使用完一個文件后,為防止被誤用或數據丟失,應該及時關閉。(1)用法:fclose(文件指針);(2)功能:關閉“文件指針“所指向的文件。如果正常關閉了文件,則函數返回值為0;否則,返回值為非0。例如,fclose(fp);/*關閉fp所指向的文件*/上一頁返回12.3文件的讀寫操作12.3.1讀/寫文件中的一個字符——fgets()和fputs()函數1.將一個字符寫到文件中——fputc()函數#include”stdio.h”main(int
argc,char*argv[]){FILE*fp;charch;
if(argc!=2)/*參數個數不對*/{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);/*輸入字符并存儲到文件中*/
fclose(fp):/*關閉文件*/}
程序運行準備:在Options|Arguments文本框中,輸入文件名“temp.txt”。注:只要符合文件命名規(guī)則,讀者完全可以根據自己的習慣或愛好,給文件另外命名。程序運行情況:
abcdefg1234567@←┘上一頁下一頁返回12.3文件的讀寫操作2.從文件中讀入一個字符——fgetc()函數和feof()函數【例12.2】順序顯示【例12.1】創(chuàng)建的ASCⅡ碼文件。#include”stdio.h”main(int
argc,char*argv[]){FILE*fp;charch;
if(argc!=2)/*參數個數不對*/{printf(“thenumberofargumentsnotcorrect\n”);上一頁下一頁返回12.3文件的讀寫操作
printf(“\nUsage:可執(zhí)行文件名sourcefile”)exit(0)}if((fp=fopen(argv[1],”r”))==NULL)/*打開源文件失敗*/{printf(“cannotopensourcefile\n”);exit(0)}/*順序輸出文件的內容*/for(;(ch=fgect(fp))!=EOF;)putchar(ch);/*順序讀入并顯示*/
fclose(fp);/*關閉打開的文件*/}上一頁下一頁返回12.3文件的讀寫操作程序運行準備:在Options|Arguments文本框中,輸入文件名“temp.txt”。程序運行情況:
abcdefg1234567@←┘程序說明:for(;(ch=fgetc(fp))!=EOF;)putchar(ch);語句(1)循環(huán)語句中的庫函數fgetc()
1)用法:int
fgetc(文件指針);
2)功能:從“文件指針”所指向的文件中,讀入一個字符,同時將讀寫位置指針向前移動1個字節(jié)(即指向下一個字符)。該函數無出錯返回值。上一頁下一頁返回12.3文件的讀寫操作12.3.2讀/寫一個字符串——fgetc()函數和fputs()函數【例12.4】將鍵盤上輸入的一個長度不超過80的字符串,以ASCⅡ碼形式存儲到一個磁盤文件中;然后再輸出到屏幕上。
/*程序功能:從鍵盤上輸入一個字符串,存儲到一個磁盤文件中、并顯示輸出*//*參數:帶參主函數,使用格式:可執(zhí)行文件名要創(chuàng)建的磁盤文件名*/上一頁下一頁返回12.3文件的讀寫操作#include”stdio.h”main(int
argc,char*argv[]){FILE*fp;/*文件類型名“FILE”,必須大寫*/charstring[81];/*字符數組用于暫存輸入輸出的字符串*/
if(argc>2)/*參數太多,提示出錯*/{printf(“Toomanyparamenters…\n\n”);exit(0);}
if(argc==1)/*缺磁盤文件名,提示輸入*/{printf(“Inputthefilename:”);上一頁下一頁返回12.3文件的讀寫操作
gets(string);/*借用string數組暫存輸入的文件名*/argv[1]=(char*)malloc(strlen(string)+1);/*給文件名參數申請內存空間*/strcpy(argv[1],string);/*復制文件名到形參中*/}if((fp=fopen(argv[1],”w”))==NULL)/*打開文件失敗*/{printf(“cannotopenthisfile\n”);exit(0)}/*從鍵盤上輸入字符串,并存儲到指定文件中*/上一頁下一頁返回12.3文件的讀寫操作
printf(“Inputastring:“);gets(string);/*從鍵盤上輸入到字符串*/
fputs(string,fp);/*存儲到指定文件*/
fclose(fp);/*重新打開文件,讀出其中的字符串,并輸出到屏幕上*/if((fp=fopen(argv[1],”r”))==NULL)/*打開文件失敗*/{printf(“cannotopenthisfile\n”);exit(0);}fgets(string,strlen(string)+1,fp);/*從文件中讀出一個字符串*/printf(“Outputthestring:“);puts(string);/*將字符串輸出到屏幕上*/fclose(fp);}上一頁下一頁返回12.3文件的讀寫操作程序說明:(1)基本思路為增強程序的可靠性,程序中對參數過多的情況,提示出錯、并終止程序運行(當然,也可以取第1個參數作為文件名,忽略多余的);而遺漏文件名時,提示用戶輸入。同時,為增強程序的人機交互性,凡是需要用戶輸入數據的地方,都設置提示輸入的信息;凡是輸出數據的地方,都設置輸出說明信息。一言以蔽之,程序設計的最高境界就是,一切為用戶著想!請讀者仔細體會。(2)缺磁盤文件名時的鍵盤輸入上一頁下一頁返回12.3文件的讀寫操作(3)fputs(str-in,fp);語句中的庫函數fputs()——向指定文件輸出一個字符串(4)fgets(str-out,strlen(str-in)+1,fp);語句中的庫函數fgets()——從文件中讀一個字符串(5)fgets()、fputs()函數與gets()、puts()函數比較。上一頁下一頁返回12.3文件的讀寫操作12.3.3讀/寫一個數據塊——fread()和fwrite()函數
fgetc()和fwrite()函數一次只能讀/寫的1個字節(jié)數據,但實際應用中卻常常要求1次讀/寫1個數據塊(連續(xù)的若干字節(jié))。為此,ANSIC標準設置了fread()和fwrite()函數。(1)用法:int
fread(void*buffer,intsize,intcount,FILE*fp);
int
fwrite(void*bu
ffer,intsize,intcount,FILE*fp);上一頁下一頁返回12.3文件的讀寫操作(2)功能:
fread()\——從fp所指向文件的當前位置開始,一次讀入size個字節(jié),重復count次,并將讀入的數據存放到從buffer開始的內存中;同時將讀寫位置指針向前移動size*count個字節(jié)。其中,buffer是存放讀入數據的起始地址(即存放何處)。
fwrite()——從buffer開始,一次輸入size個字節(jié),重復count次,并將輸出的數據存放到fp所指向的文件中;同時,將讀寫位置指針向前移動size*count個字節(jié)。其中,buffer是要輸出數據在內存中的起始地址(即從何處開始輸出)。如果調用fread()或fwrite()成功,則函數返回值等于count。
fread()和fwrite()函數一般用于二進制文件的處理。上一頁下一頁返回12.3文件的讀寫操作12.3.4對文件進行格式化讀/寫——fscanf()和fprintf()函數與scanf()和printf()函數的功能相似,它們都是格式化輸入輸出函數,區(qū)別在于:fscanf()和fprintf()函數的操作對象是指定文件,而scanf()和printf()函數的操作對象是標準輸入(stdin)輸出(stdout)文件。
fscanf()和fprintf()函數的用法如下:
int
fscanf(文件指針,“格式符”,輸入變量首地址表);
int
fprintf(文件指針,“格式符”,輸入參量表);上一頁下一頁返回12.3文件的讀寫操作12.3.4讀/寫函數的選用原則從功能角度來說,fscanf()和fprintf()函數可以完成文件的任何數據讀/寫操作。但為方便起見,依下列原則選用:讀/寫一個字符(或字節(jié))數據時:選用fgetc()函數和fputs()函數。讀/寫一個字符串時:選用fgets()和fputs()函數。讀/寫一個(或多個)不含格式的數據時:選用fread()和fwrite()函數。讀/寫一個(或多個)含格式的數據時:選用fscanf()和fprintf()函數。上一頁返回12.4位置指針與文件定位1.位置指針復位函數rewind()用法:intrewind(文件指
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 寵物店店員工作總結
- 黑龍江省哈爾濱市道里區(qū)2023-2024學年九年級上學期化學期末測試題
- 大型活動銷售總結
- 婚慶策劃師的工作總結
- 2025年云南省八省聯考高考地理模擬試卷
- 《胡蘿卜素的提取定》課件
- 《怎樣做品牌規(guī)劃》課件
- 2023年江西省上饒市公開招聘警務輔助人員輔警筆試自考題1卷含答案
- 2022年湖北省黃岡市公開招聘警務輔助人員輔警筆試自考題1卷含答案
- 2024年江蘇省無錫市公開招聘警務輔助人員輔警筆試自考題1卷含答案
- 醫(yī)務人員外出進修流程圖
- DB32∕T 2349-2013 楊樹一元立木材積表
- 昌樂二中271高效課堂培訓與評價ppt課件
- 顫?。ㄅ两鹕。┲嗅t(yī)護理常規(guī)
- 豬場名詞及指標講義
- 果膠項目商業(yè)計劃書(模板范本)
- 旋挖鉆成孔掏渣筒沉渣處理施工工藝
- T∕CHTS 10040-2021 公路無機結合料穩(wěn)定粒料基層振動法施工技術指南
- 集團后備人才培養(yǎng)方案
- 腦卒中偏癱患者早期康復護理現狀(一)
- 國家開放大學電大本科《機電控制工程基礎》2023-2024期末試題及答案(試卷代號:1116)
評論
0/150
提交評論