MATLAB編程輸入輸出函數(shù)_第1頁
MATLAB編程輸入輸出函數(shù)_第2頁
MATLAB編程輸入輸出函數(shù)_第3頁
MATLAB編程輸入輸出函數(shù)_第4頁
MATLAB編程輸入輸出函數(shù)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、目錄第丿章輸fI數(shù).3TOC o 1-5 h z HYPERLINK l bookmark4函數(shù)textread3 HYPERLINK l bookmark68.2關Fload和save命令的進一步說明4 HYPERLINK l bookmark88.3MATLAB文件過程簡介58.4文件的打開與關閉6 HYPERLINK l bookmark10fbpen函數(shù)6 HYPERLINK l bookmark12fclose函數(shù)8 HYPERLINK l bookmark148.5二進制I/O函數(shù)8 HYPERLINK l bookmark24fvzrite函數(shù)8 HYPERLINK l book

2、mark18fiead函數(shù)9例8.1讀寫二進制數(shù)據(jù)9 HYPERLINK l bookmark20測試8.111 HYPERLINK l bookmark228.6格式化I/O函數(shù)11fpnnt函數(shù)118.6.2格式轉(zhuǎn)換指定符的理解128.6.3如何使用格式字符串14例8.2產(chǎn)生一個信息表15 HYPERLINK l bookmark28fscanf函數(shù)16 HYPERLINK l bookmark30fgetl函數(shù)17 HYPERLINK l bookmark328.7格式化和二進制I/O函數(shù)的比較17例8.3格式化和二進制I/O文件的比較18測試8.2208.8文件位置和狀態(tài)函數(shù)21 HY

3、PERLINK l bookmark36exist函數(shù)21例8.4打開一個輸出文件21 HYPERLINK l bookmark38函數(shù)ferror23 HYPERLINK l bookmark40函數(shù)foef23 HYPERLINK l bookmark42函數(shù)uiimport.27 HYPERLINK l bookmark44總結29 HYPERLINK l bookmark468.10.1好的編程習慣總結29 HYPERLINK l bookmark488.10.2MATLAB總結30 HYPERLINK l bookmark50練習3030 HYPERLINK l bookmark52

4、3031313131 HYPERLINK l bookmark56313232323232第八章輸入/輸出函數(shù)在第二章中,我們已經(jīng)學到如何用load和save命令加載和保存MATLAB數(shù)據(jù),以及如何使用fpnntf函數(shù)格式化輸出數(shù)據(jù)。在本章中,我們將學習更多的關J:MATLAB輸入和輸出的功能。首先,我們將會學習函數(shù)textread,在maltab5o3中它是一個非常有用的函數(shù)。然后,我們將花更多的時間學習load和save命令。最后,我們將査看其他的MATLABI/O選擇。熟悉C語言的讀者對這部分數(shù)據(jù)將會十分的熟悉。但是,在MATLAB函數(shù)和c函數(shù)Z間有細微的不同。函數(shù)textread命令t

5、extread最早出現(xiàn)fMATLAB53中。它可以按列讀取ascii文件中的元素,每一列中可能含有不同的數(shù)據(jù)類型。這函數(shù)讀取其他程序生成的數(shù)據(jù)表時非常地有用。這個命令的形式如下a,b,c,.=textiead(filename,fonnat,n)其中filename代表耍打開的文件的名字,format是用每一行數(shù)據(jù)類型的字符串,n代表耍讀取的行數(shù)(如果沒有m則這個命令將讀完這個文件)。格式化字符串與函數(shù)fprintf格式化描述的字符串相同。注意輸出參數(shù)的個數(shù)必須與你讀取的列數(shù)相區(qū)配。例如,假設文件test_mput.dat包含F(xiàn)列數(shù)據(jù)JamesJones0+3.5122YesSallySmit

6、hA+3.2823NO這些數(shù)據(jù)用下面的函數(shù)讀取一系列的數(shù)組。first,last,blood,gpa,age,answer=textieadCtestinput.dats%s%s%f%d%s)當這個函數(shù)被編譯時產(chǎn)生如下結果first,last,blood,gpa,age,ansv/er=textreadCtest_mput.datT%s%s%s%f%d%s)first=JamesSally1last=JonesSmithblood=Q+1A+1SPa=3.51003.2800age=23answer=YesNO這個函數(shù)可以通過在格式描述符前而加一個星號的方式來跳過某些所選項。例如,卜面的語句只

7、從文件只讀取first,last和gpaofirst,last,gpa=textieadCteinput.dat,%s%s%*s%f%*d%*s)first=JamesSally1last=JonesSmithgpa=3.51003.2800函數(shù)textread要比load命令簡單有效的多。load命令假設輸入文件中的所有數(shù)據(jù)都是同一類型一它不支持在不同的列上有不同的數(shù)據(jù)。此外,它把所有的數(shù)據(jù)都存儲在一個數(shù)據(jù)中。相反地,函數(shù)textread允許每一列都有獨立的變量,當和由不同類型的數(shù)據(jù)組成的列運算時,它更加的方便。函數(shù)textread中有許許多多參數(shù),它們増加了函數(shù)的靈活性。你可通過咨詢MAT

8、LAB的在線文本得到這些參數(shù)的使用細節(jié)。常見編程錯誤應用函數(shù)text從ascii文件中按行格式讀取數(shù)據(jù),這個ascii文件可能是其他語言生成的,或是由其他的應用程序生成的,例如表格。8.2關于load和save命令的進一步說明save命令把MATLAB工作區(qū)數(shù)據(jù)存儲到硬盤,load命令把碩盤上的數(shù)據(jù)拷貝到工作區(qū)中。save命令即可用特殊的二進制格式mat-file存儲數(shù)據(jù),也可用普通的ascii碼格式存儲數(shù)據(jù)。save命令的形式為savefilenamelistofvariablesoptions如果只有save命令,那么當前工作區(qū)內(nèi)的所有數(shù)據(jù)存儲在一個名為matlabmat的文件中。如果后而

9、有一個文件名,那么這些數(shù)據(jù)將會存儲在filename.mat的文件。如果后面還包括一系列的變量,那么就只存儲這些特殊的變量。支持save命令的參數(shù)如表8.1所示。表8.1save命令的參數(shù)參數(shù)描述mat以mat文件格式存儲數(shù)據(jù)(默認)ascii用asch格式保存數(shù)據(jù)-append給已存在matf文件增加變量-v4也存儲為mat文件格式,但能被MATLAB40讀取load命令可以加載mat文件或普通的ascii文件中的數(shù)據(jù)。load命令的形式如卜,loadfilenameoption如果只有l(wèi)oad命令,MATLAB將加載matlab.mat文件中的所有數(shù)據(jù)。如果還跟著一個文件名,它load命令

10、將會加載這個文件中的數(shù)據(jù)。支持load命令的參數(shù)被列丁表8.1中。盡管它們的優(yōu)點不是十分的明顯,但是save和load命令是MATLAB中功能最強人,最有用的I/O命令。它的優(yōu)點是這些命令易于使用mat文件的平臺獨立。在一個支持MATLAB的計算機上編寫的文件,在另一種支持MATLAB的計算機上,可以被讀取。這種格式可以在PC,Mac,許多不同版本的Unix上互相轉(zhuǎn)換。mat文件高效的破盤空間使用者,它存儲數(shù)據(jù)是高精度的,在mat文件和ascii文件轉(zhuǎn)化過程中會出現(xiàn)精度卜降的情況。mat文件存儲了工作區(qū)內(nèi)的每一個變量的所有信息,包括它的類屬,名字和它是不是全局變最。在I/O其他類型數(shù)據(jù)存儲格式

11、中所有的這些信息都會丟失。例如,假設工作區(qū)包含卜而信息。whosNameSizeBytesClassa10 x10800doubleairay(global)anslxl8doublearrayb10 x10800doublearrayc2x2332cellairaystring1x1632charairaystudent1x32152structairayGrandtotalis372elementsusing4124bytes如果丁作區(qū)用saveworkspace.mat命令存儲,那么文件wospace.mat就會被自動創(chuàng)建。當這個文件被加載時,工作區(qū)中的所有信息都會被恢復,包括每一項的類

12、型和一變屋是否為全局變量。這個命令的缺點是生成的mat文件只能由MATLAB調(diào)用,其他的程序不可能利用他共享數(shù)據(jù)。如要你想要與其他程序共享數(shù)據(jù),可以應用-ascii參數(shù),但它有諸多的限制。表8.2load命令參數(shù)參數(shù)描述把文件當作mat文件看待(如果擴展名是mat,此為默認格式)-ascii把文件當作ascii格式文件來看待(如果擴展名不為mat,此為默認格式)好的編程習慣除非我們必須與非MATLAB程序進行數(shù)據(jù)交換,存儲和加載文件時,都應用mat文件格式。這種格式是高效的且移植性強,它保存了所有MATLAB數(shù)據(jù)類型的細節(jié)。save-ascii根本不能存儲單元陣列和結構數(shù)據(jù),在保存字符串之前,

13、它耍把字符串轉(zhuǎn)化相應的數(shù)字形式。loadascii命令只能加載空間獨立的數(shù)據(jù),這些數(shù)據(jù)每一行的元素個數(shù)都和等,MATLAB把所有的數(shù)據(jù)都存儲J:一個變量中,這個變屋與輸出文件同名。如果你耍用更高的要求(例如,保存和加載字符串,單元陣列或結構數(shù)組并與其它程序進行交換),那么你需要本章后面介紹的I/O命令。如果我們要加載的文件名或變鼠名是字符串,那么我們要用這些命令的函數(shù)形式。例如,下面的代碼段要求用戶提供一個文件名,并把當前工作區(qū)保存在那個文件中。filename=inputCEntersavefilename:/s1),save(filename),8.3MATLAB文件過程簡介為了使用在MA

14、TLAB程序中的文件我們需要一些方法選出我們所要的文件,并從中讀取或?qū)懭霐?shù)據(jù)。在MATLAB中有一種非常靈活的讀取/寫入文件的方法,不管這個文件是在磁盤還是在磁帶上或者是其他的存儲介質(zhì)。這種機制就叫做文件標W(fileid)(有時可簡寫為fid),當文件被打開,讀取,寫入或操作時,文件標識是賦值于一個文件的數(shù)。文件標識是一個正整數(shù)。兩種文件標識是公開的一文件標識1是標準輸出機制,文件標識2是標準錯謀機制(stdeir)o其他的文件標識,在文件打開時創(chuàng)立,文件關閉時消逝。許多的MATLAB語句可以控制磁盤文件的輸入或輸出。文件I/O函數(shù)彼總結在表83中。表8.3MATLAB輸入/輸出語句類別函數(shù)

15、描述加載/保存工作區(qū)load加載工作區(qū)save保存工作區(qū)文件打開/關閉fopen打開文件fclose關閉文件二進制I/Ofread從文件中讀取二進制數(shù)據(jù)fvznte把二進制數(shù)據(jù)寫入文件格式化I/Ofscanf從文件中讀取格式化數(shù)據(jù)fpnntf把格式化數(shù)據(jù)寫入文件fgetl讀取文件的一行,忽略換行符fgets讀取文件的一行,不忽略換行符文件位置、狀態(tài)delete刪除文件exist檢查文件是否存在feiror所需文件的I/O錯誤情況feof檢測文件的結尾fseek設置文件的位置ftell檢查文件的位置frevzind回溯文件臨時情況tempdir得到臨時目錄名tempname得到臨時文件名我們可以

16、用fopen語句把文件標識傳遞給磁盤文件或設備,用fclose語句把他們從中分開。一旦一個文件用fopen語句得到一個文件標識,我們就可以利用MATLAB輸入輸出語句。當我們對這個文件操作完后,fclose語句關閉并使文件標識無效。當文件打開時,函數(shù)Rewind和fseek常用于改變當前文件讀取和寫入的位置。在文件中讀取或?qū)懭霐?shù)據(jù)的方法有兩種方法:像二進制數(shù)據(jù)或像格式化字符數(shù)據(jù)。由實際位樣式組成的二進制數(shù)據(jù)常用J:存儲J:計算機內(nèi)存中。讀取和編寫二進制數(shù)據(jù)是非常高效的,但是用戶不能讀取存在丁文件中的數(shù)據(jù)。在格式化文件中的可以轉(zhuǎn)化為符串的數(shù)據(jù)可以由用戶直接讀取。格式化I/O操作比二進制I/O操作

17、要慢得多,效率耍低得多。在本章中,我們將討論兩種類型的I/O的操作。8.4文件的打開與關閉文件的打開與關閉函數(shù)tfopen和fclose將在本節(jié)描述。841fopen函數(shù)fopen函數(shù)打開一個文件并對返回這個文件的文件標識數(shù)。它的基本形式如卜:fid=fopen(filename,pennission)fid,message=fopen(filename,pennission)fid,message=fopen(filename,pennission,fonnat)其4*filename是或打開的文件的名字,premission用J:指定打開文件的模式,format是一個參數(shù)字符串,用J:指定

18、文件中數(shù)據(jù)的數(shù)字格式。如果文件被成功打開,在這個語句執(zhí)行之后,fid將為一個正整數(shù),message將為一個空字符。如果文件打開失敗,在這個語旬執(zhí)行之后,fid將為、message將為解釋錯誤出現(xiàn)的字符串。如果MATLAB要打開一個不為當前目錄的文件,那么MATLAB將按MATLAB搜索路徑搜索。permisson的字符串被列在表84中。對于一些如PC一樣的平臺,它更重要的是區(qū)分文本文件和二進制文件。如果文件以文本格式打開,那么一個就應加入到permission字符串中(例如“rC或“rt+”)。表8.4fopen文彳|:permissions文彳牛permission意義r以只讀格式讀取文件W

19、w+a可對文件進行讀寫刪除一個已存在文件的內(nèi)容(或創(chuàng)建一個新文件),并以只寫格式打開刪除一個已存在文件的內(nèi)容(或創(chuàng)建一個新文件),并以讀寫格式打開打開一個已存在的文件(或創(chuàng)建一個新文件),并以只寫文件格式打開把寫入的內(nèi)容增加到文件的結尾a+打開一個已存在的文件(或創(chuàng)建一個新文件),并以只寫文件格式打開把寫入的內(nèi)容增加到文件的結尾WA不進行自動洗帶的寫入數(shù)據(jù)(針刈J:磁帶機的特殊命令)不進行自動洗帶的添加數(shù)據(jù)(針對于磁帶機的特殊命令)如果是以二進制模式找開,那么“b”應加到permission字符串中(例如這實際上是不需要的,因為文件默認打開的方式是二進制模式。文本文件和二進制文件在Umx系統(tǒng)上

20、是沒有區(qū)別的,所以在這系統(tǒng)上,r和b都不需要。在fopen函數(shù)中的format字符串數(shù)據(jù)存儲在文件中的格式。當在兩計算機中傳遞互相矛盾的數(shù)據(jù)格式時,這個字符串才是必須的。一些可能的數(shù)字格式被總結在表85中。你可以從MATLABreferencemanual(參考手冊)中得到所有可能的數(shù)字格式。這個函數(shù)有兩種提供信息的格式。函數(shù)fids=fopenCall)返回一個行向量,這個行向量由當打開的所有文件的文件標識組成(除了stdcut和stderr)。在這個向量中的元素的個數(shù)與所要打開的文件的個數(shù)相等。函數(shù)filename,pennission,format=fopen(fid)對于一指定文件標識

21、的打開文件,返回它的名字,權限(permission)字符串和數(shù)字格式。卜而是一些正確應用fopen函數(shù)的例子。8.4.1.1情況1:為輸入而打開一二進制文件卜面的函數(shù)只為輸入二進制數(shù)據(jù)而打開文件exampledatefid=fopen(example.dat;T)權限(permission)字符串是“嚴,它指出這個文件的打開方式為只讀。這個字符串也可以是“rb篤但這是沒有必要的,因為MATLAB默認打開的是二進制文件。8.4.1.2情況2:為文本輸出打開一文件卜而的函數(shù)以文本輸出打開文件outdatofid=fopenCoutdatr1)或fid=fopenCoutdaV/at1)權限字符串

22、“wt”指定這個文件為新建文本文件。如果這個文件己存在,那舊文件就會被刪除,打開新建的文件等待寫入數(shù)據(jù)。如果我們耍替換先前己存在的數(shù)據(jù),那么就可以采用這個形式。權限運算符at指定一個我們想耍增加數(shù)據(jù)的文本文件。如果這個文件已經(jīng)存在了,那么它將會被打開,新的數(shù)據(jù)將會添加到已存在的數(shù)據(jù)中。如果我們不想替換已存在的數(shù)據(jù),那么就可以采用這個方式。8.4.1.3以讀寫模式打開文件卜而的函數(shù)打開文件junk,可以對它進行二進制輸入和輸出。fid=fbpenCjunk1,*1+)或fid=fopen(junkl,w+l)每一個語句與第二個語句的不同為第一句打開已存在文件,而第二個語句則會刪除已存在的文件。好

23、的編程習慣在使用fopen語句時,一定要注意指定合適的權限,這取決你是要讀取數(shù)據(jù),還是要寫入數(shù)據(jù)。好的編程習慣可以幫助你避免(類似于覆蓋的)錯誤。在試圖打開一個文件Z后,檢查錯誤是非常重要的。如果fid的值為-1,那么說明文件打開失敗。你將把這個問題報告給用戶,允許他們選擇其他的文件或跳出程序。好的編程習慣在文件打開操作后檢查它的狀態(tài)以確保它被成功打開。如果文件打開失敗,提示用戶解決方法。&42fclose函數(shù)fclose函數(shù)用關閉一文件。它的形式為status=fclose(fid)status=fcloseCall1)其中fid為文件標識,status是操作結果,如果操作成功,status

24、為0,如果操作失敗,status為。函數(shù)status=fcloseCall1)關閉了所有的文件,除了stdout(fid=1)和stderr(fid=O)。如果所有的文件關閉成功,status將為0,否則為-1。8.5二進制I/O函數(shù)二進制I/O函數(shù),fwnte和fread,將在本節(jié)討論。&51fwrite函數(shù)函數(shù)他rite以自定義格式把二進制數(shù)據(jù)寫入一文件。它的形式為count=fwnte(fid,array,precision)count=fwnte(fid,airay,precisionskip)其中fid是用J:fopen打開的一個文件的文件標識,airay是寫出變量的數(shù)組,count

25、是寫入文件變量的數(shù)目。MATLAB以列順序輸出數(shù)據(jù),它的含義為第一列全部輸出后,再輸出第二列等等。例I2如,如果array=34.那么數(shù)據(jù)輸出的順序為1,3,5,2,4,6。.56_參數(shù)precision字符串用J指定輸出數(shù)據(jù)的格式。MATLAB既支持平臺獨立的精度字符串,在所有的有MATLAB運行的電腦,它是和同的,也支持平臺不獨立的精度字符串,它們在不同類型的電腦上精度也不同。你應當只用平臺獨立的字符串,在本書中出現(xiàn)的字符串均為這種形式。表8.6MATLAB精度字符串精度字符串C/Fortan形式意義charchar*?6位字符schar1signedchar8位有符號字符uchaiJun

26、signedchar*8位無符號字符mtS1integer*?8位整數(shù)lntegeiZ16位整數(shù)mtSZ1mtegei132位整數(shù),int64,1integers164位整數(shù)uintS1integer*?8位無符號整數(shù)uintl6lntegeiZ16位無符號整數(shù)uintSZ1mtegei132位無符號整數(shù)uint641integers164位無符號整數(shù)floatSZreal*432位浮點數(shù),float64lreaS64位浮點數(shù)bitN1N位帶符號整數(shù)(1WNW64)ubitN1N位無符號整數(shù)(1WNW64)平臺獨立的精度顯示在表86中。所有的這些精度都以字節(jié)為單位,除了“bitN”和“ubit

27、N”,它以位為單位。選擇性參數(shù)skip指定在每一次寫入輸出文件Z前要跳過的字節(jié)數(shù)。在替換有固定長度的值的時侯,這個參數(shù)將非常的有用。注意如果precision是一個像“bitN”或“ubitN”的一位格式,skip則用位當作單位。&5.2fread函數(shù)函數(shù)f?ead讀取用用戶自定義格式從一文件中讀取二進制數(shù)據(jù)。它的格式如卜airay,count=fread(fid,size,precision)airay,count=fread(fid,size,precision,skip)其中fid是用fopen打開的一個文件的文件標嘰array是包含有數(shù)據(jù)的數(shù)組,count是讀取文件中變量的數(shù)目,siz

28、e是要讀取文件中變量的數(shù)目。參數(shù)size用于指定讀取文件中變量的數(shù)目。這個參數(shù)有三種形式。n準確地讀取n個值。執(zhí)行完相應的語句后,array將是一個包含有n個值的列向量Inf讀取文件中所有值。執(zhí)行完相應的語句后,array將是一個列向量,包含有從文件所有值。n,m從文件中精確定地讀取nXm個值。airay是一個nXm的數(shù)組。如果f?ead到達文件的結尾,而輸入流沒有足夠的位數(shù)寫滿指定精度的數(shù)組元素,fiead就會用最后一位的數(shù)填充,或用0填充,直到得到全部的值。如果發(fā)生了錯誤,讀取將直接到達最后一位。參數(shù)precision和size在函數(shù)f?ead和函數(shù)fvzrite中有相同的意義。例&1讀寫

29、二進制數(shù)據(jù)在本例中顯示的腳本文件創(chuàng)建了一個含有10000個隨機數(shù)的數(shù)組,以只寫方式打開一個自定義文件,用64位浮點數(shù)格式把這個數(shù)據(jù)寫入磁盤,并關閉文件。程序打開所要讀取的文件,并讀取數(shù)組,得到一個100X100的數(shù)組。它用來說明二進制I/O操作。%Scriptfile:binary_io.m%_%Purpose%Toillustratetheuseofbinaiyi/ofunctions.%Recordofrevisions%DateProgrammerDescriptionofchange-=%12/19/98S.J.ChapmanOriginalcode%Definevariables%c

30、ount%fid-Numberofvaluesread/vzntten-Fileid%filename-Filename%msg%out_airay一Openeirormessage一Outputairay%in_array-Inputairay%status一Operationstatus%Piomptforfilenamefilename=inputCEnterfilename:/s1),%Generatetliedataairayout_array=randn(l,10000),%Opentheoutputfileforwriting.fid,msg=fopen(filename,k)%

31、Wastheopensuccessful?iffid0%Wntetheoutputdata.count=fwnte(fid,out_aiTay,float64,),%Telluserdisp(intZstiCcount)1valueswritten.1),%Closethefilestatus=fclose(fid),else%OutputfileopenfailedDisplaymessage.disp(msg),end%NowtrytorecoverthedataOpenthe%fileforreadingfid,msg=fopen(filenameT),%Wastheopensucces

32、sful?iffid0%Readtheinputdata.in_array,count=fread(fid,100100,lfloat64,);%Telluserdisp(int2stim從文件中精確定地讀取nXm個值。Array是一個nXm的數(shù)組。格式字符串用指定所要讀取數(shù)據(jù)的格式。它由普通字符和格式轉(zhuǎn)換指定符。函數(shù)fscanf把文件中的數(shù)據(jù)與文件字符串的格式轉(zhuǎn)換指定符進行對比。只要兩者區(qū)配,fscanf把值進行轉(zhuǎn)換并把它存儲在輸出數(shù)組中。這個過程直到文件結束或讀取的文件當數(shù)目達到了size數(shù)組才會結束,無論那一種情況先出現(xiàn)。如果文件中的數(shù)據(jù)與格式轉(zhuǎn)換指定符不匹配fscanf的操作就會突然中

33、止。fscanf格式轉(zhuǎn)換指定符基本上與fpnntf的格式轉(zhuǎn)換指定符相同。最普通的指定符被總結在表8.10中。為了說明函數(shù)fscanf的應用,我們將試著讀取文件x.dat,在兩行中包含卜而的值。10.0020.0030.0040.001如果用卜而的語句讀取一文件z,count=fscanf(fid,%P),z值為30I,cout的值為4。1_402如果用卜而的語句讀取一文件z,count=fscanf(fid,22),10301z的值為,cout的值為4。L20403.卜一步,我們讓我們從一文件中讀取十進制小數(shù)數(shù)據(jù)。如果用卜而的語句讀取一文件z,count=fscanf(fid,Inf),z為1

34、0,count的值為lo這種情況的發(fā)生是因為10.00的小數(shù)點與格式轉(zhuǎn)義指定符不匹配,函數(shù)fscanf函數(shù)停止在第一次出現(xiàn)不匹配時。4如呆用卜而的語句讀取一文件z,count=fscanf(fid,%d.%d,lInf),z為行向量100200300400,count的值為8。這種情況的發(fā)生是因為小數(shù)點與格式轉(zhuǎn)義指定符匹配,小數(shù)點前后的數(shù)可以看作獨立的整數(shù)?,F(xiàn)在讓我們文件中讀取一個單獨的字符,如呆用卜面的語句讀取一文件z,count=fscanf(fid,%c),變斎z是一個包含文件中每一個字符的行向量,包括所有的空格和換行符!變看count等于文件中字符的個數(shù)。最后,讓我們試著從文件中讀取字

35、符串,如呆用卜面的語句讀取一文件z,count=fscanf(fid,%s);z是一個行向量,包括20個字符10.00200030004000,count為4。這種結果的產(chǎn)生是因為字符串指定符忽略空白字符,這個函數(shù)在這個文件中發(fā)現(xiàn)4個獨立的字符串。表8.10fscanf的格式轉(zhuǎn)化指定符指定符描述%c讀取一單個字符。這個字符讀取的是任意類型的字符,包括空格,換行符等%Nc讀取N個字符%d讀取一小數(shù)(忽略空格)%e%f%g讀取一浮點數(shù)(忽略空格)%i讀取一有符號數(shù)(忽略空格)%a讀取一字符串。字符串可以被空格或其他類似j:換行符的特殊符號隔開&6.5fgetl函數(shù)當作字符串來讀取。它的形式為lin

36、e是接受數(shù)據(jù)的字符數(shù)組。如果函當作字符串來讀取。它的形式為line是接受數(shù)據(jù)的字符數(shù)組。如果函函數(shù)fgetl從一文件中把卜一行(最后一行除外)line=fgetl(fid)如果fid是我們所要讀取的文件的標識(fileid)o數(shù)fgetl遇到文件的結尾,line的值為1。8.6.5fgets函數(shù)函數(shù)fgets從一文件中把卜一行(包括最后一行)line=fgets(fid)如果fid是我們所要讀取的文件的標識(fileid)o數(shù)fgets遇到文件的結尾,line的值為8.7格式化和二進制I/O函數(shù)的比較格式化I/O數(shù)據(jù)產(chǎn)生格式化文件。格式化文件夾由可組織字符,數(shù)字等組成,并以ASCH文本格式。這

37、類數(shù)據(jù)很容易辨認,因為當我們把在顯示器上把他顯示出來,或在打印機上打印出來。但是,為了應用格式化文件中的數(shù)據(jù),MATLAB程序必須把文件中的字符轉(zhuǎn)化為計算機可以直接應用的中間數(shù)據(jù)格式。格式轉(zhuǎn)換指定符為這次轉(zhuǎn)換提供了指令。格式化文件有以卜優(yōu)點:我們可以清楚地看到文件包括什么類型的數(shù)據(jù)。它還可以非常容易在不同類型的程序間進行轉(zhuǎn)換。但是也有缺點程序必須作人鼠的工作,對文件中的字符串進行轉(zhuǎn)換,轉(zhuǎn)換成相應的計算機可以直接應用的中間數(shù)據(jù)格式。如果我們讀取數(shù)據(jù)到其他的MATLAB程序,所有的這些工作都會造成效率浪費。而且一個數(shù)的計算機可以直接應用的中間數(shù)據(jù)格式要比格式化文件中的數(shù)據(jù)要人得多。例如,一個64位

38、浮點數(shù)的中間數(shù)據(jù)格式需要8個字節(jié)的內(nèi)存。而格式化文件中的字符串表達形為土d.ddddddddddddddEee,它將需耍21個字節(jié)。所以用字符格式存儲數(shù)據(jù)是低效的且浪費磁盤空間。無格式化文件(二進制文件)克服上而的缺點,它其中的數(shù)據(jù)無需轉(zhuǎn)化,就可以把內(nèi)存中的數(shù)據(jù)寫入磁盤。因為沒有轉(zhuǎn)化發(fā)生,計算機就沒有時間浪費在格式化數(shù)據(jù)上。在MATLAB中,二進制I/O操作要比格式化I/O操作快得多,因為它中間沒有轉(zhuǎn)化。進一步說,數(shù)據(jù)占用的磁盤空間將更小。從另一方面來說,無格式的數(shù)據(jù)不能進行人工檢査和人工翻譯。還有,它不能移植到不同類型的計算機,因為不同類型的計算機有不同中間過程來表示整數(shù)或浮點數(shù)。表811顯

39、示了格式化文件與無格式化文件的區(qū)別。在一般情況廠格式化文件,對于那些必須進行人工檢査的數(shù)據(jù),或刈那些必須在不同的計算機上運行的數(shù)據(jù),是最好的選擇。對J:那些不需要進行人工檢查的數(shù)據(jù)且在相同類型的計算機創(chuàng)建并運行的數(shù)據(jù),存儲最好用無格式文件。在這些壞境卜,無格式文件運算要快得多,占用的磁盤空間更小。好的編程習慣對J那些必須進行人工檢查的數(shù)據(jù),或?qū):那些必須在不同的計算機上運行的數(shù)據(jù),用格式化文件創(chuàng)建數(shù)據(jù)。對j:那些不需耍進行人工檢查的數(shù)據(jù)且在和同類型的計算機創(chuàng)建并運行的數(shù)據(jù),用無格式文件創(chuàng)建數(shù)據(jù),當I/O速度緩慢時,用格式化文件創(chuàng)建數(shù)組。表8.11格式化文件和無格式化文件的比較格式化文件無格式

40、化文件能在輸出設備顯示數(shù)據(jù)能在不同的計算機上很容易地進行移植相刈哋,需要人量的磁盤空間慢:需要大量的計算時間在進行格式化的過程中,產(chǎn)生截斷誤差或四舍五入錯誤不能在輸出設備顯示數(shù)據(jù)不能在不同的計算機上很容易地進行移植相對地,需耍較少的磁盤空間快:需耍較少的計算時間不會產(chǎn)生截斷誤差或四舍五入錯誤例&3格式化和二進制I/O文件的比較在這個例子中的程序比較了用格式化和二進制I/O操作讀寫一個含10000個元素數(shù)組所花的時間。注意每一個操作運行10次求平均值。%Scriptfile:comparem%Purpose%TocomparebinaiyandfoiTnattedI/Ooperations%Th

41、isprogramgeneratesanairayof10,000random%valuesandwritesittodiskbotliasabinaiyand%asafonnattedfile.%Recordofrevisions:%DateProgrammerDescriptionofchange一=%12/19/98S.J.ChapmanOriginalcode%Definevariables%count%fid%in_array%msg%out_array%status%time-Numberofvaluesread/written-Fileid一Inputarray一Openeiro

42、rmessage-Outputairay一Operationstatus-Elapsedtimeinseconds%Generatethedataairay.%out_array=randn(l,10000),%First,timethebinaiyoutputoperation%Resettimertic,%Loopfor10timesforii=1:10%Openthebinaiyoutputfileforw門ting.fid,msg=fopen(Unformatted,datjw),%Wntethedatacount=fwnte(fid,out_aiTay,float64欣%Closet

43、hefilestatus=fclose(fid),end%Gettheaveragetimetime=toe/10,fpnntf(Writetimeforunfonnattedfile=%63fn:time),%Next,timethefonnattedoutputoperation.%Resettimertic,%Loopfor10timesforii=1:10%Openthefonnattedoutputfileforwriting.fid,msg=fopen(formatted.datWt1),%Wntethedatacount=fprintfCfidJZS.15en:out_aiTay

44、),%Closethefilestatus=fclose(fid),end%Gettheaveragetimetime=toe/10,fprintf(WritetimeforfoiTnattedfile=%63fn,time),%Timetliebinaryinputoperation%Resettimertic,%Loopfor10timesforii=1:10%Openthebinaiyfileforreadingfid,msg=fopen(unfonnatted.datJr),%Readthedatain_airay,count=fread(fid,Inffloat64,),%Close

45、thefilestatus=fclose(fid),end%Gettheaveragetimetime=toe/10,fprintf(Readtimeforunfonnattedfile=%6.3fn,tune),%Timethefonnattedinputoperation.%Resettimertic,%Loopfor10timesforh=1:10%Openthefonnattedfileforreading.fid,msg=fopen(fonnatteddat/rt),%Readthedatain_airay,count=fscanf(fid,%fInf),%Closethefiles

46、tatus=fclose(fid),end%Gettheaveragetimetime=toe/10,fprintf(Readtimeforformattedfile=%63fn,time)當程序在奔騰733MHz機器上運行,操作系統(tǒng)為windowsNTZOOO專業(yè)版,得到的結果為compareWntetimeforunfonnattedfile=0.002Wntetimeforfonnattedfile=0.132Readtimeforunfonnattedfile=0002Readtimeforfonnattedfile=0157寫入磁盤的文件如卜所示:D:hlATLABworkchap8

47、dn驅(qū)動器D中的卷是SINSTALL卷的序列號是C33D-3233DMATLABworkchap8的目錄2008-01-172008-01-172008-01-172008-01-1718:5818:5818:5118:51個文件個目錄250,000formatted,dat80,000unfonnatted.dat330,000字節(jié)2,495,549,440可用字節(jié)注意寫入格式化文件數(shù)據(jù)所需的時間是無格式文件的60倍,記取時間是無格式文件的75倍。還有格式化文件的人小是無格式文件的3倍。得到的結果是非常清楚的,除非你真得需耍格式化數(shù)據(jù),否則二進制I/O操作是MATLAB中存儲數(shù)據(jù)的一個非常好

48、的方法。測試&2本測試提供了一個快速的檢查方式,看你是否掌握了8到8.5的基本內(nèi)容。如果你對本測試有疑問,你可以重讀8.1到85問你的老師,或和同學們一起討論。在附錄B中可以找到本測試的答案。格式化和二進制I/O操作的區(qū)別是什么?什么時侯我們應當用格式化I/O操作?什么時侯我們應當有二進制I/O操作?編寫MATLAB語句創(chuàng)建一個表,由x的正弦值和余弦值(x=0,0.lpi,pi),在表上有標題和標簽??吹?題和第5題,判斷MATLAB語句是否正確。如果有錯誤,指出錯在那里。a=2*pi,b=6;c=hello,fpnntf(fid,%s%d%gn,a,b,c),datal=1:20,data?

49、=1:20,fid=fopen(lxxx,W+為fvznte(fid,datal);fpnntf(fid,%gndataZ),8.8文件位置和狀態(tài)函數(shù)正如我們前面所陳述的,MATLAB文件是連續(xù)的一它們從第一條記錄開始一直讀到最后一條記錄。但是,有時在一個程序中,我們需要多次調(diào)用一段數(shù)據(jù)或整個文件。在一個連續(xù)文件中,我們?nèi)绾翁^無用的數(shù)據(jù)呢?在打開文件之前,MATLAB函數(shù)exist用丁判斷這個文件是否存在。一旦一個文件打開,我們就可以用函數(shù)feof和flell判斷當前數(shù)據(jù)在文件中的位置。還用兩個函數(shù)幫助我們在文件中移動:Rewind和fseeko最后,當程序發(fā)生I/O錯誤時,MATLAB函數(shù)

50、fens將會對這個錯誤進行詳盡的描述。我們現(xiàn)在將向人家詳細的介紹這6個函數(shù),我們先看一卜feiTor,因為它可以應用其他的函數(shù)中。&1exist函數(shù)exist函數(shù)用來檢測工作區(qū)中的變量,內(nèi)建函數(shù)或MATLAB搜索路徑中的文件是否存在。它的形式如卞ident=existCitem),ident=existCitem,kind),如果item存在,函數(shù)就根據(jù)它的類型返回一個值??赡艿慕Y果被顯示在表8.12中。函數(shù)exist指定所耍搜索的條目(item)的類型。它的合法類型為uvarfile,builtin和“di嚴。函數(shù)exist是非常重要的,因為我們可以利用它判斷一個文件否存在。當文件被打開時,

51、fopen函數(shù)中權限運算符W和“w+”會刪除文件已有的一個文件。在程序員允許fopen函數(shù)刪除一個文件時,它必須征得用戶的同意。表8.12由函數(shù)exist的返回值值意義0沒有發(fā)現(xiàn)條目1條目為當前工作區(qū)的一個變最2條目為H1文件或未知類型的文件3條目是一個MEX文件4條目是一個MDL文件5條目是一個內(nèi)建函數(shù)6條目是一個p代碼文件7條目是一個目錄例&4打開一個輸出文件這個程序從用戶那里得到輸出文件名,并檢查它是否存在。如果存在,就詢問用戶是耍把用新數(shù)據(jù)覆蓋這個文件,還是要把新的數(shù)據(jù)添加到這個文件中。如果這個文件不存在,那么這個程序就會很容易地打開輸出文件。%Scriptfileoutputm%Pu

52、rpose%Todemonstrateopeninganoutputfileproperly.%Thisprogramchecksfortheexistenceofanoutput%fileIfitexists,theprogramcheckstoseeif%theoldfileshouldbedeleted,oriftlienewdata%shouldbeappendedtotheoldfile%Recordofrevisions:%DateProgrammerDescriptionofchange一%11/29/98S.J.ChapmanOnginalcode%Definevariable

53、s%fid-Fileid%out_filename-Outputfilename%yn-Yes/Noresponse%Gettheoutputfilenameout_filename=mputCEnteroutputfilename:/s),%Checktoseeifthefileexistsifexist(out_filename,file)%Thefileexistsdisp(Outputfilealreadyexists.1),yn=input(Keepexistingfile?(y/n)7S,)ifyn=dfid=fopen(out_filename,elsefid=fopen(out

54、_filename,at),endelse%Filedoesntexistfid=fopen(out_filename,wt欣end%OutputdatafprintfCfid/sXndate),%Closefilefclose(fid),當這個程序執(zhí)行后,產(chǎn)生的結果為outputEnteroutputfilename:xxxtypexxx17-Jan-2008outputEnteroutputfilename:xxxOutputfilealreadyexists.Keepexistingfile?(y/n)ytypexxx17-Jan-200817-Jan-2008outputEnterou

55、tputfilename:xxxOutputfilealreadyexists.Keepexistingfile?(y/n)ntypexxx17-Jan-2008三種不同的情況均產(chǎn)生了正確的結果o好的編程習慣未經(jīng)用戶同意,不耍用新數(shù)據(jù)覆蓋原用的文件。函數(shù)ferror在MATLAB的I/O系統(tǒng)中有許多的中間數(shù)據(jù)變量,包括一些專門提示與每一個打開文件相關的錯謀的變量。每進行一次I/O操作,這些錯誤提示就會被更新一次。函數(shù)ferror得到這些錯誤提示變量,并把它轉(zhuǎn)化為易J:理解的字符信息。message=feiTor(fid)message=feiTor(fid,clear1)message,ern

56、ium=feiror(fid)這個函數(shù)會返回與fid相對應文件的人部分錯誤信息。它能在I/O操作進行后,隨時彼調(diào)用,用來得到錯誤的詳細描述。如果這個文件彼成功調(diào)用,產(chǎn)生的信息為錯誤數(shù)為Oo對于特殊的文件標識,參數(shù)“clear”用于清除錯誤提示。函數(shù)foef函數(shù)feof用檢測當前文件的位置是否是文件的結尾。它的形式如卜eofstat=feof(fid)如果是文件的結尾,那么函數(shù)返回1,否則返回0。函數(shù)ftell函數(shù)ftell返回fid對應的文件指針讀/寫的位置。這個位置是一個非負整數(shù),以byte為單位,從文件的開頭開始計數(shù)。返回值代表位置詢問不成功。如果這種情況發(fā)生了,我們利用ferror得知為

57、什么詢問不成功。函數(shù)的形式如卜:position=仕ell(fid)函數(shù)frewind函數(shù)Rewind允許程序把文件指針復位到文件的開頭,形式如卜fievzind(fid)這個函數(shù)不返回任何狀態(tài)信息。函數(shù)fseek函數(shù)fseek允許程序把文件指針指向文件中任意的一個位置。函數(shù)形式如卜status=fseek(fid,offset,origin)函數(shù)用offsett和origin來重應fid對應文件的文件指針。offset以字節(jié)為單位,帶有一個正數(shù),用丁指向文件的結尾,帶有一個負數(shù),用于指向文件的開頭。origin是一個字符串,取值為下面三個中的一個?!癰of”文件的開始位置“cof”指針中的當

58、前位置“eof”文件的結束位置如果這個操作成功,status的值為0,如果操作失敗status為-1。如果status為用函數(shù)feiTor判斷錯誤出現(xiàn)在那里。舉一個例子,用說明fseek和feiror的聯(lián)合應用,考慮卜面的語句。fid,msg=fopenCx1,r1),status=fseek(fid,-10,bof),ifstatusy0msg=feriorCfid),disp(msg),end這些命令打開了一個文件,并把文件指針設置在文件開始之前的10個字節(jié)上面。這是不可能,所以fseek將會返回一個亠用feiTOP得到對應的錯誤信息。當這些語句被編譯時,產(chǎn)生下面的錯誤信息。Offseti

59、sbad-beforebeginning-of-file.例8.5用一系列帶有噪聲的值擬合一條直線在例4.7中,我們學習了用最小二乘法擬合直線y=mx+b(8.1)確定待定系數(shù)m和b的標準方法為最小二乘法。之所以稱為最小二乘法,是因為根據(jù)偏差的平方和為最小的條件來選擇常數(shù)m和b的。公式如卜1(82)_心,m(Ex)-(Ex)xb=y-mx(8.3)其中,D代表所有測最值X之和,力,代表所有測最值y之和,初:代表所有對應的X與y的乘積之和,X代表測值量X的數(shù)學期塑,y代表測值量y的數(shù)學期望。編寫一個程序,用最小二乘法計算出加和札其中有一系列含有噪聲的數(shù)據(jù)幺丿)存儲在輸入數(shù)據(jù)文件中。答案陳述問題用

60、最小二乘法計算直線的截距b和斜率加,輸入值任意數(shù)目的(x,y)坐標對。輸入值(x,y)被存儲在用戶自定義輸入文件中。定義輸入輸出值程序所需的輸入值是(x,y)坐標對,x,y均為實數(shù),每一個點都存儲在磁盤文件獨立的行中,輸出是用最小二乘法計算出的直線的截距b和斜率加。算法描述本程序可以分為以卜四人步驟GetthenameoftheinputfileandopenitAccumulatetheinputstatisticsCalculatetheslopeandinterceptWnteouttheslopeandmteixept這個程序的第一人步得到輸入文件的名字并打開這個文件。為了做到這一點,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論