|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
7 M# `/ \1 Z5 u. H, hfscanf
4 J7 }0 f8 n0 O! e! i, ^5 m! M. i按指定格式从文本文件中读取数据。用法:
, \. l, m' L" L
, m8 h" Z; H6 ]& n9 L$ ?' ^+ a% u- A = fscanf(fileID,formatSpec);
- %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
- A = fscanf(fileID,formatSpec,sizeA);
- %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。* p0 i- p; |# f; V, X& u
! A: g5 i e4 b: {* z+ F/ w4 q8 n3 W, K; t8 x8 E' c
所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。
' O1 p, }) K1 R; V0 G光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:4 v, L8 v, K3 g, N
16。2。3。13
0 p$ A2 L! B4 ~7 X5。11。10。8
$ |2 _; P* b& O: `+ L! E+ K/ S I; F9。7。6。12
+ i3 B# s/ y( D1 M, ^7 T0 z# U1 R* @4。14。15。11 L4 Q9 u z6 L: P0 @
" o2 k" @: E2 A8 x6 r- 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
. i; K3 K: A2 [2 u; H& P; l6 Q3 W
, `! J& b% O' b \# H, x2 C4 m7 k$ E, p+ t
下面详细解释一下 fscanf 的读取原理: . W5 a/ ~8 }7 d5 W* ?3 N
$ e& _6 V% J) y! m9 A
当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。
p( M. N$ y' |0 j* s用下面图片进行说明:% o- k) ^, P( M
$ j) L7 V7 N) c; }- [$ r% i
2 f3 m Z! {! g' w8 v1 k( D8 L" ~- ^: P( E
2 m7 U a' p4 ], q4 d如果将这个例子的读取代码写成:
8 M6 e( t' R2 d1 l$ o+ p
' d) k8 j2 y. y! R3 g4 r5 |- fid = fopen('test.txt');
- A = fscanf(fid,'%d。',[4,4])
- fclose(fid);
- A = A.'
/ g D* v% s7 M4 G6 k' A: m & V( Z* V& _1 q
将会得到:) }& W0 a# Q) a# X7 j
0 o6 ~ r% `" {- Z' `; q
- A =
- 16 2 3 13& K; N8 p( h9 F& a
; h% L' b; U5 z* E5 M+ I( N
7 @0 i! W8 ]- o1 r( w- `7 }' r原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。
, [- u, W" A$ T/ k9 E N再以一个比较复杂的文本文件为例:& N. q( d7 u, M" P4 |& M5 K
例:文本文件test.txt包含以下数据:
0 x: U7 R' C6 ?+ Qlambda: 7.580000e-05 0 X0 R' z; z; \7 ^; Z0 H
lambdaB: 8.000000e-05
+ \! B2 G+ H: J- B) q4 H- Rinitial pulse width: 7.853636e-13' \0 V8 K: w. N; w* V8 S7 A" ]$ O
output pulse width: 6.253030e-13* D$ i' l$ @( o6 ^- Z) `
dispersion length: 6.307732e-02$ v- |' v8 y. K* M
nonlinear length: 9.572495e-01
: j9 i' R4 P# F; q( J4 o. n7 R, c+ U( a: N0 N/ ^1 \" }
lambda: 7.590000e-05' W7 W8 Z9 Y) Q4 @
lambdaB: 8.000000e-05
1 z3 A- C8 j9 j, Finitial pulse width: 7.848788e-13, k1 _" N. K$ v/ h
output pulse width: 5.778485e-13
( L7 w, L% p$ {4 c% ^7 G+ r2 adispersion length: 5.852858e-02# O7 t3 E |+ ?6 v
nonlinear length: 9.195277e-01
6 ~( d" o6 A V0 p* x" B# G4 m; l…
% l0 K& }) B6 s ~) B( w! X
9 ?" c( w/ }3 }- N, ~1 z" [: E" L7 |3 T7 a6 q! z% Q
现在想要把所有的数字信息提取出来:& N; [2 e b8 Y, V8 j
% j! g* C, Q/ t/ F. D4 z
- 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);; k" a0 s- Q, |! S$ E
0 U% N; f# Q$ y! y& @0 M6 o3 z }. {7 b
& B' y. C9 G% w# J! |
1 N; Q; V4 q }; T |
|