fgetl 函數可將 ASCII 檔案的內容中的某一列讀出,並將該列的 ASCII 內容以轉成字串傳回。例如,下列指令可將檔案 mean.m 逐列印出:
執行上述程式後,MATLAB 會先在目前目錄找尋 mean.m,若找不到,再根據搜尋路徑,找出 mean.m 指令的位置,然後再將其內容一列一列地列出。(為節省空間,在此不列印出結果,請讀者自行試用此範例程式碼。)若要知道此 mean.m 所在的位置,可輸入「which mean」即可顯示此檔案所在的路徑。
fget 函數和 fgetl 函數很相似,兩者均可由檔案讀取一列資料,其差別在於:fgetl 會捨去換行字元,而 fgets 函數則保留換行字元。
利用 fgetl 函數,我們可以模擬在 UNIX 系統下的 grep 指令,來找出包含某一特定字串的一列,其 MATLAB 函數 grep.m 可撰寫如下:
>> type grep.m
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);
end
line_number = line_number + 1;
end
fclose(fid);
例如,欲列出 grep.m 中包含 'matched' 字串的每一列,可輸入如下:
>> grep('grep.m', 'matched')
6: matched = findstr(line, pattern);
7: if ~isempty (matched)
若已知 ASCII 檔案的格式,欲進行更精確的讀取,可用 fscanf 函數來從檔案中讀取格式化之資料,其使用語法如下:
matrix = fscanf(fid, format)
其中 fid 是欲讀取之檔案的辨識碼(由 fopen 產生),format 是格式指定字串(Format Specifier),用以指定讀入資料的型態,常用的格式指定字串有下列幾種:
- %s:字串
- %d:10進位的整數
- %g:雙倍精準(Double-precision)的浮點數(Floating-point Numbers)
其他各種格式指定字串可輸入 help fscanf 來得到詳細的線上說明。例如,有一 ASCII 檔案 test.txt 的內容如下:
>> type test.txt
1 4 9 16 25
36 49 64 81 100
欲使用 fscanf 指令讀取其內容,可輸入如下:
上例也顯示了 MATLAB 的 fscanf 指令和 C 的 fscanf 指令的最大不同:MATLAB 的 fscanf 指令是向量化的(Vectorized),只要讀入資料的型態正確,MATLAB 的 fscanf 指令會一再執行,並把所得結果存放於一個向量並回傳。
若要限制傳回向量的大小,或是希望傳回一矩陣,則可在 fscanf 加上第三個輸入引數,以指定傳回向量(或矩陣)的大小。例如:欲讀取 test.txt 的前 3 筆資料,可輸入如下:
欲使 fscanf 指令傳回一個 3×2 的矩陣,可輸入如下:
sscanf 函數和 fscanf 的功能很類似,唯一不同的是,sscanf 函數從字串(Strings)中讀取資料,而不是從檔案(Files)。例如:
MATLAB程式設計:入門篇