数值如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。