|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6 B2 e7 P2 ]9 J/ T3 a5 {
fscanf
4 }8 a F, X) j$ B按指定格式从文本文件中读取数据。用法:- a, y; n+ C- b4 z$ O
9 V) ^! z6 }; d: x- Y9 L- A = fscanf(fileID,formatSpec);
- %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
- A = fscanf(fileID,formatSpec,sizeA);
- %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。
% g1 K$ P6 o7 c% b( a" p0 Y 5 m }) T4 G: w/ W0 C
g/ k2 _5 m( z. z- A所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。
" l! k' w' ~5 h q光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:
, k; X4 c8 }6 t9 Q8 N, u16。2。3。13: _4 X, x( R t" P; R* b0 u
5。11。10。8
9 G% @; c2 w: \( t# b- A* ?% }: j9。7。6。12
7 U, ~' h" k8 p9 j C3 @4。14。15。1
+ Y- z0 B, Q& b8 {
+ Y7 j2 e5 q+ C$ ~# R0 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
5 C! V% ?# i: _ & K; j$ Q9 z# i! L- c' W
8 X- n x3 |* T" p- m) g3 ~下面详细解释一下 fscanf 的读取原理: " A, _0 x4 ^5 f" ?9 g; p3 n, d7 e
0 i! B' @" m. s; H! c: K1 x7 ^1 ]
当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。8 k, [6 `; r) C0 W% }$ v
用下面图片进行说明:
) p& J0 |) m+ L: p! R m8 q" _% T
# J1 }$ ?$ `: y, z2 k1 B. L& X2 s4 d
/ f, L) l- x ~6 O- Y m# z1 K' S4 z" X. J& i* ^; t$ w
: ^! N6 N5 i! C( p如果将这个例子的读取代码写成:
9 j* H% v( l- o: g- @( j* h3 r
- fid = fopen('test.txt');
- A = fscanf(fid,'%d。',[4,4])
- fclose(fid);
- A = A.'# W+ s1 }2 K9 J4 r3 S6 l' j; g, L9 y
2 I: P5 S" t- m0 p/ V将会得到:
( N# h+ e9 `6 @# p! O5 ~, h- |' d. L# S6 @
- A =
- 16 2 3 13
3 Y k% D3 E! M7 g- d C' D" ^ @- I! L/ s1 N
8 h1 d) z7 x( b/ F6 D" q! p原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。
7 T. d# a# J" J9 f% j' V再以一个比较复杂的文本文件为例:+ T2 |2 c- i/ r/ w
例:文本文件test.txt包含以下数据:2 v6 @9 ?1 ]; y& h7 M6 v W o
lambda: 7.580000e-05
: H$ u5 Y! p" E5 {( q, _. i; IlambdaB: 8.000000e-055 d2 g/ `) n" k; o4 F9 r
initial pulse width: 7.853636e-13
+ F, X; `3 O: y1 J( V/ {) `$ Doutput pulse width: 6.253030e-13
1 [$ d0 J( u3 h6 u# @0 U& D+ K) [dispersion length: 6.307732e-02
4 k3 J: ^& i f' ]9 x. }% \nonlinear length: 9.572495e-019 V* n- J" K( t! X" [1 g6 c
T$ u$ W& [& @# ^. P3 O0 _. `: Nlambda: 7.590000e-056 A' ~: v2 v8 J* O
lambdaB: 8.000000e-05
, A3 S: k9 H+ Z2 Ginitial pulse width: 7.848788e-13
/ P0 F2 y' _9 \1 \' `output pulse width: 5.778485e-133 v. e0 O: M5 J: w
dispersion length: 5.852858e-02
& J5 I1 b3 W }: U4 g6 h+ s; n' znonlinear length: 9.195277e-01
2 Q% L- Y. W, t* Q… % x- `& i5 X, h7 H4 f! M$ e# j+ _
* y) u* W; s k* J
5 T: R! Z& F3 W& [* d) t
现在想要把所有的数字信息提取出来:
( x5 K. |5 z2 a6 p W
1 B7 Q: F" T5 [* C1 O8 |5 C+ g- 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);, C, C; ~0 b8 s3 D" M0 L; W( T
+ ?6 V- B8 }/ s" M% j1 f9 I- \( r- {7 ]7 p, G8 |
5 e+ x$ C* b0 H9 Y! g4 [5 p4 T( C% H7 g# r, g, Y
|
|