fscanf不读取_思考了一天,终于把matlab的fscanf中的sizeA搞清楚了
數值如12345等可以作為字符,所以以字符格式讀取文件時,這些數字照樣可以被讀取
A = fscanf(fileID,formatSpec)
A = fscanf(fileID,formatSpec,sizeA)
以上是fscanf的語法;
sizeA起到的作用是限制,限制讀取讀取文件中數據的數量;
舉例來說:
John 1995 12 5 12.3 3.24
Tom 1995 12 7 2.3 2.0
Jean 1996 3 2 10.2 0
假如說文件中有這么一組數;
說明:每個空白間隔為一個數據
第一個數據為‘John’是一個字符串,讀取的格式為fprintf(fid,'%s or %c',sizeA)
注意%s是讀取字符串,不包括空白(即讀取完后,數據之間無空白間隔);John199512512.3
而%c是逐個字符讀取,包括空白(即讀取完后,數據之間有空白間隔);John 1995 12 5
說完讀取的部分,再來說說sizeA是如何控制fscanf函數的。sizeA=N的情形
(1)對于字符讀取,采用%s
%s是一個字符串一個字符串進行讀取的,fprintf(fid,'%s',sizeA)
sizeA可以使單個整數N,也可以是[m n]
我們先運行N,取值為1 3 5
clear;
fid = fopen('fscanfsample.txt','r'); i = 1;
name = fscanf(fid,'%s',1)
name =
'John'
clear;
fid = fopen('fscanfsample.txt','r'); i = 1;
name = fscanf(fid,'%s',2)
name =
'John1995'
clear;
fid = fopen('fscanfsample.txt','r'); i = 1;
name = fscanf(fid,'%s',5)
name =
'John199512512.3'
可以看到,%s每次讀取一個字符串,前面提到,數字都可以當成字符串,但字符串不能當為數字
所以sizeA=1是讀取一個字符串,sizeA=2時,讀取兩個字符串,5時讀取5個字符串,并且沒有空白間隔
所以sizeA其實就是控制fscanf讀取數據的數目,
fscanf讀取數據的時候是橫向讀取,而SizeA是控制讀取的數目
(2)那么對于%c同樣如此,只不過%c是一個一個字符去讀,因此sizeA要擴大,比如讀取第一個字符串John
對于%s,sizeA=1即可,但對于%c,則sizeA需要等于4才可讀出。
(3)對于數值的讀取同樣代表讀取的數據個數,但需要注意的是,%d指的是整數,%f指的是浮點數;我們看該文件第一行1995 12 5都是整數,如果寫fscanf(fid,'%d',3)那么肯定能把這三個整數讀到,并且按照列進行排列,如果寫fscanf(fid,'%d',4),由于12.3由整數和小數兩部分構成,因此小數點以前的12可以被讀出來,但是小數點和小數點后的3無法讀出來,因為不是整數。如果寫fscanf(fid,'%d',5),照樣只讀到12.3的12就停止,因為不滿足要求之后,fscanf會停止運行。返回之前讀取的數據。
(4)fscanf 函數在整個文件中重新應用該格式,并將文件指針定位在文件結尾標記處。如果 fscanf 無法將 formatSpec 與數據相匹配,將只讀取匹配的部分并停止處理
以上講的都是sizeA=N的情形,接下來將sizeA=[m n]的情形
(1)對于字符串
字符串數據類型為char,char沒有矩陣一說,字符串string的引用一般直接寫str(i)即可,如str=’I love China‘, str(1)==I,str(5)==v,不能寫為str(3,3),會報錯:
str(3,3)
索引超出數組邊界(不能超出 1)。
但是可以寫str(1,3),相當于str(3);等于‘l'
因此,對于字符串,一般不需要也不用[m n].
(2) 對于數據類型
以此文件為例,由于第一個“john’為字符串,因此,直接運行fscanf(fid,'%d或%f',[m n])無法讀取數據,因為數據類型不滿足,會自動停止運行。
所以我們這里把Name列刪除,刪除之后為:
1995 12 5 12.3 3.24
1995 12 7 2.3 2.0
1996 3 2 10.2 0
這里我們可以看到,如果要想把所有數據讀出來,sizeA用N表示應該為12。
另外該文件數據有整數和小數,如果用%d讀的話,按行進行,遇到第一個小數點12.3,只會讀取到12,點后邊的就無法讀取,因此要想把所有數據讀出,需要用%f來進行。
我們執行fscanf(fid,'%f',[2 3]),得到結果如下:
A=fscanf(fid,'%f',[2 3])
A =
1.0e+03 *
1.9950 0.0050 0.0032
0.0120 0.0123 1.9950
發現fscanf從1995開始,共讀取6個數據,并按照2行3列進行排列,到這里我們就會發現,對于數據類型,sizeA=[m n]
會使fscanf讀取的數據個數為N=m*n個數據,并將他們按照m行n列進行排序,排序的時候,先進行列排序,再進行行排序,因此,行數m肯定是有限個數,n卻可以使無窮大的,即inf。
總結
以上是生活随笔為你收集整理的fscanf不读取_思考了一天,终于把matlab的fscanf中的sizeA搞清楚了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ncverilog脚本_NC-Veril
- 下一篇: matlab人脸追踪,求大神帮助我这个菜