|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
$ S6 h, P2 p+ ?. Y
fscanf# C. x* E. D0 S( L
按指定格式从文本文件中读取数据。用法:
/ j7 ^3 W+ ^: O$ R! Y v9 n6 T; S
- A = fscanf(fileID,formatSpec);
- %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
- A = fscanf(fileID,formatSpec,sizeA);
- %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。* Q% O" e8 s* d0 R9 `
6 j1 u7 m4 q+ a7 j" B; _
( Y+ w4 N# f: F7 p! y
所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。
% k1 c2 o9 h: u7 r& [光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:
7 Y6 T/ a/ b" t( \8 R16。2。3。139 U+ W6 ]. b9 X8 t! T
5。11。10。80 m; q9 ]0 [* X; ?' D, b0 h
9。7。6。12. G$ a* I1 x+ x3 `" }
4。14。15。1
8 |( q( R4 l( y. M
( ?$ S: i9 w6 d7 h- 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 16 x& E5 `- C3 I# |. r5 D7 F' p
7 R8 d* i2 M7 B( v# ~# ]0 x u# y9 p* |! B3 ~! i' ^1 K
下面详细解释一下 fscanf 的读取原理:
7 Z8 e8 ], a: h6 @) N. n# K* w3 q8 b0 e* D
当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。
) v6 i, k b5 a$ {$ M- y/ N# f1 ^用下面图片进行说明:' S/ V" M4 C) J& C, z) q4 l' Z
4 C7 ~. V9 ]% X) y1 {
; @$ I( y1 H4 I. J% B
6 C ^; Y& O% j0 z$ T4 A" T
, U2 \( ^- k1 N+ T如果将这个例子的读取代码写成:
- ?+ f/ o& H* h% ^2 N% R, v6 `: \% f7 s! O: F" h0 ?# ]
- fid = fopen('test.txt');
- A = fscanf(fid,'%d。',[4,4])
- fclose(fid);
- A = A.'
* [8 P. k5 a) ]& r) v- H- N 3 j( j7 [% b( o/ x _
将会得到:
% f9 R4 m) g( \- g1 _
& o& ~8 v6 ^* g: E0 c4 D/ ?$ G- A =
- 16 2 3 13' ~4 C" l: p4 n2 c R
/ p- \6 S8 r5 Y' T9 f S
' ]! s' t% H( |, Q6 C, m
原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。
9 ]$ |3 G5 @. E) S: ]2 o0 Y& \再以一个比较复杂的文本文件为例:
! k0 B! L8 W% [& l( g @8 ~例:文本文件test.txt包含以下数据:
q# c" }! `* w, B; U& W$ ]8 Nlambda: 7.580000e-05
; k0 N# u& n8 `, }: U% GlambdaB: 8.000000e-05 E. J7 q4 a3 }- H
initial pulse width: 7.853636e-13+ y7 o7 P0 @6 \
output pulse width: 6.253030e-139 B2 _! A* N+ O- Q
dispersion length: 6.307732e-02( e/ L: K& ~3 i8 [6 T1 x( x
nonlinear length: 9.572495e-01
# O5 L( M6 o2 ~: @# O) n3 C8 Q' z% p7 S( R
lambda: 7.590000e-05
& A8 e8 z, W% QlambdaB: 8.000000e-05
- Q6 @; [2 S; n- K; v$ Ninitial pulse width: 7.848788e-13
& [) e" V1 w$ i4 d1 B9 F! k9 Aoutput pulse width: 5.778485e-13
$ q' a5 L; k' r. tdispersion length: 5.852858e-02
* x4 c) K$ H5 j9 P$ t/ t4 V5 y( rnonlinear length: 9.195277e-01' p, P! U* Y$ W5 n0 }2 m
… ' }, l) e3 F, {' {/ O# f$ M; a
- g! U1 x2 N i# G; N
7 {) c% L9 o3 m$ J' M, [. U现在想要把所有的数字信息提取出来:: w# j8 H' _9 B. F: o4 H u
1 ~" X0 Q8 u' e6 ~. t/ B7 `# K
- 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);
7 E* k$ X0 _/ H7 a' W
0 c# E0 O& B$ W t# W5 j- C9 [; v2 g7 {' W) T. }) {
" ]4 h3 E5 G" [- ]2 h3 h# j7 |& Y
( I2 `% T6 `7 n& \0 @1 h# c0 O
|
|