版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
上周回憶#defineA3#defineBA+2#defineC2*B+1請問C*2值是多少?將C替代為2*3+2+1,再乘以2則為2*3+2+1*2,最后值應當為10第1頁第12章文件本章重點:掌握文獻基本概念掌握文獻類型指針理解文獻操作基本辦法掌握文獻處理函數(shù)第2頁12.1C文獻概述12.1.1文獻基本概念一、文獻:是指存放在外部介質上數(shù)據(jù)集合。二、文獻存在形式及分類文獻存在形式:文獻名+文獻內容。
文獻內容:是一種字符(字節(jié))序列,即由一種個字符(字節(jié))數(shù)據(jù)次序組成。對文獻存取是以字符(字節(jié))為單位,此類文獻稱為流式文獻。
第3頁文獻分類:⑴ASCII碼文獻(文本文獻):文獻每一種字節(jié)放一種ASCII代碼,代表一種字符。⑵二進制文獻:把內存中數(shù)據(jù)按其在內存中存儲形式原樣輸出到文獻上。根據(jù)數(shù)據(jù)在內存組織形式不一樣可分為兩類文獻∶ASCII碼文獻(文本文獻)二進制文獻根據(jù)數(shù)據(jù)讀寫方式不一樣可分為兩類文獻∶次序存取文獻隨機存取文獻第4頁三、文獻基本操作
打開文獻∶把文獻名等目錄信息從磁盤上讀入內存并存入構造體。(2)關閉文獻∶把內存構造體中文獻名等目錄信息寫入磁盤。(3)寫文獻∶向文獻寫內容。(4)讀文獻∶從文獻讀內容。第5頁1.文獻類型(FILE)每個被使用文獻都在內存中開辟一種區(qū),用來寄存文獻有關信息(如文獻名,狀態(tài),目前位置等)。這些信息保存在一種構造體類型變量中。構造體類型由系統(tǒng)定義為“FILE”。12.1.2文獻指針第6頁2.定義FILE類型指針變量FILE類型指針變量定義辦法∶FILE*指針變量名;例如:FILE*fp;含義:fp是一種指向FILE類型構造體指針變量,定義后fp能夠指向某個文獻了。能夠使fp指向某個文獻構造體變量,從而通過該構造體變量中文獻信息能夠訪問該文獻。
第7頁例1:把”hello!”保存到磁盤文獻f1.txt中。#include"stdio.h"main(){ FILE*fp; if((fp=fopen(“f1.txt","w"))==NULL) { printf("can'topenthefile\n"); exit(0); }
fputs("hello!",fp);// fprintf(fp,“hello!\n");
fclose(fp);}第8頁例2:將1.txt中信息復制到2.txt中。#include"stdio.h"main(){ charch; FILE*fp1,*fp2; if((fp1=fopen("1.txt","r"))==NULL) { printf("can'topenthefile\n"); exit(0);} if((fp2=fopen("2.txt","w"))==NULL) { printf("can'topenthefile\n"); exit(0);} while(!feof(fp1)) { ch=fgetc(fp1);//fscanf(fp1,"%c",&ch);
fputc(ch,fp2); //fprintf(fp2,"%c",ch); } fclose(fp1); fclose(fp2);}第9頁例3:將f1.txt中第一種字符輸出到屏幕上,并修改第一種字符為‘x’,將第5個字符改為‘y’。保存到磁盤文獻f1.txt中。#include“stdio.h”main(){FILE*fp; charch; fp=fopen("f1.txt","r+"); ch=fgetc(fp); putchar(ch);
rewind(fp); fputc(‘x',fp);
fseek(fp,4L,0); fputc(‘y',fp); }第10頁例4:從f1.txt中讀一種長度為3字符串,放到str數(shù)組中,并將str中字符串輸出到f1.txt最后。#include“stdio.h”main(){ FILE*fp; charstr[20]; fp=fopen("f1.txt","r+");
fgets(str,4,fp); puts(str); fseek(fp,0L,2); fputs(str,fp); fclose(fp);}第11頁例5:把數(shù)組a中字符串寫入文獻f1.txt,再從f1.txt中讀取字符串寄存到字符數(shù)組b中。#include"stdio.h"main(){ chara[]="13579",b[10]; inti; FILE*fp; fp=fopen("f1.txt","w+");
fwrite(a,1,5,fp); rewind(fp);
fread(b,1,5,fp); for(i=0;i<5;i++) printf("%c,",b[i]);}第12頁12.2文獻打開與關閉12.2.1文獻打開函數(shù)(fopen函數(shù))(1)調用方式:FILE*fp;fp=fopen(文獻名,文獻使用方式);所要打開文獻名。用雙引號引發(fā)字符串常量。
具有特定含意符號必須由雙引號引發(fā)顧客定義文獻類型指針變量⑵功能:以指定方式打開指定文獻,若操作成功,則返回一種指向該文獻指針,若打開文獻時出現(xiàn)錯誤,則返回空指針NULL。例∶FILE*fp;fp=fopen("stu.dat","r");第13頁⑶文獻使用方式(表12.1)基本方式字符(單獨使用是對文本文獻):r僅為讀而打開。(只讀文獻)
w僅為寫而打開。(建立新文獻)
a僅為添加而打開。(寫舊文獻)
按二進制格式讀寫文獻(基本方式字符+“b”)∶b輔助說明,按二進制格式讀寫文獻。
同步進行讀寫文獻(基本方式字符+[“b”]+“+”)∶+輔助說明,可同步進行讀和寫文獻。
例如:fp=(“stu.dat”,“rb”);例如:fp=(“stu.dat”,“r+”);第14頁例:#include<stdio.h>main(){FILE*fp;if((fp=fopen("stu.dat","r"))==NULL){printf("filenotfound.");exit(0);}else{printf("fileopenedok!");fclose(fp);}}程序運行成果:假如磁盤上存在文獻stu.dat,屏幕上會顯示fileopenok!,不然屏幕上顯示filenotfound.。常使用此辦法打開一種文獻exit函數(shù)功能是關閉所有文獻,終止程序運行。exit(0)為正常終止程序第15頁12.2.2文獻關閉函數(shù)(fclose函數(shù))(1)調用方式:
fclose(文獻指針);
⑵功能:關閉由文獻指針指定文獻,把緩沖區(qū)中數(shù)據(jù)(未裝滿緩沖區(qū)數(shù)據(jù))輸出到磁盤上,釋放文獻指針。例如:FILE*fp;fp=fopen(“output.dat”,“r+”);……/*進行讀寫操作*/fclose(fp);注意:fopen函數(shù)和fclose函數(shù)總是成對出現(xiàn)。無fclose函數(shù)時會造成部分數(shù)據(jù)丟失!第16頁12.3文獻讀寫12.3.1單個字符操作讀寫函數(shù)這兩個函數(shù)是以字符為單位進行文獻讀寫函數(shù)。1.fputc函數(shù)一般調用形式:
fputc(字符常量或變量,文獻指針);功能:把指定字符存入文獻指針所指文獻中。假如輸出失敗,則返回一種EOF(-1)。例如:fputc(ch,fp);(其中ch為字符變量,fp為文獻指針)含義:將ch值輸出到fp所指向文獻中去。(EOF是在stdio.h文獻中定義符號常量,值為-1)第17頁2.fgetc函數(shù)一般調用形式:
字符變量=fgetc(文獻指針);功能:從文獻指針所指文獻中讀一種字符賦給指定字符變量。當遇文獻結束符,返回一個文獻結束標志EOF(-1)。例如:ch=fgetc(fp);其中ch為字符變量,fp為文獻指針。含義:從fp所指向文獻中讀入一種字符賦給字符變量ch。第18頁例:閱讀程序。#include"stdio.h"#defineNULL0main(){FILE*fp;intcount=0;charc;if((fp=fopen(“file.txt”,“r”))==NULL){printf(“Can’tOpenFile\n”);exit(0);}c=fgetc(fp);while(c!=EOF){count++;c=fgetc(fp);}printf(“count=%d\n”,count);fclose(fp);}若文獻file.txt內容是:abcd1234ABCD輸出成果:12這是讀一種文本文獻中字符,并判斷文獻是否結束常用辦法第19頁12.3.2字符串讀寫函數(shù)這兩個函數(shù)是以字符串為單位進行文獻讀寫函數(shù)。一般調用形式:
fputs(字符串,文獻指針);1.fputs函數(shù)功能:向指定文獻輸出一種字符串。例如:fputs(str,fp);(其中str是字符數(shù)組名)含義:向fp所指向文獻中輸出str中字符串。第20頁2.fgets函數(shù)fgets(字符串,字符串長度,文獻指針);功能:從指定文獻中讀入一種字符串。例如:fgets(str,n,fp);(其中str是字符數(shù)組名)含義:從fp指向文獻讀取長度為n-1字符串,最后加一種‘\0’存入字符數(shù)組str中。調用形式:第21頁練習:使用fgets(str,n,fp)函數(shù)從文獻中讀入一種字符串,下列論述錯誤是()。A)字符串讀入后會自動加入’\0’B)fp是指向該文獻文獻型指針C)fgets函數(shù)將從文獻中最多讀入n-1個字符D)fgets函數(shù)將從文獻中最多讀入n個字符D第22頁12.3.3數(shù)據(jù)塊讀寫函數(shù)一般調用形式:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);其中:buffer:是一種指針。(是起始地址)。對fread來說,它是讀入數(shù)據(jù)寄存地址。對fwrite來說,它是輸出數(shù)據(jù)地址。size:要讀寫字節(jié)數(shù)。count:要進行讀寫多少個size字節(jié)數(shù)據(jù)項。功能:對fp所指文獻讀寫buffer所指size*count個字節(jié)數(shù)據(jù)。
例如:fread(f,4,2,fp);(其中f是實型數(shù)組名)第23頁例1把數(shù)組a寫入文獻tmp;再從tmp讀入數(shù)組b。#include"stdio.h"main(){FILE*fp;inta[100]={1,5,6,78,21,34,67,87,23},b[100],i;fp=fopen("tmp","wb");
fwrite(a,sizeof(a),1,fp);/*fwrite(a,sizeof(int),100,fp);*/fclose(fp);fp=fopen("tmp","rb");
fread(b,sizeof(a),1,fp);for(puts(""),i=0;i<10;i++)printf("%6d",b[i]);fclose(fp);}第24頁練習:#include"stdio.h"main(){ FILE*pf; char*s1="china",*s2="beijing"; pf=fopen("abc.txt","w+"); fwrite(s2,7,1,pf); rewind(pf); fwrite(s1,5,1,pf); fclose(pf);}BA)chinaB)chinangC)chinabeijingD)beijingchina第25頁12.3.4格式化讀寫函數(shù)這兩個函數(shù)是進行格式讀寫文獻函數(shù)。一般調用形式:
fprintf(文獻指針,格式字符串,輸出列表);
fscanf(文獻指針,格式字符串,輸入列表);例如:fprintf(fp,“%d,%6.2f”,i,x);功能:按指定格式將數(shù)據(jù)寫到指定文獻中?;驈闹付ㄎ墨I按格式輸入數(shù)據(jù)。又如:fscanf(fp,“%d,%f”,&i,&x);第26頁練習:#include"stdio.h"main(){ FILE*pf; pf=fopen("filea.txt","w"); fprintf(pf,"abc"); fclose(pf);}若文本文獻filea.txt中原有內容為:hello,則運行以上程序后,文獻filea.txt中內容為:()CA)helloabcB)abcloC)abcD)abchello第27頁12.4文獻定位1.rewind函數(shù)一般調用形式:
rewind(文獻指針);功能:使位置指針重新返回文獻開頭,無返回值。第28頁例:有一種磁盤文獻,第一次將它內容顯示在屏幕上,第二次把它復制到另一種文獻上。#include"stdio.h"main(){ FILE*fp1,*fp2; if((fp1=fopen("f1.txt","r"))==NULL) { printf("Error!\n"); exit(0); } if((fp2=fopen("f2.txt","w"))==NULL) { printf("Error!\n"); exit(0); } while(!feof(fp1))putchar(fgetc(fp1));
rewind(fp1); while(!feof(fp1))fputc(fgetc(fp1),fp2); fclose(fp1);fclose(fp2);}第29頁2.fseek函數(shù)一般調用形式:
fseek(文獻指針,位移量,起始點);
起始點:用0、1、2或其對應名字SEEK_SET、SEEK_CUR、SEEK_END替代,分別表示文獻開始、文獻目前位置、文獻末尾。位移量:指以起始點為基點,向前移動字節(jié)數(shù)。ANSIC標準要求在數(shù)字末尾加一種字母L,表達long型。功能:把文獻讀寫位置指針移到指定位置。第30頁例如:fseek(fp,128L,0);
將位置指針移到離文獻頭128個字節(jié)處。例如:fseek(fp,-10L,2);
將位置指針從文獻末尾處向后退10個字節(jié)。注意:fseek函數(shù)一般用于二進制文獻。
第31頁3.ftell函數(shù)一般調用形式:
ftell(文獻指針);功能:返回文獻位置指針目前值。例如:pos=ftell(fp);獲取fp指向文獻目前讀寫位置,并將其值賦給變量pos。第32頁12.5小結(1)文獻是指存放在外部介質上數(shù)據(jù)集合。(2)對文獻操作包括文獻打開、關閉、讀、寫、文獻定位和犯錯檢查等。目前分別介紹如下:① 在C語言中使用fopen()函數(shù)完成對文獻打開操作。其一般調用方式為:fopen("文獻名","操作方式");② 關閉文獻用函數(shù)fclose()函數(shù)來實現(xiàn),其調用形式為:fclose(fp);第33頁文獻讀函數(shù)包括fgetc()函數(shù)、fgets()函數(shù)、fread()函數(shù)和fscanf()函數(shù)。fgetc()函數(shù)功能是從指定文獻中讀入一種字符。fgets()函數(shù)功能是從文獻指針所指向文獻中,讀入一種字符串。fscanf()函數(shù)為格式化輸入函數(shù),其功能是從指定文獻中讀取指定格式數(shù)據(jù)。fread()函數(shù)功能是從指定文獻中讀入一組數(shù)據(jù)。④ 有關寫操作函數(shù)主要有fputc()函數(shù)、fputs()函數(shù)、fwrite()函數(shù)和fprintf()函數(shù)。第34頁fputs()函數(shù),功能是將字符串寫入文獻指針所指文獻中。fputs()函數(shù)帶返回值。如輸出成功,返回值為0,不然返回文獻結束標志EOF其值為-1。fprintf()函數(shù)為格式化輸出函數(shù),其功能是把輸出數(shù)據(jù)發(fā)送到指定文獻中。fwrite()函數(shù)功能是將buffer所指向內存區(qū)域中數(shù)據(jù)寫入文獻指針fp所指文獻中,這些數(shù)據(jù)共有count項,每項長度為size個字節(jié),因此字節(jié)總數(shù)為count*size。
第35頁12.6文獻綜合實例編寫一種程序,從data.txt文本文獻中讀出一種字符,將其加密后寫入data1.txt文獻中,加密方式是字符ASCII碼加1。分析:先打開data.txt文本文獻并建立data1.txt文獻,從前者讀出一種字符c,將(c+1)%256這個ASCII碼對應字符寫入后者中。直到讀完為止。第36頁#include<stdio.h>voidmain(){FILE*fp,*fp1;charc;if((fp=fopen("data.txt","r"))==NULL){printf("不能打開文獻\n");return;}if((fp1=fopen("data1.txt","w"))==NULL){printf("不能建立文獻\n");return;}第37頁
while(!feof(fp)){c=fgetc(fp);c=(c+1)%256;fputc(c,fp1);}fclose(fp);fclose(fp);}
第38頁編寫程序,創(chuàng)建數(shù)據(jù)文獻goods.dat用于存放商品信息。已知每一種商品包括:名稱,單價,進貨量,和庫存4項數(shù)據(jù)。按指定格式讀寫,寫入5件商品信息。第39頁#include<stdio.h>main(){ intcount,amount,stock; floatprice; charname[20]; FILE*fp;if((fp=fopen(“goods.dat”,”wb”))==NULL){ printf(“cannotopenfile.\n”); exit(0);}第40頁for(count=0;;count++){ fprintf(“%d”,count+1);scanf(“%s%d%d”,name,&price,&amount,&stock); if(price==0) break;
printf(fp,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 土石方挖掘機司機操作安全考核試卷含答案
- 合成氨煤氣化工操作規(guī)范考核試卷含答案
- 瓦斯抽放工崗前安全意識強化考核試卷含答案
- 液體二氧化碳生產工安全知識宣貫模擬考核試卷含答案
- 催化重整裝置操作工安全培訓測試考核試卷含答案
- 2024年日照康養(yǎng)職業(yè)學院輔導員招聘備考題庫附答案
- 景泰藍制胎工發(fā)展趨勢考核試卷含答案
- 電機裝配工安全生產意識測試考核試卷含答案
- 戲服制作工操作規(guī)范考核試卷含答案
- 耕整地機械操作工班組評比測試考核試卷含答案
- 吉林省梅河口市五中2025-2026學年高二上學期期末語文試卷及答案
- 2026遼寧機場管理集團校招面筆試題及答案
- 2026年共青團中央所屬單位高校畢業(yè)生公開招聘66人備考題庫及參考答案詳解
- 2025徽銀金融租賃有限公司社會招聘筆試歷年典型考題及考點剖析附帶答案詳解
- 2026年遼寧軌道交通職業(yè)學院單招綜合素質筆試備考題庫帶答案解析
- 2026年6級英語模擬真題及答案
- 塔吊運行日志
- 里氏硬度計算表
- 輸電線路基礎知識輸電線路組成與型式
- GB/T 24128-2009塑料防霉性能試驗方法
- 土地買賣合同協(xié)議書模板
評論
0/150
提交評論