|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
% c' G5 O0 J. `fscanf
+ [, Z/ w) B1 D8 s k* o按指定格式从文本文件中读取数据。用法:" d7 G2 w# b6 h+ F' t H
/ l* K2 t/ M: {1 A: C0 Y# z1 d
- A = fscanf(fileID,formatSpec);
- %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
- A = fscanf(fileID,formatSpec,sizeA);
- %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。) y# c# g8 F% J1 X, x
8 C8 M. d7 P* B% w" g
* R- L* X0 ?0 z" [3 N9 t7 u( i R所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。 " m+ w( r$ ~! z4 H, b3 i# ^
光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:( }( C1 F7 V3 h8 ~
16。2。3。13
% j5 l% G& t& h% Q5。11。10。8
% d4 o9 ~, L$ K* G9。7。6。12
. ~: x5 l4 R0 u( b4。14。15。1: U7 N# X4 S h' G
9 @$ k1 ^1 ^ d$ s- 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
/ l# u7 t( ~6 J% h3 O1 l 5 q8 h% h+ ]4 L, L6 H2 G
, n" p& N, v# A: k8 T8 K下面详细解释一下 fscanf 的读取原理:
) R- Y' H: ^* C1 h2 \& ?$ }! h$ B7 |& N! x- I
当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。& }8 T0 K0 S0 g/ ]' X- L
用下面图片进行说明:
/ e6 y; n: D6 ]! o
z: K+ m2 q+ {
. t4 H) R2 e" c" F
- b3 E6 D: S- t( `2 F% w* A4 K6 g' L% B4 X, u0 p% g% w9 y; }
如果将这个例子的读取代码写成:+ F: L0 V1 V6 Q- g' Y: L( a8 s
2 j- f$ d- _5 a0 _
- fid = fopen('test.txt');
- A = fscanf(fid,'%d。',[4,4])
- fclose(fid);
- A = A.'
4 R9 Q4 o1 c# {- M4 u/ M ! N7 W0 _# e2 ^! L0 C2 D
将会得到:3 j: s9 k) Z) I& j8 v
j& e# j7 ^1 T, C/ T" P- A =
- 16 2 3 13
' q' B6 W" h3 _, r; t / N; G B4 t# K" v
* j# o% G" ~: E; R
原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。' q; z" u2 q$ l, ~# ?2 j' m" p( X& I
再以一个比较复杂的文本文件为例:
3 {' p, r: t2 D) _6 }( {例:文本文件test.txt包含以下数据:, J, p' e# c3 Y/ T# B
lambda: 7.580000e-05
/ Y1 M# ]5 w1 h! i6 c1 llambdaB: 8.000000e-05
. ]- Q2 k5 Y9 D# N$ W! O' Ginitial pulse width: 7.853636e-13! |) m/ d) s% e2 r- Y! |7 c. L* s
output pulse width: 6.253030e-13
0 ?1 j; m, r y" Sdispersion length: 6.307732e-02
7 M7 c1 `0 h6 g4 nnonlinear length: 9.572495e-018 P6 ^" C+ v$ G8 F# A
0 I3 a9 j6 X0 B# d* ^
lambda: 7.590000e-051 F/ k6 ~4 }) e7 R T. L
lambdaB: 8.000000e-05/ b# @. r( s8 j7 j; m4 ]0 Z
initial pulse width: 7.848788e-130 X: _ u2 A' b! O5 Y9 o
output pulse width: 5.778485e-13
0 B$ X& ?6 b! C; L! S: qdispersion length: 5.852858e-028 j6 Z% t. q f0 {6 f5 p
nonlinear length: 9.195277e-018 {1 U! v" ^. W& n0 b' U$ }
… ; S* v, }( h b+ n# Z
3 v* p$ u" w9 W* X! _/ b; p$ {( m
9 c: }( l" E+ R; W( f8 | U现在想要把所有的数字信息提取出来:6 }' |. l4 |9 h( r8 u) J+ T% R
) x, s" ~$ N- K& e9 \$ ^- 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);
( h- M9 ]0 x- F9 m/ v 0 a7 X4 G5 A2 v5 k
' H( R: ~! }3 q" M
; J9 M5 E. l" T; J6 \ `9 \
6 P f' n( a( s( D% g, G4 K |
|