MATLAB 程式設計/高階主題/高階 IO/從檔案讀取和寫入
- 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 以相同的方式讀取檔案的每一行並返回一個矩陣給您。這僅對數值矩陣有效。但是,還有其他更易於使用的函式可以執行相同的任務,但效能損失。
如果您有一個全數值矩陣,除非輸入或輸出需要特定的數值精度,否則 dlmread 和 dlmwrite 函式工作得很好。
要從包含字串的文字檔案讀取元胞陣列,建議在 MATLAB 貢獻者中心查詢名為 readtext 的例程,該例程與 xlsread/xlswrite 一樣易於使用,並以類似的格式返回結果。只要所有行的格式一致(即沒有混合字串和數值的列,沒有空白單元格等等),也可以使用 textscan 函式讀取此類檔案。
類似地,使用來自 MATLAB 貢獻者中心的 此檔案 可以將元胞陣列寫入文字。不幸的是,沒有內建的等效於 textscan 的函式,可以將格式化資料從元胞陣列寫入文字檔案。