找回密码
 注册
关于网站域名变更的通知
查看: 1109|回复: 1
打印 上一主题 下一主题

MATLAB读取文本文件之fscanf函数

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-4-27 10:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

3 K! b+ ~; f6 O+ _/ E5 @fscanf+ L) A: n! C, }) G" ]4 R5 r; V+ S0 h
按指定格式从文本文件中读取数据。用法:
( A: C$ {) @1 C) P/ W8 l
% v9 |8 S' r" ~. j& ]; l2 l
  • A = fscanf(fileID,formatSpec);
  • %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
  • A = fscanf(fileID,formatSpec,sizeA);
  • %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。
    , Y1 L1 }7 a: z& I& Q& e. u
4 i1 T6 F! p3 V0 d$ K. D
* o2 ?; f/ n" |0 k2 A$ A& @- c# Y
所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。
/ ]: _# O6 o5 M# _* q8 T% M光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:3 r9 b7 D3 B" L$ J
16。2。3。13
" n2 ]1 y. ^& D) Y# ~4 [& z5。11。10。88 X9 q0 ?" J5 \! z: {) z3 B
9。7。6。12
$ h" k+ i( }$ X3 C: |' p0 ?4。14。15。17 g/ j0 I+ O6 {/ l3 q2 ]4 j+ N7 d
% _$ J4 h9 j# o% v& T5 g
  • 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, q8 }, ~  g: D0 ^8 v' O2 f
! U% i3 s* J' D8 z$ ]! |# S
8 L: J: A' H3 a2 Y1 ~: @
下面详细解释一下 fscanf 的读取原理:
1 V; ~6 s& i9 {4 t' @  X' _4 j1 R9 `# W# P# Q
当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。6 j% u! Z8 `9 L* P3 ~5 L
用下面图片进行说明:$ I; ^8 \6 \/ A7 J

, @; @: ^, J" z  D: V# l
: r0 @3 c$ e" @( g  [: ]" S
  O* j' j6 P; t/ z, ~2 k' O3 p/ \; Y+ |; p2 c: m2 \& F+ ~! j
如果将这个例子的读取代码写成:! E' ?! x* D3 X* {. [# v

2 ~' B+ G, z/ L: \' D
  • fid = fopen('test.txt');
  • A = fscanf(fid,'%d。',[4,4])
  • fclose(fid);
  • A = A.': {, U" a' l: R$ Z7 ^- f+ V

/ T4 F' p# n% S将会得到:
: c5 o- S2 m9 _1 o/ Y' x- E$ p5 H: T% d
  • A =
  •     16     2     3    13
    ! j7 u2 i3 }" e, ], L; k
2 j( z1 r& o' z/ j: }! G

/ n5 a+ R! ?- Y7 P- l. N原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。
  G3 F) ?1 \% |) [: D; Y2 `  Q* G再以一个比较复杂的文本文件为例:
/ Q6 f0 ?% D: W  y  K例:文本文件test.txt包含以下数据:
/ t( r3 k5 Y% Y8 \! P8 qlambda: 7.580000e-05 1 C- ~+ Y& z9 `9 Q) C
lambdaB: 8.000000e-05
9 m8 n) w6 j2 h0 R5 Q* s, oinitial pulse width: 7.853636e-13; }9 L5 r: c% \: l0 J# l3 ^4 W& v
output pulse width: 6.253030e-138 G- T0 R, j6 r  [. C& @
dispersion length: 6.307732e-02) z  x  F* \" e7 Z+ e' x
nonlinear length: 9.572495e-01
1 \. s* |- u  r9 @3 W5 h- _  o& O# u8 Z
lambda: 7.590000e-05
) Y8 w; \8 b* ylambdaB: 8.000000e-05- s/ n" A4 X7 \! o+ ~
initial pulse width: 7.848788e-13
7 E; C! T. v8 w5 H9 _0 foutput pulse width: 5.778485e-130 U$ M$ J+ E& Y5 P  _5 y& K
dispersion length: 5.852858e-02
' m7 E5 n- v$ l8 m. X. Q* d3 O/ knonlinear length: 9.195277e-01& f1 N( z' N2 P, v+ H
! T% [1 c. E1 [
! a; O* b5 k5 \; P: _/ X' y
- a( c% `3 A9 @; o
现在想要把所有的数字信息提取出来:( I" `: ^. m/ r* H+ `$ R0 D1 `

/ Q8 U6 v- i/ U
  • 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);' d9 \* D, p* a; g  r7 C3 c
( ]$ W" \/ q8 @
/ J' C3 K8 |2 U4 M6 M% \

$ q- ?% M* R/ f. P9 O* i
! E7 `- R/ Z3 u$ Q) z

该用户从未签到

2#
发表于 2021-4-27 10:56 | 只看该作者
MATLAB读取文本文件之fscanf函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-31 05:32 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表