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

MATLAB读取文本文件之fscanf函数

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
3 D  u; M% X- k# u' y$ b
fscanf
. r" B& n/ l. r! s7 q# f9 f按指定格式从文本文件中读取数据。用法:0 O+ X1 _1 P, r7 i8 D# n$ f  P

( B" {  \+ t& C1 K( N5 q9 B  X7 v
  • A = fscanf(fileID,formatSpec);
  • %通过指定读取格式formatSpec,从文本文件中读取数据至列向量A。fscanf会重复应用格式字符串formatSpec,直到文件指针到达文件末尾,如果读取到不能匹配formatSpec的数据则读取自动结束。
  • A = fscanf(fileID,formatSpec,sizeA);
  • %sizeA能够指定读取数据的大小,当读取到sizeA大小的数据时,文件指针会停止,读取结束。注意fscanf读取的是列主序,通常读取完还需要进行转置操作。6 }+ F' Q3 D  s. v4 _! v

- u1 m& O0 r  S* ]1 G% i. r" j5 J! \& Y1 ]: D2 r; {/ ^+ K
所要读取的文本文件被文件标识符 fileID 标识,通过 fopen 函数可以获取文件的 fileID。当结束读取时,一定要记得使用 fclose 函数关闭文件。 3 `  J- H: f& k% Y, x5 ?3 Z: Z; r- v
光看函数的用法介绍可能会比较难懂,通过下面的例子会比较容易理解。 例:文本文件 test.txt 包含以下数据:
! e! U3 B; `: V; D0 K3 n  v16。2。3。13
7 h. }  w3 X. k9 R  K5。11。10。8
2 D5 b  C) S  y3 y- n3 Q9。7。6。12
( X+ y& d9 ]# N0 W9 ]4。14。15。19 `' W8 a- j- A$ F5 G
3 T' J2 w4 M( h* }7 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. j3 ?! L5 }; _# ^' z" ^- `

5 I, W5 f+ c2 M) ^
% N/ B( A8 `, i7 q下面详细解释一下 fscanf 的读取原理: , @) h4 h  e8 z' G* e- `

+ Z+ {# v# p0 j8 o- g& s/ {, e7 {3 m当用 fopen 打开文件时,会有一个文件指针在文件开头。fscanf 通过你设定的格式字符串 formatSpec 来读取数据(formatSpec 由字符串和转义说明符组成,其中转义说明符由 % 开头,以转换字母结尾。上面的例子中 %d 就是一个转义说明符,代表一个整数,常用的还有%f、%s,分别代表浮点数和字符串)。formatSpec 第一个字符块为转义说明符 %d,那么 fscanf 会先将第一个整数16读入进 A,之后文件指针跳至16右边,formatSpec 第2个字符块是字符串’。’,由于它不是转义说明符,文件指针会跳过’。’到达’。’右边。之后再是转义说明符 %d,则将2读入进 A,以此类推。, V, Y" B. X8 k# Z* Y* D
用下面图片进行说明:
, B6 w$ {$ s* X# ~% [% o* U" b: F# `& V. E
, v& Y6 S# [  c
' S' L" ?# j$ t0 E) Q( Q. r
+ ~' }+ c: u  w8 b
如果将这个例子的读取代码写成:
4 c3 D6 x  F. s4 i- F6 d! _# z9 q$ F) _0 f2 F+ ~5 P& m% v. u
  • fid = fopen('test.txt');
  • A = fscanf(fid,'%d。',[4,4])
  • fclose(fid);
  • A = A.') |5 N4 ]5 G" [# m
1 x0 u+ K( Z  ~$ n
将会得到:
/ S) ~$ O4 @/ K" ?8 y# X! c8 J7 w, [$ z- d5 A# ]2 S2 j5 {+ G9 K
  • A =
  •     16     2     3    13
    1 R/ O" d; t7 B9 I! b

) W* O/ S/ G9 z9 o' R& n: r) [7 X; K" i% {# F: g/ L- u
原因就是当文件指针读取完13时,formatSpec 需要匹配的字符串是’。’,但是13的下一个字符串是5,匹配失败,fscanf 停止读取。
. X5 d  y5 }& G$ M再以一个比较复杂的文本文件为例:
/ j2 k7 c1 {, z- ^. k5 x7 a例:文本文件test.txt包含以下数据:# o2 d4 W  P* h$ n+ Z# k5 ^
lambda: 7.580000e-05 & y$ @1 O( _$ x$ ^8 S& m' y6 c
lambdaB: 8.000000e-05
4 K* }# v# h; x# a% t; ]$ {initial pulse width: 7.853636e-13
3 s: X) L3 V3 a" _$ M8 eoutput pulse width: 6.253030e-130 b; T8 n$ Y2 r: s* J
dispersion length: 6.307732e-02$ y9 r% W% O5 P# _3 O$ j. e
nonlinear length: 9.572495e-01' o$ Q) Y4 P8 B. Y( N+ z

1 G3 Z: V2 r; D9 ylambda: 7.590000e-05" c" ?) q" h& G) Q' C" }( R
lambdaB: 8.000000e-05
) B6 J2 k; f( b3 H! ?initial pulse width: 7.848788e-13- X& \* I  A, G6 H. m; Q  b
output pulse width: 5.778485e-13
5 [! p8 c) t+ a4 M7 C, @dispersion length: 5.852858e-02
6 V$ L8 S' `+ x( O6 ^/ qnonlinear length: 9.195277e-01
6 a( I" I: X# C9 d5 U
" G2 V6 s* ]8 c' f  @( V; l" u
& G' T" S) B5 k
7 t  h- z* U  |6 l! A( Z现在想要把所有的数字信息提取出来:
" j$ U: C9 h% Z+ i, o, A: b
) G! x5 g# F6 D9 M, l& J- |  s
  • 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);
    1 v5 L8 b; H, K. }5 Y0 N; y
0 R' u+ o/ F. v% s  {) d
5 h% D0 i' _0 c0 A) |5 V6 J  P
0 g3 b+ M/ R. W: [

) B8 z& B2 H) G' S+ k

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-19 12:20 , Processed in 0.078125 second(s), 26 queries , Gzip On.

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

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

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