C語言-文件-課件_第1頁
C語言-文件-課件_第2頁
C語言-文件-課件_第3頁
C語言-文件-課件_第4頁
C語言-文件-課件_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第15講位運(yùn)算和文件復(fù)習(xí)回顧結(jié)構(gòu)類型定義:structdate{

……..};結(jié)構(gòu)類型變量定義與使用結(jié)構(gòu)變量作為函數(shù)參數(shù)結(jié)構(gòu)數(shù)組位運(yùn)算位運(yùn)算是指對(duì)二進(jìn)制位的運(yùn)算。運(yùn)算時(shí)要轉(zhuǎn)換成二進(jìn)制位運(yùn)算符和位運(yùn)算位運(yùn)算符含義規(guī)則&按位與0&0=0,0&1=0,1&0=0,1&1=1|按位或0|0=0,0|1=1,1|0=0,1|1=1^按位異或0^0=0,0^1=1,1^0=1,1^1=0~取反~0=1,~1=0<<左移高位左移后溢出,舍棄>>右移移到右端低位的被舍棄位運(yùn)算實(shí)例00000011&0000010100000001計(jì)算:3&5=1可以利用按位與運(yùn)算取二進(jìn)制的某些(個(gè))位:設(shè)計(jì)一個(gè)數(shù),將需要保留的這些位上置1,其余位置0,進(jìn)行按位與運(yùn)算。思考:有個(gè)數(shù)01010101(84),想保留左起1、2、4位?位運(yùn)算實(shí)例00000011|0000010100000111計(jì)算:3|5=7可以利用按位或運(yùn)算使二進(jìn)制的某些(個(gè))位置1:設(shè)計(jì)一個(gè)數(shù),將需要置1的這些位上置1,其余位置0,進(jìn)行按位或運(yùn)算。思考:有個(gè)數(shù)00110000,將高4位保留,低4位全部置1?位運(yùn)算實(shí)例

~0000001111111100計(jì)算:~3=-4思考:要使某個(gè)整數(shù)a的最低位為0,其余各位保留。怎么實(shí)現(xiàn)?(要保證算式對(duì)于2字節(jié)或4字節(jié)系統(tǒng)都正確)對(duì)于2字節(jié):a&0177776對(duì)于4字節(jié):a&037777777776統(tǒng)一:a&~1位運(yùn)算實(shí)例00000011^0000010100000110計(jì)算:3^5=6可以利用按位異或運(yùn)算,使特定位翻轉(zhuǎn)(1變0,0變1):設(shè)計(jì)一個(gè)數(shù),將需要翻轉(zhuǎn)的位置1,其余置0,進(jìn)行按位異或運(yùn)算。思考:將01111010低4位翻轉(zhuǎn)?位運(yùn)算實(shí)例a=15,計(jì)算a<<2=?00001111左移2位=00111100,答案為60。左移1位運(yùn)算相當(dāng)于乘以2a=64,計(jì)算a>>2=?01000000右移2位=00010000,答案為16。右移1位運(yùn)算相當(dāng)于除以2文件---學(xué)習(xí)要求掌握文件概念熟練掌握文件類型指針熟練掌握文件的打開、關(guān)閉熟練掌握文件的讀寫C文件概述文件是存儲(chǔ)在外存上的數(shù)據(jù)的集合。操作系統(tǒng)是以文件為單位進(jìn)行數(shù)據(jù)管理的。操作系統(tǒng)將輸入輸出設(shè)備看作是文件(設(shè)備文件)。例如,scanf是從終端鍵盤輸入數(shù)據(jù),終端鍵盤就是輸入文件;printf是向顯示器或打印機(jī)輸出數(shù)據(jù),顯示器或打印機(jī)就是輸出文件。程序運(yùn)行時(shí)也可以從磁盤文件中輸入數(shù)據(jù),或向磁盤文件輸出數(shù)據(jù)。C文件概述C語言把文件看成一個(gè)一個(gè)字符(字節(jié))的序列,由一個(gè)一個(gè)字符(字節(jié))的數(shù)據(jù)組成。根據(jù)數(shù)據(jù)的組織形式,C數(shù)據(jù)文件分為ASCII文件和二進(jìn)制文件。ASCII文件又稱為文本文件,每個(gè)字節(jié)放一個(gè)ASCII碼,代表一個(gè)字符。二進(jìn)制文件是把數(shù)據(jù)按內(nèi)存中的存儲(chǔ)格式進(jìn)行存放。例:整數(shù)10000ASCII文件占5個(gè)字節(jié),分別存放31H,30H,30H,30H,30H二進(jìn)制文件占4個(gè)字節(jié),分別是00H,00H,27H,10HC文件概述C數(shù)據(jù)文件是“流式文件”,是一個(gè)字節(jié)流或二進(jìn)制流。C語言中對(duì)文件的讀寫是以字節(jié)為單位的。輸入輸出的數(shù)據(jù)流的開始和結(jié)束僅受程序控制而不受物理符號(hào)(如回車符)控制。緩沖文件系統(tǒng):系統(tǒng)自動(dòng)在內(nèi)存為每一個(gè)正在讀寫的文件開辟一個(gè)緩沖區(qū)。文件的讀寫都經(jīng)過緩沖區(qū)。內(nèi)存程序數(shù)據(jù)區(qū)輸出文件緩沖區(qū)輸入文件緩沖區(qū)外存輸出輸入輸出輸入文件類型指針緩沖文件系統(tǒng)中,每個(gè)正在使用的文件都在內(nèi)存中開辟一個(gè)區(qū),用來存放文件的信息。包括文件名、文件狀態(tài)、文件當(dāng)前位置等。文件信息保存在由系統(tǒng)定義的結(jié)構(gòu)體類型FILE中。typedefstruct{shortlevel;//緩沖區(qū)滿或空的程度unsignedflags;//文件狀態(tài)標(biāo)志charfd;//文件描述符unsignedcharhold;//如無緩沖區(qū)不讀取字符shortbsize;//緩沖區(qū)大小unsignedchar*buffer;//數(shù)據(jù)緩沖區(qū)的位置unsignedchar*curp;//指針,當(dāng)前的指向unsignedistemp;//臨時(shí)文件,指示器shorttoken;//用于有效性檢查}FILE;文件類型指針可以定義FILE類型變量,存放文件信息FILEf;定義指向FILE類型的指針,通過文件指針訪問文件。FILE*fp;文件的打開和關(guān)閉對(duì)文件進(jìn)行訪問,必須先打開文件;訪問結(jié)束后應(yīng)當(dāng)關(guān)閉文件。打開文件:FILE*文件指針;文件指針=fopen(文件名,打開方式);關(guān)閉文件:fclose(文件指針);訪問方式訪問方式表示方式含義只讀“r”從文本文件輸入√只寫“w”向文本文件輸出√追加“a”向文本文件尾增加數(shù)據(jù)√只讀“rb”從二進(jìn)制文件輸入√只寫“wb”向二進(jìn)制文件輸出√追加“ab”向二進(jìn)制文件尾增加數(shù)據(jù)√讀寫“r+”為讀或?qū)懘蜷_一個(gè)文本文件讀寫“w+”為讀或?qū)懶陆ㄒ粋€(gè)文本文件讀寫“a+”為讀或?qū)懘蜷_一個(gè)文本文件讀寫“rb+”為讀或?qū)懘蜷_一個(gè)二進(jìn)制文件讀寫“wb+”為讀或?qū)懶陆ㄒ粋€(gè)二進(jìn)制文件讀寫“ab+”為讀或?qū)懘蜷_一個(gè)二進(jìn)制文件文件打開關(guān)閉舉例要想從f.dat輸入數(shù)據(jù):FILE*fp;fp=fopen(“f.dat","r");

……fclose(fp);f.dat:301101張文91301102陳慧85301103王衛(wèi)東76301104鄭偉69通知編譯系統(tǒng)要打開的文件名;當(dāng)路徑與C源文件一致時(shí),可以只寫文件名。通知編譯系統(tǒng)打開文件的方式。以“r”方式打開的文件必須存在。fp指向f.dat文件的讀:fscanf函數(shù)格式:fscanf(文件指針,格式字符串,輸入表列);例:fscanf(fp,"%d%d%d",&a,&b,&c);編程:讀出數(shù)據(jù)文件f.dat中所有數(shù)據(jù)并顯示到屏幕思考:文件為f.dat,如何讀取數(shù)據(jù)?讀到哪里保存f.dat:301101張文91301102陳慧85301103王衛(wèi)東76301104鄭偉69301105郭溫濤55思考:如果不知道有幾個(gè)數(shù)據(jù)怎么辦,如何讀取數(shù)據(jù)?函數(shù)feof(fp):檢查文件是否結(jié)束。遇文件結(jié)束返回1,否則返回0。文件的寫:fprintf函數(shù)格式:fprintf(文件指針,格式字符串,輸出表列);例:FILE*fp;fp=fopen("f1.txt","w");fprintf(fp,"%s","hello");編寫程序,將“helloworld”保存到文件f1.txt中。HelloWorldF1.txt:fscanf和fprintf小結(jié)fscanf和fprintf函數(shù)很直觀,大家可以對(duì)照scanf和printf函數(shù)掌握。多了一個(gè)文件指針參數(shù)?!皉”方式打開文件,用fscanf輸入數(shù)據(jù)?!皐”或“a”方式打開文件,用fprintf輸出數(shù)據(jù)?!皐”方式每次運(yùn)行都重新寫數(shù)據(jù),“a”方式每次運(yùn)行都追加寫數(shù)據(jù)。在輸入時(shí)將文本文件的ASCII碼數(shù)據(jù)轉(zhuǎn)為二進(jìn)制形式;在輸出時(shí)將二進(jìn)制形式數(shù)據(jù)轉(zhuǎn)為字符。運(yùn)行效率低。建議分別用fread函數(shù)和fwrite函數(shù)。實(shí)驗(yàn)指導(dǎo)其他文件讀寫函數(shù)fgetc函數(shù)和fputc函數(shù)對(duì)照getchar()和putchar(ch)每次讀寫一個(gè)字符fread和fwrtie函數(shù)用來讀寫數(shù)據(jù)項(xiàng)fgets函數(shù)和fputs函數(shù)對(duì)照gets()和puts(ch)每次讀寫一個(gè)字符串fputc和fgetc格式:fgetc(fp)fputc(ch,fp)例:文件復(fù)制:復(fù)制文本文件f.dat一份,保存為f2.dat。函數(shù)feof(fp):檢查文件是否結(jié)束。遇文件結(jié)束返回1,否則返回0。實(shí)驗(yàn)指導(dǎo)fread和fwrtie函數(shù)fread和fwrtie函數(shù)用來讀寫一個(gè)數(shù)據(jù)塊。一般形式:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);說明:buffer是指針。對(duì)fread來說是讀入數(shù)據(jù)的存放地址;對(duì)fwrite來說是輸出數(shù)據(jù)的地址。size是要讀寫的字節(jié)數(shù)(一個(gè)數(shù)據(jù)塊)count是讀寫的數(shù)據(jù)塊個(gè)數(shù)fp讀寫的文件指針如果文件以二進(jìn)制形式打開,用fread和fwrtie函數(shù)可以讀寫任何信息理解fwrite和fread函數(shù)#include<stdio.h>voidmain(){doublenum=1.0/3;FILE*p1,*p2;p1=fopen("x1.txt","w");p2=fopen("x2.txt","w");fprintf(p1,"%.2f",num);fwrite(&num,sizeof(double),1,p2);fclose(p1);fclose(p2);}雙精度的num根據(jù)輸出格式可以保存為不同字節(jié)的字符串。讀取文件時(shí),數(shù)據(jù)精度無法恢復(fù)。最精確和一致的存儲(chǔ)數(shù)字的方法是使用與程序中相同的位格式。雙精度的num應(yīng)該存儲(chǔ)在double大小的單元中。fwrite將數(shù)據(jù)存儲(chǔ)在一個(gè)與程序具有相同表示方法的文件中。沒有從數(shù)字到文本的轉(zhuǎn)換,不損失精度。用fwrite函數(shù)寫的數(shù)據(jù)相應(yīng)用fread函數(shù)讀取*fread和fwrtie函數(shù)例:將數(shù)組寫入文件inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;FILE*f;f=fopen("test.dat","w");for(p=a;p<a+10;p++)fwrite(p,sizeof(int),1,f);fclose(f);例:讀出文件中的數(shù)據(jù)inta[10],*p=a,i;FILE*f;f=fopen("test.dat","r");for(p=a;p<a+10;p++)fread(p,sizeof(int),1,f);fclose(f);for(i=0;i<10;i++)printf("%d\n",a[i]);實(shí)驗(yàn)指導(dǎo)文件小結(jié)C程序?qū)⑤斎肟醋髯止?jié)流,流的來源可以是文件、輸入設(shè)備(如鍵盤)等。同樣C程序?qū)⑤敵鲆部醋髯止?jié)流,流的目的地可以是文件、輸出設(shè)備(如顯示器)等。要存取文件,需要?jiǎng)?chuàng)建一個(gè)文件指針。類型為FILE*并將其與一個(gè)具體的文件名關(guān)聯(lián)起來。后續(xù)的代碼就可以使用這個(gè)指針而不是文件名來處理該文件。文件小結(jié)C如何解釋輸入和輸出的字節(jié)流,取決于所使用的輸入輸出函數(shù)。程序可以不加改動(dòng)地讀取或存儲(chǔ)字節(jié),也可以將字節(jié)解釋為字符。如果要在不損失精度的前提下保存或恢復(fù)數(shù)字?jǐn)?shù)據(jù),利用二進(jìn)制模式,使用fread和fwrite函數(shù)。如果不保存文本信息或是要?jiǎng)?chuàng)建可以用普通文本編輯器查看的文件,使用文本模式和諸如fprintf、fputc之類的函數(shù)。通常讀取一個(gè)文件的程序使用循環(huán)讀取輸入,直到遇到文件的結(jié)尾。文件結(jié)尾判斷的函數(shù)是feof實(shí)驗(yàn)指導(dǎo)編寫一個(gè)統(tǒng)計(jì)身高的程序。請(qǐng)求出文件“l(fā)ist.txt”(下載)中記錄的所有人的平均身高及最高的人,并把結(jié)果輸出到屏幕上。

FILE*f;charname[40];inthighest;f=fopen("list.txt","r");while(!feof(f)){fscanf(f,"%s",name);fscanf(f,"%d",&highest);

……}實(shí)驗(yàn)指導(dǎo)編寫一個(gè)名為c15_2.c的程序,其功能為,讀入文本文件test1.txt的內(nèi)容,將所有英文字母及換行符保存到新的文本文件test2.txt中。提示:

(可以參考課件“文件復(fù)制”)新建一個(gè)文本文件test1.txt,內(nèi)容自己定。用只讀方式打開文本文件test1.txt,用只寫(或讀寫)方式打開文本文件test2.txt。用fgetc函數(shù)讀入一個(gè)字符,判斷是否字母或換行符,再用fputc函數(shù)將一個(gè)字符寫入到磁盤文件。10回車,13換行if(c>=65&&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論