69
MATLAB 程程程程程程程 程程程程 程程程 (Roger Jang) [email protected] http://mirlab.org/jang 程程程程程 程程 程程程程程

MATLAB 程式設計入門篇 檔案讀寫

  • Upload
    eytan

  • View
    126

  • Download
    0

Embed Size (px)

DESCRIPTION

MATLAB 程式設計入門篇 檔案讀寫. 張智星 (Roger Jang) [email protected] http://mirlab.org/jang 清大資工系 多媒體檢索實驗室. 本章重點. 很多計算工作的第一步就要是讀取資料 MATLAB 內建許多有關檔案讀寫的函數,可對二進制檔案或 ASCII 檔案進行下列處理: 開啟 關閉 儲存. 高階的檔案讀寫指令( 1/2 ). 先列出常用讀寫檔案指令,稍後將介紹用法. 高階的檔案讀寫指令( 2/2 ). csvread. 使用 csvread 指令來讀取 條件: 資料檔案是由 逗號 分開 - PowerPoint PPT Presentation

Citation preview

Page 1: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇檔案讀寫

張智星 (Roger Jang)[email protected]

http://mirlab.org/jang清大資工系 多媒體檢索實驗室

Page 2: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

本章重點 很多計算工作的第一步就要是讀取資料 MATLAB 內建許多有關檔案讀寫的函數,可對二進制檔案或 ASCII 檔案進行下列處理: 開啟 關閉 儲存

Page 3: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

高階的檔案讀寫指令( 1/2 ) 先列出常用讀寫檔案指令 ,稍後將介紹用法

類別 支援檔案格式 指令

一般資料

MAT - MATLAB workspace load, save

CSV - Comma separated numbers csvread, csvwrite

DAT - Formatted text Importdata

DLM - Delimited textdlmread, dlmwrite

TAB - Tab separated text

試算表XLS - Excel worksheet Xlsread

WK1 - Lotus 123 worksheet wk1read, wk1write

Page 4: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

高階的檔案讀寫指令( 2/2 )

類別 支援檔案格式 指令

科學資料

CDF - Common Data FormatFITS - Flexible

cdfread, cdfwrite

Image Transport System Fitsread

HDF - Hierarchical Data Format hdfread, hdfwrite

電影 AVI - Movie aviread

影像TIFF, PNG, HDF, BMP, JPEG, GIF, PCX, XWD, CUR, ICO, RAS, PBM,

PGM, PPMimread, imwrite

音訊AU, SND - NeXT/Sun sound auread, auwrite

WAV - Microsoft Wave sound wavread, wavwrite

Page 5: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

csvread 使用 csvread 指令來讀取 條件 :

資料檔案是由逗號分開 只有包含數值資料

Ex:csvread01.m

fprintf('data.csv 的內容: \n');

type data.csv % 列出 data.csv 的內容

A = csvread('data.csv') % 將 data.csv 的內容讀到矩陣 A

Page 6: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

執行結果data.csv 的內容:

1, 2, 34, 56, 7, 8, 9

A =1 2 3 04 5 0 06 7 8 9

csvread 會傳回一個數值矩陣 其中缺席的資料將以 0 填入。

Page 7: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

dlmread 如果數值資料的分界符號( Delimiters )不是逗點,就不能使用 csvread 指令,而要改用 dlmread 指令

Ex:dlmread01.m

fprintf('data.dlm 的內容: \n');

type data.dlm % 列出 data.dlm 的內容

A = dlmread(‘data.dlm’, ‘\t’) % 將 data.dlm 的內容讀到矩陣 A ,資料是以定位鍵隔開,

Page 8: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

執行結果data.dlm 的內容:

1 2 34 56 7 8 9

A =1 2 3 04 5 0 06 7 8 9

上例中 data.dlm 的資料是以定位鍵( Tab )隔開,因此 dlmread 指令的第二個引數是 ‘ \t’,以代表定位鍵

Page 9: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

textread

如果檔案資料包含數值及字串,我們就必須改用 textread 指令

Ex:textread01.m

fprintf('data.txt 的內容: \n');type data.txt % 列出 data.txt 的內容[name, hobby, age] = textread('data.txt', '%s%s%d')

Page 10: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

執行結果data.txt 的內容:Timmy OnlineGames

13Annie Chatrooms 10Roger Tennis 41name = 'Timmy‘ 'Annie' 'Roger'hobby = 'OnlineGames' 'Chatrooms' 'Tennis'age = 13 10 41

在上述範例中, data.txt 包含三個欄位(或是三直行的資料)textread 可在第二個引數指定資料型態

例如上例中 %s 代表字串,%d 代表整數

也同時將讀入的資料設定到不同的輸出引數

由於資料型態的不同,輸出引數也有不同的型態

以上述範例來說, name 和 hobby 都是字串異值陣列,而 age 則是數值陣列。

Page 11: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

使用定位鍵來分隔欄位 上例中,我們利用空格來分隔欄位 如果欄位值本身也有空格 ?

一般常見的作法,是使用定位鍵來分隔欄位 Ex:textread02.m

fprintf('data2.txt 的內容: \n');

type data2.txt % 列出 data2.txt 的內容

[name, hobby, age] = textread('data2.txt', '%s%s%d', 'delimiter', '\t')

Page 12: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

執行結果 結果與前一例相同 textread 指令中加上對分界字元

( Delimiters )的定義,就可以讀出由定位鍵所分隔的資料檔案

若不指定時,預設為空白鍵

Page 13: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

讀取文字檔 textread 也可以讀取一個文字檔,同時把檔案內的每一列文字變成字串異質陣列裡面的每一個元素

Ex:textread03.mContents = textread('textread03.m','%s','delimiter','\n','whitespace','');

class(contents) % 印出 contents 的資料類別

contents{1} % 列出 contents 第一列

contents{2} % 列出 contents 第二列

Page 14: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

執行結果ans =

cellans =

contents=textread('textread03.m','%s','delimiter','\n','whitespace','');

ans =class(contents) % 印出 contents 的資料類別

上例使用 textread 讀入 textread03.m (也就是此範例檔案),並顯示此檔案的第一列和第二列。

textread 指令的用法還有很多,功能也很強大 在 MATLAB 下輸入「 help textread 」,可以得到完整的技術支援。

Page 15: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

Fileread 若只是要簡單地將一個檔案的內容送到一個字串,可以使用 fileread 指令

Ex: 範例 16-6 : fileread01.m

out = fileread(‘data2.txt’);class(out)size(out)

Page 16: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

執行結果ans =

charans =

1 64

上例中, fileread 指令會將檔案 data2.txt 的內容送到字串變數 out class(out) 的值是 char ,顯示 out 的資料型態是字串

size(out) 顯示字串 out 的長度是 64 。

Page 17: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

影像與音訊檔案 有關於影像檔案的讀寫,請參閱本書第十九章「影像顯示與讀寫」;

有關音訊檔案的讀寫,請參閱本書第二十章「音訊讀寫、錄製與播放」。

Page 18: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

更繁複的文字檔案格式

一般情況下 盡量採取先前介紹的內建指令來進行讀寫,效率才會高。

資料格式比較繁複時 需要一列一列讀進來,再進行剖析( Parsing ) 相關指令將在以下介紹。

Page 19: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

開啟檔案 無論讀寫 ASCII 或二進制檔案,都必需先用 fopen 函數來開啟檔案,語法如:

fid = fopen(filename, permission) 其中 filename 表示欲讀寫的檔案名稱 permission 則表示欲對檔案進行的處理方式,可以是下列任一字串:

l ‘r’:只准讀取( reading )檔案 l ‘w’:只准寫入( writing )檔案 l ‘a’:只准加入( appending )檔案 l 'a+' :可讀取及加入檔案( reading and

appending )

省略第二個引數, permission 的預設值就是 ‘ r’。

Page 20: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

有關 fopen 在 windows 下, permission 字串必需能夠分辨 binary 或 ASCII 檔案。 例如 : 若要讀 binary 檔案,則 permission 字串必需是“ rb”

fopen 另外支援很多 permission 字串,可輸入 「 help fopen 」 得到完整的資訊。

fopen 函數傳回一個檔案辨識碼(通常是個大於 2 的整數),我們可用此辨識碼來對此檔案進行各種讀寫的處理。

Page 21: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

Ex:fopen01.m

上例可知當檔案不存在時,回傳的 fid 是 – 1 同時 message 會包含相關的錯誤資訊。

[fid, message] = fopen('no_such_file', 'r');

fprintf('fid = %d\n', fid);

fprintf('message = %s\n', message);

fid = -1

message = Sorry. No help in figuring out the problem . . .

Page 22: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

Ex:fopen02.m 若開啟成功,則傳回的 fid 是一個大於 2 的整數,而且傳回的 message 是一個空字串,例如:

[fid, message] = fopen('fopen02.m', 'r');fprintf('fid = %d\n', fid);fprintf('message = %s\n', message);fid = 3message =

Page 23: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

提示 為了安全起見,最好在每次使用 fopen 時,都測試其傳回的 fid 是否為有效值。

輸出位置 MATLAB 使用 fid=1 來代表「標準輸出

( Standard Output ) fid=2 代表「標準錯誤輸出」( Standard Error ) 若使用 fid=1 或 2 時,可不使用 fopen 來開啟檔案 Try this to see their difference:

fprintf(1, 'This is standard output!\n'); fprintf(2, 'This is standard error!\n');

Page 24: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

關閉檔案 完成檔案的讀寫之後,記得要使用 fclose 函數來關閉檔案,用法如下: status = fclose(fid);

若一切順利, fclose 傳回 0 。 若無法順利關閉檔案,則 fclose 傳回 -1 。 為避免因開啟檔案過多而造成系統資源浪費,一般在完成檔案的讀寫後,即應使用 fclose 來關閉檔案

Page 25: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

提示 若要一次關閉所有開啟的檔案,可用

fclose('all') 或是 fclose all 。 開啟及關閉檔案都是比較耗時的函數,因此盡量不要將他們置於迴圈之中,以提高程式執行效率。

Page 26: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

讀取 ASCII 檔案( 1/2 ) fgetl 函數 :

可將 ASCII 檔案的內容中的某一列讀出 並將該列的 ASCII 內容以轉成字串傳回。 Ex:fgetl01.m

fid = fopen('mean.m', 'r');

while feof(fid)==0 % feof 測試檔案指標是否已到達結束位置

line = fgetl(fid);

disp(line);

end

Page 27: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

讀取 ASCII 檔案( 2/2 ) 執行上述程式後, MATLAB 會…

先在目前目錄找尋 mean.m 若找不到,再根據搜尋路徑,找出 mean.m 指令的位置然後再將其內容一列一列地列出。

輸入「 which mean 」可顯示檔案所在的路徑 fgets 和 fgetl 均可由檔案讀取一列資料:

fgetl 會取得一列,但不包含換列字元 fgets 則保留換列字元

Page 28: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

應用 :模擬 unix 的 grep 指令 grep : 用來找出包含某一特定字串的一列

function grep(filename, pattern)fid = fopen(filename, 'r');line_number = 0;while feof(fid) == 0,

line = fgetl(fid);matched = findstr(line, pattern);if ~isempty (matched)

fprintf('%d: %s \n', line_number,line);endline_number = line_number + 1;

end

fclose(fid);

Page 29: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

執行結果 如欲列出 grep.m 中包含 'matched' 字串的每一列,可輸入如下:

>> grep('grep.m', 'matched') 6: matched = findstr(line, pattern); 7: if ~isempty (matched)

若要進行更複雜的字串比對,請參考本書姊妹作「 MATLAB 程式設計:進階篇」中的第四章「通用運算式」。 例如要在一個檔案中找出「 b 和 d 中間夾 1至 3 個母音」的英文字

Page 30: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

fscanf 函數 fscanf 可對 ascii 檔案作更精確的讀取,用法如下:

matrix = fscanf(fid, format) 其中 fid 是欲讀取之檔案的辨識碼 format 是格式指定字串( Format

Specifier ) 常用的格式指定字串有下列幾種:

%s :字串 %d : 10 進位的整數 %g :雙倍精準( Double-precision )的浮點數

其他各種格式指定字串可輸入 help fscanf 來得到詳細的說明

Page 31: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

Ex:fscanf01.m 有一文字檔 test.txt 如下 :

1 4 9 16 2536 49 64 81 100

欲使用 fscanf 指令讀取其內容,可輸入如下:

fid = fopen('test.txt', 'r');

myData = fscanf(fid, '%g');

fclose(fid);

myData % 顯示 myData

Page 32: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

執行結果myData =

1

4

9

16

25

36

49

64

81

100

上例顯示了 MATLAB 的 fscanf 指令和 C 的 fscanf 指令的最大不同:

MATLAB 的 fscanf 指令是向量化的( Vectorized )只要讀入資料的型態正確, MATLAB 的 fscanf 指令會一再執行同時把所得結果存放於一個向量並回傳。

Page 33: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

sscanf sscanf 函數和 fscanf 的功能很類似 sscanf 函數從字串( Strings )中讀取資料 ex : sscanf01.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

Page 34: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

寫入 ASCII 檔案 fprintf 函數可將資料依格式指定字串來寫入

ASCII 檔案,其使用語法如下: fprintf(fid, format, y)

其中 fid 是欲寫入之檔案的辨識碼 format 是格式指定字串,用以指定資料寫至檔案的格式 y 是 MATLAB 的資料變數 常用的格式指定字串有下列幾種:

%e :科學記號,即將數值表示成 a×10b 的形式 %f :固定欄寬(含整數與小數部份)的表示法 %g :自動選取 %e 或 %f

其他各種格式指定字串可輸入 help fprintf 來得到詳細的線上說明。

Page 35: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

應用 : 將平方根表寫入檔案 Ex:fprintf01.m

x = 1:10;

y = [x; sqrt(x)];

fid = fopen('squareRootTable.txt', 'w');

fprintf(fid, 'Table of square root:\r\n');

fprintf(fid, '%2.0f => %10.6f\r\n', y);

fclose(fid);

dos('start squareRootTable.txt'); % 開啟 squareRootTable.txt

Page 36: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

執行結果 在上例中…

%2.0f 印出的總欄寬為 2 ,且不帶小數 %10.6f 印出的總欄寬為 10 ,包含 6 位的小數 請自行試驗後開啟 squareRootTable.txt 來驗證

squareRootTable.txt

Page 37: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

sprintf sprintf 函數和 fprintf 函數的功能很類似 sprintf 將資料以字串形式傳回 Ex:

>> str = sprintf('log(%f) = %e\n', 2, log(2))str =

log(2.000000) = 6.931472e-001

Page 38: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

暫存目錄 某些應用需要用到暫存目錄及暫存檔案。(例如:產生一個 html 檔案,再使用瀏覽器開啟。)

欲取用系統的暫存目錄,可用 tempdir 如下:>> directory = tempdir

Result:directory =C:\Users\jang\AppData\Local\Temp\

Page 39: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

暫存檔案 欲開啟一暫存檔案,可用 tempname ,如下:>> filename = tempname Result:

filename = C:\Users\jang\AppData\Local\Temp\tpda998b2b_cb6f_4b68_9814_6dbab1d44abd

Page 40: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

提示 上述範例是在 Windows 7 進行測試 不同系統下 tempdir 和 tempname 會依作業系統的環境變數而產生不同的回傳字串

若是在 Windows 98 作業系統下 tempdir 傳回的字串可能是

’C:\windows\temp\’ tempname 傳回的字串可能是

’C:\WINDOWS\TEMP\tp512124’。

Page 41: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案應用 :產生暫存的 HTML 檔案

以下利用 tempname 產生一個暫存的 HTML 檔案,然後再將此檔案顯示在瀏覽器。

Ex: writeHTML.m

filename = [tempname, '.html'];

fid = fopen(filename, 'w');

fprintf(fid, '<html><body>\n');

fprintf(fid, 'This is a test homepage written by MATLAB!\n');

fprintf(fid, '</body></html>');

fclose(fid);

dos(['start ', filename]); % 啟動和 .html 相連結的應用程式

Page 42: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

執行結果 上例產生之網頁如下:

當 MATLAB 的計算結果可用列表( Table )或多媒體檔案(如影像、聲音、動畫等)來呈現時,由網頁來顯示這些結果是不錯的選擇。

Page 43: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

網路檔案的讀取 MATLAB 也可以直接讀取網路上的檔案 通常我們是採用 URL ( Universal

Resource Locator )的方式來指定這些網路上的檔案: 一般網頁:

http://www.mathworks.com FTP

ftp://ftp.mathworks.com/pub/pentium/Moler_1.txt

本機硬碟檔案: file:///C:\winnt\matlab.ini

Page 44: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

urlread

上例中使用 urlread 指令來讀取筆者在清華大學資訊系的首頁,同時將結果指定到字串變數 contents

Ex: urlread01.m

contents = urlread('http://www.cs.nthu.edu.tw/~jang'); disp(contents);

Page 45: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

執行結果<HTML><HEAD><META http-equiv="Refresh"

content="0; URL=http://neural.cs.nthu.edu.tw/jang"></HEAD>

<BODY>The link you just clicked is obsolete.<br>You are being transported automatically to Roger Jang's current

homepage at<a href="http://neural.cs.nthu.edu.tw/jang"> http://neural.cs.nthu.edu.tw/jang</a>.</BODY></HTML>

Page 46: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

urlwrite 指令( 1/2 ) urlwrite 指令可以直接在讀取網頁後,就儲存到本機硬碟中

Ex:urlread02.m

tempFile = [tempname, '.html']; % 指定暫存檔案

urlwrite('http://www.google.com.tw', tempFile); % 將網頁內容寫到檔案

dos(['start ', tempFile]); % 開啟此檔案

Page 47: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

urlwrite 指令( 2/2 ) 在上例中,我們將 www.google.com.tw 的網頁內容寫到一個暫存檔案,然後再使用瀏覽器開啟此檔案。

另一個和網路相關的功能 – sendmail 可用來寄發電子郵件 雖然這個功能和檔案讀寫沒有直接關係,但也在此一併說明。

Page 48: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

sendmail 指令 sendmail 指令的用法: sendmail(to, subject, message,

attachment) to :收件者

若是只有一位收件者,可用字串表示 若是有多位收件者,可以使用字串異質陣列來表示。

subject :主題,以字串表示。 message :電子郵件的內容,以字串表示。 attachment :附加檔案,用異質陣列來表示。

Page 49: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

Ex:sendmail01.m

請將 to 的內容改為你自己本身的電子郵件,並試著執行一次,以確認此程式碼的正確性。

to = {'[email protected]', '[email protected]'};

subject = 'Test email from a MATLAB program';

message = 'This is a test email sent via sendmail.';

attachment = {'c:\windows\matlab.ini'};

sendmail(to, subject, message, attachment);

Page 50: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

提示 可能還需要先使用 setpref來設定 smtp server及發信人等。(MATLAB 會有提示文字。)

以上範例純粹以 MATLAB 6.5 為主 根據筆者在 MATLAB 6.5 的測試, sendmail 目前還不支援中文。

而 MATLAB 7.0 對 sendmail 新增了一些新功能,請輸入 help sendmail 來獲取最新的線上支援。

若要在郵件內容加入換列,可以使用 ASCII 碼「 10 」 例如:message=[’Sir:’, 10, ‘This is a test’] 。

Page 51: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

讀取二進制資料 用 fread 函數可從檔案中讀取二進制資料 fread 會將每一個位元組看成一個整數,並將結果以一矩陣傳回。

例如,檔案 test2.txt 的內容如下:

This is a test!

Page 52: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

Ex:fread01.m

Result:This is a test!

char 可將 myData 的整數轉成 ASCII 字元 取 myData 的轉置是為了印出橫列,易於閱讀

fid = fopen('test2.txt', 'r');

myData = fread(fid);

char(myData') % 驗證所讀入的資料是否正確

fclose(fid);

Page 53: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

Ex:fread02.m fread 函數可用第二個輸入引數來控制傳回矩陣的大小

fid = fopen('test2.txt', 'r');

myData = fread(fid, 4) % 只讀 4 個位元組

fclose(fid);

myData =

84

104

105

115

Page 54: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

Ex:fread03.m

Result:myData = 84 105 32 104 115 105

此時 myData 為 2X3 的矩陣。

fid = fopen('test2.txt', 'r');

myData = fread(fid, [2 3])

fclose(fid);

Page 55: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

Fread 的第 3 個引數 控制 fread 在將二進制資料轉成 MATLAB 矩陣時所用的精確度

包含: 一次讀取的位元數( Number of Bits ) 這些位元數所代表的資料型態

常用的精準度有下列幾種:

char :帶符號的字元( 8 bits ) uchar :不帶符號的字元( 8 bits )

short :短整數( 16 bits ) int :整數(通常是 32 bits )long :長整數( 32 或 64 bits )

ushort :不帶符號的短整數( 16 bits )

uint :不帶符號的整數( 32 bits )

ulong :不帶符號的長整數( 32 或 64 bits )

float :單精準浮點數( 32 bits )

double :雙精準浮點數( 64 bits )

Page 56: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

Ex:fread04.m

Result:myData = 26708myData2 = 26708

fid = fopen('test2.txt', 'r');

myData = fread(fid, 1, 'short')

fclose(fid);

myData2 = bin2dec([dec2bin(abs('h'),8), dec2bin(abs('T'),8)])

Page 57: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

說明: fread04.m 上例將 text2.txt 以短整數的方式讀入

也就是以 16 bit 為一個單位來轉換成整數1. 讀出來的第一個數字,會等於將 'h' 和 'T' 轉換成

8 bit ,再並排成 16 bits2. 然後再轉換成十進位的整數值

要注意的是: 雖然原檔案的前兩個位元組是 'T' 和 'h' ,但是

在以 16 bits 為一個單位時… 'T' 會是 LSB ( Least Significant Bits ) 而 'h' 則是 MSB ( Most Significant Bits )

因此我們再重組成 16 bits 時,‘ h’ 會在前而 ‘ T’ 會在後 The byte order is Little Endian!

Page 58: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

寫入二進制檔案 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

Page 59: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

控制檔案位置指標

檔案位置指標 : 決定下一次進行資料讀取或寫入的位置。 控制此指標的函數如下:

feof 測試指標是否在檔案結束位置 fseek 設定指標位置 ftell 取得指標位置 frewind 重設指標至檔案起始位置

Page 60: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

foef 測試指標是否在檔案結束位置 Ex:feof01.m

fid = fopen('test.txt');

A = fscanf(fid, '%g', [3 4])

feof(fid)

在上例中, feof(fid) 傳回 1 ,表示檔案指標已經在檔案結束位置

因為 test.txt 只包含 10 個數目字。

Page 61: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

執行結果A =

1 16 49 100

4 25 64 0

9 36 81 0

ans =

1

Page 62: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

frewind 從 test.txt 的起始位置讀出資料

用 frewind 來重設指標的位置:>> frewind(fid); >> A = fscanf(fid, '%g', 5) Result:

A = 1 4 9 16 25

Page 63: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

fseek 用於設定指標位置,其格式如下 status = fseek(fid, offset, origin)

其中 fid 是檔案識別碼 offset 是偏移量(以 byte 為單位,可以是正數或負數)

origin 代表基準點,可包含下列字串: 'cof' :指標的現在位置( Corrent position of

File ) 'bof' :檔案的起始位置( Beginning of File ) 'eof' :檔案的結束位置( End of File )

Page 64: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

ftell 傳回現在的指標位置 Ex:ftell01.m

fid = fopen('test.bin', 'w');

count = fwrite(fid, randperm(10), 'int32');

ftell(fid)

ans =

40

40 代表指標已在檔案結束位置。

Page 65: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

再移動一次指標位置 欲將指標向前移動 10 bytes ,可輸入如下:>> fseek(fid, -10, 'cof');>> ftell(fid) Result:

ans = 30

此代表指標的新位置是 30 。

Page 66: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

本章指令彙整 高階的文字檔案讀寫

csvread/csvwrite 讀寫以逗點分界欄位的數值資料檔案

dlmreadd/lmwrite 讀寫以特定字元來當分界欄位的數值資料檔案

textread 讀入固定欄位的文字資料檔

開檔 / 關檔 fopen

開啟檔案 fclose

關閉檔案

Page 67: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

本章指令彙整 (cont) 二進制資料

fread 從檔案讀取二進制資料

fwrite 將二進制資料寫入檔案

格式化資料 fscanf

從檔案讀取格式化資料 fprintf

將格式化資料寫入檔案 fgetl

從檔案讀取一列資料,但捨去換行字元 fgets

從檔案讀取一列資料,但保留換行字元

Page 68: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

本章指令彙整 (cont) 字串

sprintf 將格式化資料寫至字串

sscanf 從字串讀取格式化資料

檔案位置控制 ferror

檔案輸入 / 輸出的錯誤狀態 feof

測試是否已到檔案結束位置 fseek

設定檔案定位器

Page 69: MATLAB  程式設計入門篇 檔案讀寫

MATLAB 程式設計入門篇:讀寫檔案

本章指令彙整 (cont) ftell

讀取檔案定位器 frewind

回轉檔案定位器 暫存檔案 /目錄

tempdir 取得暫存目錄的名字

tempname 取得暫存檔案的名字