初識MATLAB之文件讀取
MATLAB的每一個腳本文件,幾乎都涉及到文件的讀寫操作,我以幾個案例來分析MATLAB的文件讀取的基本操作。
1. 打開與關閉文件
打開文件的函數為fopen,關閉文件的函數為fclose。這里將MATLAB中help幫助的內容拿出來介紹具體。
FID = fopen(FILENAME,PERMISSION) 打開文件FILENAME, 由PERMISSION指定的模式:
'r' 打開文件進行閱讀
'w' 打開文件寫; 丟棄現有內容
'a' 打開或創建文件以供寫作; 將數據附加到文件末尾
'r+' 打開(不創建)文件進行讀寫
'w+' 打開或創建文件進行閱讀和寫作; 丟棄現有內容
'a+' 打開或創建文件進行閱讀和寫作; 將數據附加到文件末尾
'W' 打開文件進行寫入而不自動刷新
'A' 打開文件,無需自動刷新即可追加
僅當文件時,FILENAME可以是MATLABPATH相對部分路徑名打開閱讀。
您可以以二進制模式(默認)或文本模式打開文件。在二進制模式下,沒有任何字符被挑出來進行特殊處理。在PC上的文本模式中,前面有回車符在輸入中刪除換行符並在換行符之前添加輸出中的字符。 要以文本模式打開文件,請將“t”附加到權限字符串,例如'rt'和'w + t'。 (在Unix上,文本和二進制模式是相同的,所以這沒有效果。 在PC系統上 這很關鍵。)
status = fclose(FID) 丟失與文件標識符FID關聯的文件,這是從早先調用FOPEN獲得的整數值。 fclose如果成功則返回0,否則返回-1。 如果FID不代表打開文件,或者等於0(標准輸入),1(標准輸出),或2(標准錯誤),fclose引發錯誤。
以下為一個打開與關閉文件的案例:
>> filename='input.txt'; permission='r'; fid=fopen(filename,permission), status=fclose(fid)
案例分析:文件名input.txt ,打開方式只讀,文件標識為4,status 為0,關閉正常。
fid = 4 status = 0
2. fwrite和fread函數
使用fwrite和fread函數來對二進制文件進行讀寫,這里有三個案例,分別為寫操作案例,讀操作案例和不能同時讀寫案例。
2.1 fwrite函數
MATLAB中help幫助中對fwrite函數是這樣介紹的:
COUNT = fwrite(FID,A,PRECISION) 寫出矩陣A的元素到指定的文件,將MATLAB值轉換為指定的值精確。
PRECISION控制結果的形式和大小。 查看列表FREAD允許的精度。 如果未指定PRECISION,MATLAB使用默認值,即'uint8'。 如果是'bitN'或'ubitN'用於PRECISION,然后用於任何超出范圍的值A.被寫為一個值,所有位都打開。 如果精度是'char'或'char * 1',MATLAB使用編碼寫字符與文件關聯的方案。 有關更多信息,請參見FOPEN。
filename='input2.bin'; permission='r+'; fid=fopen(filename,permission); a=magic(5); precision='int32'; count=fwrite(fid,a,precision), status=fclose(fid)
案例分析:文件名input2.bin,打開方式讀寫,status 為0,關閉正常。寫入的矩陣為特殊矩陣magic(5),count 為25,表示寫入了25個元素,是正確的。
count = 25 status = 0
2.1 fread函數
MATLAB中help幫助中對fread函數是這樣介紹的:
A = fread(FID,SIZE,PRECISION) 根據文件來閱讀文件字符串PRECISION指定的數據格式。該PRECISION輸入通常包含一個數據類型說明符'int'或'float',后跟一個給出大小的整數位。 使用此語法時,SIZE參數是可選的。
以下任何字符串,MATLAB版本或可以使用它們的C或Fortran等價物。 如果沒有指定,默認精度為'uint8'。
>> filename='input2.bin'; permission='r+'; fid=fopen(filename,permission); precision='int32'; data=reshape(fread(fid,count,precision),5,5) status=fclose(fid)
案例分析:文件名input2.bin,打開方式讀寫,status 為0,關閉正常。由2.1的案例可知寫入的矩陣為特殊矩陣magic(5),使用fread函數讀出的矩陣為data,如下所示。
data = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 status = 0
2.3 不能同時讀寫案例
當分別實現了讀寫文件后,我想可不可以在同一次打開的文件中,先進行寫操作,再進行讀操作。案例(至少這個)證實我不能這樣干。但可以進行完寫吃操作后關閉文件在打開再進行讀文件操作。詳見4.中的案例。(如果可以這樣做是我沒法實現,請評論留言,謝謝)
>> filename='input2.bin'; permission='r+'; fid=fopen(filename,permission); a=magic(5); precision='int32'; count=fwrite(fid,a,precision); data=reshape(fread(fid,count,precision),5,5) status=fclose(fid)
案例分析:以下為報錯結果,我沒法解決。
Error using reshape To RESHAPE the number of elements must not change.
3. fprintf和fscanf函數
使用fprintf和fscanf函數來對文本文件進行讀寫,這里有兩個案例,分別為寫操作案例和讀操作案例。
3.1 fprintf函數
MATLAB中help幫助中對fprintf函數是這樣介紹的:
fprintf(FID, FORMAT, A, ...) 將FORMAT應用於所有元素數組A和列順序中的任何其他數組參數,並寫入數據到文本文件。 FID是整數文件標識符。 獲得來自FOPEN的FID,或將其設置為1(標准輸出,屏幕)或2(標准錯誤)。 fprintf使用中指定的編碼方案打電話給FOPEN。
>> filename='input2.txt'; permission='r+'; fid=fopen(filename,permission); a=magic(5); format='%d %d %d %d %d\n'; count=fprintf(fid,format,a); status=fclose(fid), type input2.txt
案例分析:文件名input2.txt,打開方式讀寫,status 為0,關閉正常。寫入的矩陣為特殊矩陣magic(5),type input2.txt,表示顯示 input2.txt文件中的內容,如下所示是正確的。且寫入文件中的格式為'%d %d %d %d %d\n',代表每個元素以‘ ’隔開,且每個5就換行。
status = 0 17 23 4 10 11 24 5 6 12 18 1 7 13 19 25 8 14 20 21 2 15 16 22 3 9
3.2 fscanf函數
MATLAB中help幫助中對fscanf函數是這樣介紹的:
fscanf(FID,FORMAT,SIZEA) 從文本文件中讀取和轉換數據按列順序進入數組A. FID是從中獲取的文件標識符FOPEN。 COUNT是一個可選的輸出參數,返回數字元素成功閱讀 。
FORMAT是包含普通字符和/或轉換的字符串規范,包括%字符,可選星號賦值抑制,可選的寬度字段和轉換字符(例如d,i,o,u,x,e,f,g,s或c)。
將SIZEA元素放入A.SIZEA的有效表格是:
inf | 讀取到文件末尾。 (默認) |
N | 最多將N個元素讀入列向量。 |
[M,N] | 讀取至多填充M-by-N矩陣的M * N個元素 按列順序。 N可以是inf,但M不能。 |
>> filename='input2.txt'; permission='r+'; fid=fopen(filename,permission); a=magic(5); format='%d'; count=fscanf(fid,format,[5,inf]), status=fclose(fid), type input2.txt
案例分析:文件名input2.txt,打開方式讀寫,status 為0,關閉正常。由3.1的案例可知寫入的矩陣為特殊矩陣magic(5),使用函數fscanf讀出的矩陣為count,如下所示。且與type input2.txt所給出的矩陣對比,說明使用正確。
count = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 status = 0 17 23 4 10 11 24 5 6 12 18 1 7 13 19 25 8 14 20 21 2 15 16 22 3 9
4. 文件讀寫位置控制
我們可以自主控制文件的讀寫的位置。主要有四個函數,feof函數,frewind函數,fseek函數,ftell函數。以下案例將打開與關閉文件,讀與寫文本文件的操作都復習了一遍。且簡單介紹feof函數,frewind函數,fseek函數,ftell函數的內容:
ST = feof(FID) 如果文件結束指示符,則返回1已設置文件標識符FID的文件,否則為0。當對文件執行讀取操作時,將設置文件結束指示符與FID相關聯的嘗試讀取超過文件末尾的內容。
frewind(FID) 將文件位置指示器設置為開頭與文件標識符FID關聯的文件。
STATUS = fseek(FID, OFFSET, ORIGIN) 重新定位文件位置與給定FID關聯的文件中的指示符。 fseek設置了位置指示符指向相對於指定OFFSET的字節起源。
OFFSET值解釋如下:
> = 0在ORIGIN之后移動位置指示符OFFSET字節。
<0在ORIGIN之前移動位置指示器OFFSET字節。
ORIGIN值解釋如下:
'bof'或-1文件開頭
'cof'或0文件中的當前位置
'eof'或1文件結尾
POSITION = ftell(FID) 返回文件位置的位置指定文件中的指示符。 位置以字節表示從文件的開頭。 如果返回-1,則表示查詢不成功。 使用FERROR來確定性質的錯誤。
1 >> filename='input2.txt'; 2 permission='r+'; 3 fid1=fopen(filename,permission); 4 a=magic(5); 5 format='%d %d %d %d %d\n'; 6 count=fprintf(fid1,format,a); 7 status=fclose(fid1), 8 fid2=fopen(filename,permission); 9 a=magic(5); 10 format='%d'; 11 count=fscanf(fid2,format,[5,inf]), 12 eof=feof(fid2), 13 frewind(fid2), 14 status=fseek(fid2,3,0), 15 position=ftell(fid2), 16 status=fclose(fid2),
案例分析:eof為0,代表文件的末尾指示值未被設定,第20行的status 為0,代表,設定指針位置操作成功。position 為3,代表指針距離文件起始位置的距離為3字節。第30行和第1行的status代表文件關閉正常
1 status = 2 3 0 4 5 6 count = 7 8 17 24 1 8 15 9 23 5 7 14 16 10 4 6 13 20 22 11 10 12 19 21 3 12 11 18 25 2 9 13 14 15 eof = 16 17 0 18 19 20 status = 21 22 0 23 24 25 position = 26 27 3 28 29 30 status = 31 32 0
總結:內容的總結不想寫了,特別提及一點,這次我真正學會了代碼粘貼的正確姿勢。最后如果你對內容有所疑問可評論留言。謝謝閱讀。