跳轉到內容

MATLAB 程式設計/高階主題/高階 IO/從檔案讀取和寫入

來自華夏公益教科書,開放書籍,開放世界

Excel 檔案

[編輯 | 編輯原始碼]
- xlsread, xlswrite

分隔符檔案

[編輯 | 編輯原始碼]
- textscan, dlmread, dlmwrite

低階函式

[編輯 | 編輯原始碼]

如果您熟悉在 C 中讀取和寫入檔案,這些函式將看起來很熟悉。對於其他使用者,如果需要更詳細地控制如何讀取檔案(或者內建函式和 MATLAB 貢獻者中心函式無法讀取檔案),它們很有用。

開啟和關閉檔案

[編輯 | 編輯原始碼]

為了使用低階函式讀取和寫入檔案,您必須首先開啟檔案。您還必須指定是要讀取還是寫入檔案,以及是否要建立新檔案。例如,

>> fid = fopen('TEXTFILE.txt', 'r'); % Read-only (creates a file if there is none there)
>> fid = fopen('TEXTFILE.txt', 'w'); % Write to an existing file (overwrite what is already there)
>> fid = fopen('TEXTFILE.txt', 'w+'); % Write to an existing file or create a new file (overwrite over existing contents)
>> fid = fopen('TEXTFILE.txt', 'a'); % Write to existing file but append to what is already there

還有其他許可權,有關詳細資訊,請參閱 fopen 函式文件。

預設情況下(如果您沒有指定許可權),當您開啟檔案時,您只有讀取許可權。

關於 MATLAB 中的檔案 ID 的一個小提示:檔案識別符號實際上將是一個數字,而某些數字具有特殊含義

fid = -1 ---> cannot open file
fid =  1 ---> standard output
fid =  2 ---> standard error

當您完成一個檔案後,最好關閉它,以便其他程式可以使用它,並且您不會意外覆蓋資料。關閉檔案是使用 fclose 函式完成的

>> fclose(fid);

格式說明符

[編輯 | 編輯原始碼]

低階文字讀取函式依賴於您(使用者)告訴他們要讀取或寫入的資料型別。但是,它們提供了對輸入和輸出精度以及它們如何標記的極大控制。格式說明符透過提供佔位符然後提供資料來拼接這些佔位符來工作。例如,以下格式說明符指示您希望在 %s 指定的位置讀取或寫入字串

>> spec = 'Bob has a daughter named %s';

%s 是字串的佔位符。您還可以為整數 (%d)、浮點值 (%x.yf,其中 x 是小數點前要列印的位數,y 是小數點後要列印的位數)、%x 用於十六進位制等定義佔位符。有關支援的說明符的詳細資訊,請參閱 fprintf 文件。

要讀取包含以下文字的檔案(“Daughters.txt”)

Bob has a daughter named Jill

您將使用以下命令

>> fid = fopen('Daughters.txt');
>> spec = 'Bob has a daughter named %s'
>> s = fscanf(spec)
s = Jill
>> fclose(fid);

請注意,只有 %s 指定的字串實際上被返回,但整個字串被讀取。如果檔案改為包含以下內容

Bob has a son named Bob

並且您執行相同的程式碼,您將獲得

>> fid = fopen('Daughters.txt');
>> spec = 'Bob has a daughter named %s'
>> s = fscanf(spec);
s = ''
>> fclose(fid);

什麼都沒有返回,因為檔案中開頭沒有匹配“Bob has a daughter named”。請注意,以下檔案也不會返回任何內容

Bob has a son named Bob
Bob has a daughter named Jill

我們只有在讀取了“Bob has a son named Bob”之後才能讀取“Bob has a daughter named Jill”。

列印和掃描函式的向量化

[編輯 | 編輯原始碼]

與 C 版本的 fscanf 和 fprintf 不同,MATLAB 的列印和掃描函式是“向量化的”,這意味著您可以將矩陣傳遞給 fprintf 並讓它以相同的格式列印所有行,或者您可以要求 fscanf 以相同的方式讀取檔案的每一行並返回一個矩陣給您。這僅對數值矩陣有效。但是,還有其他更易於使用的函式可以執行相同的任務,但效能損失。

如果您有一個全數值矩陣,除非輸入或輸出需要特定的數值精度,否則 dlmreaddlmwrite 函式工作得很好。

要從包含字串的文字檔案讀取元胞陣列,建議在 MATLAB 貢獻者中心查詢名為 readtext 的例程,該例程與 xlsread/xlswrite 一樣易於使用,並以類似的格式返回結果。只要所有行的格式一致(即沒有混合字串和數值的列,沒有空白單元格等等),也可以使用 textscan 函式讀取此類檔案。

類似地,使用來自 MATLAB 貢獻者中心的 此檔案 可以將元胞陣列寫入文字。不幸的是,沒有內建的等效於 textscan 的函式,可以將格式化資料從元胞陣列寫入文字檔案。

華夏公益教科書