|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
5 H+ P1 k; o4 w" M0 J& Ffscanf
# |. A. W& N! w7 D" r8 k( V( e按指定格式从文本文件中读取数据。用法:
% \; }% y7 \2 Q$ @# {$ u5 I9 K& L& p1 `# x
- A = fscanf(fileID,formatSpec);
- %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
- A = fscanf(fileID,formatSpec,sizeA);
- %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。
: [, {; n( ^% @; C# W
) ?7 B# B P: A7 s
* Z1 S9 x% ?% l# y. _所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。
; ^' g; ^; M v# W1 R) A$ Q光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:
) r9 N5 R& J+ ]16。2。3。13$ X8 a" ^* s3 w7 y0 |7 W, \0 l
5。11。10。8
7 c* l! w4 f/ B @9。7。6。120 k5 g, p8 J' @
4。14。15。1: V& X5 }9 U$ K( L: } T/ {' V
& V- ^( i$ ?5 y4 ~: {9 i3 J- fid = fopen('test.txt'); %通过fopen获取文件标识
- formatSpec = '%d。%d。%d。%d'; %指定读取格式
- A = fscanf(fid,formatSpec ,[4,4]); %读取文件数据并存为4*4矩阵
- fclose(fid); %调用fclose关闭文件
- A = A.’ %由于fscanf是列主序,因此读取完还需要进行转置
- A =
- 16 2 3 13
- 5 11 10 8
- 9 7 6 12
- 4 14 15 1
3 a% Q3 k" ~) A - l0 k1 `7 I( d( ~3 t4 p$ C
9 G5 t. B/ ?* \
下面详细解释一下 fscanf 的读取原理:
+ ]0 S9 f4 M1 K9 t" r1 s0 }+ F& h4 Q
当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。+ d J4 x+ C V: w" Q
用下面图片进行说明:! I' V; I3 P' c# g( t1 S9 [. H
% t D- o8 R, p6 {
0 ~# r0 J% ?* D
) V" _" G# }' A
" F& V+ W. v& q; e如果将这个例子的读取代码写成:
' B# r2 S7 N& g' E( |" D8 a, s" p- `
- fid = fopen('test.txt');
- A = fscanf(fid,'%d。',[4,4])
- fclose(fid);
- A = A.'2 Y5 @: p8 ?8 v- y/ ^/ s0 M1 B5 X
& P. |: z; F4 Z! z; c Z1 I, H( L
将会得到:
& d/ e' g5 V4 M! G! t7 A4 X) ^/ D0 w" B) Z0 @# s% `+ h( k% A5 U4 b# w
- A =
- 16 2 3 13
/ ?% C- ~8 Q8 o { 2 D/ L! O- Z8 W4 t. B* `3 i/ \
& j6 T% `! H* e4 K
原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。( m; C% e& A0 c/ e6 C
再以一个比较复杂的文本文件为例:7 V, c, d1 K/ q
例:文本文件test.txt包含以下数据:: f7 M4 r- w: A
lambda: 7.580000e-05
& T( n$ P( ] ylambdaB: 8.000000e-056 O$ O8 j' O0 c! B
initial pulse width: 7.853636e-13
6 t- X% a0 S* n+ B7 [6 J+ goutput pulse width: 6.253030e-13
. r! l; b+ m Q$ z3 @5 u! Vdispersion length: 6.307732e-023 B- ]; J5 e: g: \
nonlinear length: 9.572495e-01
! r9 Q$ u3 ^$ o9 j/ S/ n2 a" w3 h8 s; A: o
lambda: 7.590000e-05
+ \' p: p: z9 @9 k2 \0 JlambdaB: 8.000000e-056 }7 ]7 C' Q) e
initial pulse width: 7.848788e-135 P9 ?0 ~% Z" \+ N+ j4 M5 }2 Y
output pulse width: 5.778485e-13/ U6 O. ~' q3 l7 z. _6 t
dispersion length: 5.852858e-02
' p0 y- s' v+ z6 Wnonlinear length: 9.195277e-01: x5 c1 ]0 W* N* y6 M
…
6 d7 k) {" }0 T/ n; G/ i" r% ~% v% E& a y/ L) x2 _( s# a
' ]7 s5 B" R0 G, G8 k* q$ t" t! ^现在想要把所有的数字信息提取出来:
: _: C& U+ i6 J+ L8 i# A
/ W+ A; j+ n3 O4 X6 R- fid = fopen('F:\test.txt');
- c1 = '%*s %e'; %第一行的转义说明符,’%’后面接一个’*’代表跳过这个数据,%*s即代表跳过第一个字符串’lambda:’,%e表示读取以科学计数法表示的数字。
- c2 = '%*s %e';
- c3 = '%*s %*s %*s %e';
- c4 = '%*s %*s %*s %e';
- c5 = '%*s %*s %e';
- c6 = '%*s %*s %e';
- formatSpec = [c1,c2,c3,c4,c5,c6]; %以6行为一组,重复读取,直至读取完整个文件
- A = fscanf(fid,formatSpec,[6,inf])
- fclose(fid);
2 G1 x" p& f4 o' d K8 r , j0 u7 [4 R/ |# m
0 [6 x- p$ K. \7 N9 I C. V! X
) I$ e6 `% j2 ~! Y; q J9 e E$ q
; X) l) Q8 u. ?3 H @! p0 c |
|