MATLAB读写函数一些使用说明.ppt_第1页
MATLAB读写函数一些使用说明.ppt_第2页
MATLAB读写函数一些使用说明.ppt_第3页
MATLAB读写函数一些使用说明.ppt_第4页
MATLAB读写函数一些使用说明.ppt_第5页
免费预览已结束,剩余64页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Ch18 檔案讀寫,張智星 .tw .tw/jang 清大資工系 多媒體檢索實驗室,本章重點,MATLAB 內建許多有關檔案讀寫的函數 對二進制檔案或 ASCII 檔案都可以進行處理 開啟 關閉 儲存,高階的檔案讀寫指令,先列出常用讀寫檔案指令,稍後將介紹用法,高階的檔案讀寫指令(cont),csvread,使用 csvread 指令來讀取 條件: 資料檔案是由逗號分開 只有包含數值資料 Ex:csvread01.m,fprintf(data.csv 的內容:n); type data.csv% 列出 data.csv 的

2、內容 A = csvread(data.csv)% 將 data.csv 的內容讀到矩陣 A,result,data.csv 的內容: 1, 2, 3 4, 5 6, 7, 8, 9 A = 1 2 3 0 4 5 0 0 6 7 8 9 csvread 會傳回一個數值矩陣 其中缺席的資料將以 0 填入。,dlmread,如果數值資料的分界符號(Delimiters)不是逗點,就不能使用 csvread 指令,而要改用 dlmread 指令 Ex:dlmread01.m,fprintf(data.dlm 的內容:n); type data.dlm % 列出 data.dlm 的內容 A = d

3、lmread(data.dlm, t) % 將 data.dlm 的內容讀到矩陣 A,Result,data.dlm 的內容: 123 45 6789 A = 1 2 3 0 4 5 0 0 6 7 8 9 上例中data.dlm 的資料是以定位鍵(Tab)隔開,因此 dlmread 指令的第二個引數是 t,以代表定位鍵,textread,如果檔案資料包含數值及字串,我們就必須改用 textread 指令 Ex:textread01.m,fprintf(data.txt 的內容:n); type data.txt% 列出 data.txt 的內容 name, hobby, age = text

4、read(data.txt, %s%s%d),result,data.txt 的內容: Timmy OnlineGames 13 Annie Chatrooms 10 Roger Tennis 41 name = Timmy Annie Roger hobby = OnlineGames Chatrooms Tennis age = 13 10 41,在上述範例中,data.txt 包含三個欄位(或是三直行的資料) textread 可在第二個引數指定資料型態 例如上例中 %s 代表字串,%d 代表整數 也同時將讀入的資料設定到不同的輸出引數 由於資料型態的不同,輸出引數也有不同的型態 以上述

5、範例來說,name 和 hobby 都是字串異值陣列,而 age 則是數值陣列。,使用定位鍵來分隔欄位,上例中,我們利用空格來分隔欄位 如果欄位值本身也有空格 ? 改用定位鍵來分隔欄位 Ex:textread02.m,fprintf(data2.txt 的內容:n); type data2.txt% 列出 data2.txt 的內容 name, hobby, age = textread(data2.txt, %s%s%d, delimiter, t),result,結果與前一例相同 textread 指令中加上對分界字元(Delimiters)的定義,就可以讀出由定位鍵所分隔的資料檔案 若不

6、指定時,預設為空白鍵,讀取文字檔,textread 也可以讀取一個文字檔 同時把檔案內的每一列文字變成字串異質陣列裡面的每一個元素 Ex:textread03.m,Contents = textread(textread03.m,%s,delimiter,n,whitespace,); class(contents)% 印出 contents 的資料類別 contents1% 列出 contents 第一列 contents2% 列出 contents 第二列,Result,ans = cell ans = contents=textread(textread03.m,%s,delimiter

7、,n,whitespace,); ans = class(contents)% 印出 contents 的資料類別 上例使用 textread 讀入 textread03.m(也就是此範例檔案),並顯示此檔案的第一列和第二列。 textread 指令的用法還有很多,功能也很強大 在MATLAB下輸入help textread 可以得到完整的技術支援。,Fileread,若只是要將一個檔案的內容送到一個字串,可以使用 fileread 指令 Ex:範例16-6:fileread01.m,out = fileread(data2.txt); class(out) size(out),Result,

8、ans = char ans = 1 64 上例中,fileread 指令會將檔案 data2.txt 的內容送到字串變數 out class(out) 的值是 char ,顯示 out 的資料型態是字串 size(out) 顯示字串 out 的長度是 64。,影像與音訊檔案,有關於影像檔案的讀寫,請參閱本書第十九章影像顯示與讀寫; 有關音訊檔案的讀寫,請參閱本書第二十章音訊讀寫、錄製與播放。,更繁複的檔案格式,一般情況下 盡量採取先前介紹的指令來進行讀寫。 資料格式比較繁複時 需要一列一列讀進來 再進行剖析(Parsing) 相關指令將在以下介紹。,開啟檔案,無論讀寫 ASCII 或二進制檔

9、案,都必需先用 fopen 函數來開啟檔案,語法如: fid = fopen(filename, permission) 其中 filename 表示欲讀寫的檔案名稱 permission 則表示欲對檔案進行的處理方式,可以是下列任一字串: lr:只准讀取(reading)檔案 lw:只准寫入(writing)檔案 la:只准加入(appending)檔案 la+:可讀取及加入檔案(reading and appending) 省略第二個引數,permission 的預設值就是 r。,有關fopen,在windows下,permission 字串必需能夠分辨binary或 ASCII 檔案。

10、例如:若要讀binary檔案,則 permission 字串必需是“rb” fopen 另外支援很多 permission 字串,可輸入 help fopen 得到完整的資訊。 fopen 函數傳回一個檔案辨識碼,通常是個非負的整數,我們可用此辨識碼來對此檔案進行各種讀寫的處理。,Ex:fopen01.m,上例可知當檔案不存在時,回傳的 fid 是 1 同時 message 會包含相關的錯誤資訊。,fid, message = fopen(no_such_file, r); fprintf(fid = %dn, fid); fprintf(message = %sn, message);,fi

11、d = -1 message = Sorry. No help in figuring out the problem . . .,Ex:fopen02.m,若開啟成功,則傳回的 fid 是一個大於 2 的整數,而且傳回的 message 是一個空字串,例如:,fid, message = fopen(fopen02.m, r); fprintf(fid = %dn, fid); fprintf(message = %sn, message);,fid = 3 message =,Tips:,fopen 可傳回第二個引數來顯示錯誤訊息。 為了安全起見,最好在每次使用 fopen 時,都測試其傳

12、回的 fid 是否為有效值。 MATLAB 使用 fid=1 來代表標準輸出(Standard Output) fid=2 代表標準錯誤輸出(Standard Error) 因此在使用這兩個 fid 的值時,可以不必使用 fopen 來開啟檔案。,關閉檔案,完成檔案的讀寫之後,可用 fclose 函數來關閉檔案,用法如下: status = fclose(fid); 若一切順利,fclose 傳回 0。 若無法順利關閉檔案,則 fclose 傳回 -1。 為避免因開啟檔案過多而造成系統資源浪費,一般在完成檔案的讀寫後,即應使用 fclose 來關閉檔案,Tips:,若要一次關閉所有開啟的檔案,

13、可用 fclose(all) 或是 fclose all。 開啟及關閉檔案都是比較耗時的函數,因此盡量不要將他們置於迴圈之中,以提高程式執行效率。,讀取 ASCII 檔案,fgetl 函數: 可將 ASCII 檔案的內容中的某一列讀出 並將該列的 ASCII 內容以轉成字串傳回。 Ex:fgetl01.m,fid = fopen(mean.m, r); while feof(fid)=0% feof 測試檔案指標是否已到達結束位置 line = fgetl(fid); disp(line); end,讀取 ASCII 檔案(cont),執行上述程式後,MATLAB 會 先在目前目錄找尋 mea

14、n.m 若找不到,再根據搜尋路徑,找出 mean.m 指令的位置然後再將其內容一列一列地列出。 請自行動手試用此範例程式碼。 輸入which mean可顯示檔案所在的路徑 fgets 和 fgetl 均可由檔案讀取一列資料: fgetl 會捨去換行字元 fgets 函數則保留換行字元。,應用:模擬unix的grep指令,grep :用來找出包含某一特定字串的一列,function grep(filename, pattern) fid = fopen(filename, r); line_number = 0; while feof(fid) = 0, line = fgetl(fid); m

15、atched = findstr(line, pattern); if isempty (matched) fprintf(%d: %s n, line_number,line); end line_number = line_number + 1; end fclose(fid);,result,如欲列出 grep.m 中包含 matched 字串的每一列,可輸入如下: grep(grep.m, matched) 6: matched = findstr(line, pattern); 7: if isempty (matched) 若要進行更複雜的字串比對 例如要在一個檔案中找出b 和 d

16、 中間夾1至3個母音的英文字 請參考本書姊妹作MATLAB 程式設計:進階篇中的第四章通用運算式。,fscanf,函數fscanf可對ascii檔案作更精確的讀取,用法如下: matrix = fscanf(fid, format) 其中 fid 是欲讀取之檔案的辨識碼 format 是格式指定字串(Format Specifier) 常用的格式指定字串有下列幾種: %s:字串 %d:10進位的整數 %g:雙倍精準(Double-precision)的浮點數(Floating-point Numbers) 其他各種格式指定字串可輸入 help fscanf 來得到詳細的說明,Ex:fscanf

17、01.m,有一文字檔 test.txt 如下:,1 4 9 16 25 36 49 64 81 100,欲使用 fscanf 指令讀取其內容,可輸入如下:,fid = fopen(test.txt, r); myData = fscanf(fid, %g); fclose(fid); myData% 顯示 myData,result,myData = 1 4 9 16 25 36 49 64 81 100,上例顯示了 MATLAB 的 fscanf 指令和 C 的 fscanf 指令的最大不同: MATLAB 的 fscanf 指令是向量化的(Vectorized) 只要讀入資料的型態正確,M

18、ATLAB 的 fscanf 指令會一再執行 同時把所得結果存放於一個向量並回傳。,sscanf,sscanf 函數和 fscanf 的功能很類似 sscanf 函數從字串(Strings)中讀取資料 ex:sscanf.m,str = num2str(pi, sqrt(2), log10(3)%建立一字串str retrieved = sscanf(str, %g)%擷取str中的double,str = 3.1416 1.4142 0.47712 retrieved = 3.1416 1.4142 0.4771,寫入 ASCII 檔案,fprintf 函數可將資料依格式指定字串來寫入 AS

19、CII 檔案,其使用語法如下: fprintf(fid, format, y) 其中 fid 是欲寫入之檔案的辨識碼 format 是格式指定字串,用以指定資料寫至檔案的格式 y 是 MATLAB 的資料變數 常用的格式指定字串有下列幾種: %e:科學記號,即將數值表示成 a10b 的形式 %f:固定欄寬(含整數與小數部份)的表示法 %g:自動選取 %e 或 %f 其他各種格式指定字串可輸入 help fprintf 來得到詳細的線上說明。,應用:將平方根表寫入檔案,Ex:fprintf01.m,x = 1:10; y = x; sqrt(x); fid = fopen(squareRootT

20、able.txt, w); fprintf(fid, Table of square root:rn); fprintf(fid, %2.0f = %10.6frn, y); fclose(fid); dos(start squareRootTable.txt);% 開啟 squareRootTable.txt,Result,在上例中 %2.0f 印出的總欄寬為 2,且不帶小數 %10.6f 印出的總欄寬為 10,包含 6位的小數 請自行試驗後開啟 squareRootTable.txt 來驗證,sprintf,sprintf 函數和 fprintf 函數的功能很類似 sprintf 將資料以

21、字串形式傳回 Ex:, str = sprintf(log(%f) = %en, 2, log(2),str = log(2.000000) = 6.931472e-001,暫存目錄,在某些應用上,可能需要用到暫存目錄及暫存檔案。 欲取用系統的暫存目錄,可用 tempdir如下: directory = tempdir Result: directory = C:DOCUME1jangLOCALS1Temp,暫存檔案,欲開啟一暫存檔案,可用 tempname,如下: filename = tempname Result: filename = C:DOCUME1jangLOCALS1Tempt

22、p273132,Tips,不同系統下tempdir 和 tempname會依作業系統的環境變數而產生不同的回傳字串 例如在 Windows 98 作業系統下 tempdir 傳回的字串可能是 C:windowstemp tempname 傳回的字串可能是 C:WINDOWSTEMPtp512124。,應用:產生暫存的 HTML 檔案,以下利用 tempname 產生一個暫存的 HTML 檔案,然後再將此檔案顯示在瀏覽器。 Ex: writeHTML.m,filename = tempname, .html; fid = fopen(filename, w); fprintf(fid, n);

23、fprintf(fid, This is a test homepage written by MATLAB!n); fprintf(fid, ); fclose(fid); dos(start , filename);% 啟動和 .html 相連結的應用程式,Result,上例產生之網頁如下:,當MATLAB 的計算結果可用列表(Table)或多媒體檔案(如影像、聲音、動畫等)來呈現時,由網頁來顯示這些結果是不錯的選擇。,網路檔案的讀取,MATLAB 也可以直接讀取網路上的檔案 通常我們是採用 URL(Universal Resource Locator)的方式來指定這些網路上的檔案: 一般

24、網頁: FTP ftp:/ 本機硬碟檔案: file:/C:winntmatlab.ini,urlread,上例中使用 urlread 指令來讀取筆者在清華大學資訊系的首頁 同時disp(); 將結果指定到字串變數 contents,Ex: urlread01.m,contents = urlread(.tw/jang); disp(contents);,Result, The link you just clicked is obsolete. You are being transported automatically to Roger Jang

25、s current homepage at .tw/jang. ,urlwrite,urlwrite可以直接在讀取網頁後,就儲存到本機硬碟中 Ex:urlread02.m,tempFile = tempname, .html; % 指定暫存檔案 urlwrite(.tw, tempFile); % 將網頁內容寫到檔案 dos(start , tempFile); % 開啟此檔案,Urlwrite(cont),在上例中,我們將 .tw 的網頁內容寫到一個暫存檔案 然後再使用瀏覽器開啟此檔案。 另一個和網路相關的功能 sendmail 可用來寄發電子

26、郵件 雖然這個功能和檔案讀寫沒有直接關係,但也在此一併說明。,sendmail,Sendmail 指令的用法: sendmail(TO, SUBJECT, MESSAGE, ATTACHMENTS) TO:收件者 若是只有一位收件者,可用字串表示 若是有多位收件者,可以使用字串異質陣列來表示。 SUBJECT:主題,以字串表示。 MESSAGE:電子郵件的內容,以字串表示。 ATTACHMENTS:附加檔案,用異質陣列來表示。,Ex:sendmail01.m,請將 to 的內容改為你自己本身的電子郵件,並試著執行一次,以確認此程式碼的正確性。,to = email1aaa.bbb.ccc, e

27、mail2aaa.bbb.ccc; subject = Test email from a MATLAB program; message = This is a test email sent via sendmail.; attachment = c:windowsmatlab.ini; sendmail(to, subject, message, attachment);,Tips,根據筆者在 MATLAB 6.5 的測試,sendmail 目前還不支援中文。 以上範例純粹以 MATLAB 6.5 為主 而 MATLAB 7.0 對 sendmail 新增了一些新功能 請輸入 help

28、sendmail 來獲取最新的線上支援。 若要在郵件內容加入換列,可以使用 ASCII 碼10 例如:message=Sir:, 10, This is a test。,讀取二進制資料,用fread 函數可從檔案中讀取二進制資料 fread會將每一個位元組看成一個整數,並將結果以一矩陣傳回。 例如,檔案 test2.txt 的內容如下:,This is a test!,Ex:fread01.m,Result: This is a test! char 可將 myData 的整數轉成 ASCII 字元 取 myData 的轉制是為了使印出的效果易於閱讀,fid = fopen(test2.txt

29、, r); myData = fread(fid); char(myData)% 驗證所讀入的資料是否正確 fclose(fid);,Ex:fread02.m,fread 函數可用第二個輸入引數來控制傳回矩陣的大小,fid = fopen(test2.txt, r); myData = fread(fid, 4)% 只讀 4 個位元組 fclose(fid);,myData = 84 104 105 115,Ex:fread03.m,Result: myData = 84 105 32 104 115 105 此時 myData 為 2X3 的矩陣。 p.s.上例中為長度4的向量,fid =

30、fopen(test2.txt, r); myData = fread(fid, 2 3) fclose(fid);,Fread的第3個引數,控制 fread 在將二進制資料轉成 MATLAB 矩陣時所用的精確度 包含: 一次讀取的位元數(Number of Bits) 這些位元數所代表的資料型態 常用的精準度有下列幾種:,Ex:fread04.m,Result: myData = 26708 myData2 = 26708,fid = fopen(test2.txt, r); myData = fread(fid, 1, short) fclose(fid); myData2 = bin2d

31、ec(dec2bin(abs(h),8), dec2bin(abs(T),8),說明:fread04.m,上例將 text2.txt 以短整數的方式讀入 也就是以 16 bit 為一個單位來轉換成整數 讀出來的第一個數字,會等於將 h 和 T 轉換成 8 bit,再並排成 16 bits 然後再轉換成十進位的整數值 要注意的是: 雖然原檔案的前兩個位元組是 T 和 h,但是在以 16 bits 為一個單位時 T 會是 LSB(Least Significant Bits) 而 h 則是 MSB(Most Significant Bits) 因此我們再重組成 16 bits 時,h 會在前而 T

32、 會在後。,寫入二進制檔案,fwrite 函數: 矩陣 - 二進制格式 - 寫入檔案 傳回成功寫入的個數。 以下用fwrite 產生一大小為 40 bytes 的二進制檔案 在使用 type 指令來顯示檔案內容時,看不到其內容 因為是 binary 檔案 如果 count 的值小於 10,就表示 fread 的運算有誤 Ex: fwrite01.m,fid = fopen(test.bin, w); count = fwrite(fid, randperm(10), int32); fclose(fid); type test.bin,控制檔案位置指標,檔案位置指標: 決定下一次進行資料讀取或寫入的位置。 控制此指標的函數如下: feof測試指標是否在檔案結束位置 fseek設定指標位置 ftell取得指標位置 frewind重設指標至檔案起始位置,foef,測試指標是否在檔案結束位置 Ex:feof01.m,fid = fopen(test.txt); A = fscanf(fid, %g, 3 4) feof(fid),在上例中,feof(fid) 傳回 1,表示檔案指標已經在檔案結束位置 因為 test.txt 只包含 10 個數目字。,result,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论