初识MATLAB之⽂件读取
初识MATLAB之⽂件读取
  MATLAB的每⼀个脚本⽂件,⼏乎都涉及到⽂件的读写操作,我以⼏个案例来分析MATLAB的⽂件读取的基本操作。
1. 打开与关闭⽂件
  打开⽂件的函数为fopen,关闭⽂件的函数为fclose。这⾥将MATLAB中help帮助的内容拿出来介绍具体。
  FID = fopen(FILENAME,PERMISSION) 打开⽂件FILENAME,由PERMISSION指定的模式:
  'r'   打开⽂件进⾏阅读
  'w'   打开⽂件写; 丢弃现有内容
  'a'  打开或创建⽂件以供写作; 将数据附加到⽂件末尾
  'r+'   打开(不创建)⽂件进⾏读写
  'w+'  打开或创建⽂件进⾏阅读和写作; 丢弃现有内容
  'a+'  打开或创建⽂件进⾏阅读和写作; 将数据附加到⽂件末尾
  'W'   打开⽂件进⾏写⼊⽽不⾃动刷新
  'A'   打开⽂件,⽆需⾃动刷新即可追加 
  仅当⽂件时,FILENAME可以是MATLABPATH相对部分路径名打开阅读。
  您可以以⼆进制模式(默认)或⽂本模式打开⽂件。在⼆进制模式下,没有任何字符被挑出来进⾏特殊处理。在PC上的⽂本模式中,前⾯有回车符在输⼊中删除换⾏符并在换⾏符之前添加输出中的字符。要以⽂本模式打开⽂件,请将“t”附加到权限字符串,例如'rt'和'w +
t'。(在Unix上,⽂本和⼆进制模式是相同的,所以这没有效果。在PC系统上这很关键。)
  status = fclose(FID)  丢失与⽂件标识符FID关联的⽂件,这是从早先调⽤FOPEN获得的整数值。 fclose如果成功则返回0,否则返回-1。如果FID不代表打开⽂件,或者等于0(标准输⼊),1(标准输出),或2(标准错误),fclose引发错误。
  以下为⼀个打开与关闭⽂件的案例:
>> filename='';
permission='r';
fid=fopen(filename,permission),
status=fclose(fid)
  案例分析:⽂件名 ,打开⽅式只读,⽂件标识为4,status 为0,关闭正常。
fid =
4
status =
2. fwrite和fread函数
  使⽤fwrite和fread函数来对⼆进制⽂件进⾏读写,这⾥有三个案例,分别为写操作案例,读操作案例和不能同时读写案例。
2.1 fwrite函数
  MATLAB中help帮助中对fwrite函数是这样介绍的:
  COUNT = fwrite(FID,A,PRECISION)  写出矩阵A的元素到指定的⽂件,将MATLAB值转换为指定的值精确。
  PRECISION控制结果的形式和⼤⼩。查看列表FREAD允许的精度。如果未指定PRECISION,MATLAB使⽤默认值,即'uint8'。如果是'bitN'或'ubitN'⽤于PRECISION,然后⽤于任何超出范围的值A.被写为⼀个值,所有位都打开。如果精度是'char'或'char * 1',MATLAB使⽤编码写字符与⽂件关联的⽅案。有关更多信息,请参见FOPEN。
filename='input2.bin';
permission='r+';
fid=fopen(filename,permission);
a=magic(5);
precision='int32';
count=fwrite(fid,a,precision),
status=fclose(fid)
  案例分析:⽂件名input2.bin,打开⽅式读写,status 为0,关闭正常。写⼊的矩阵为特殊矩阵magic(5),count 为25,表⽰写⼊了25个元素,是正确的。
count =
25
status =
2.1 fread函数
  MATLAB中help帮助中对fread函数是这样介绍的:
  A = fread(FID,SIZE,PRECISION)   根据⽂件来阅读⽂件字符串PRECISION指定的数据格式。该PRECISION输⼊通常包含⼀个数据类型说明符'int'或'float',后跟⼀个给出⼤⼩的整数位。使⽤此语法时,SIZE参数是可选的。 
  以下任何字符串,MATLAB版本或可以使⽤它们的C或Fortran等价物。如果没有指定,默认精度为'uint8'。
>> filename='input2.bin';
permission='r+';
fid=fopen(filename,permission);
precision='int32';
data=reshape(fread(fid,count,precision),5,5)
status=fclose(fid)
  案例分析:⽂件名input2.bin,打开⽅式读写,status 为0,关闭正常。由2.1的案例可知写⼊的矩阵为特殊矩阵magic(5),使⽤fread 函数读出的矩阵为data,如下所⽰。
data =
17241815
23571416
46132022
101219213
11182529
status =
2.3 不能同时读写案例
  当分别实现了读写⽂件后,我想可不可以在同⼀次打开的⽂件中,先进⾏写操作,再进⾏读操作。案例(⾄少这个)证实我不能这样⼲。但可以进⾏完写吃操作后关闭⽂件在打开再进⾏读⽂件操作。详见4.中的案例。(如果可以这样做是我没法实现,请评论留⾔,谢谢)
>> filename='input2.bin';
permission='r+';
fid=fopen(filename,permission);
a=magic(5);
precision='int32';
count=fwrite(fid,a,precision);
data=reshape(fread(fid,count,precision),5,5)
status=fclose(fid)
  案例分析:以下为报错结果,我没法解决。
Error using reshape
To RESHAPE the number of elements must not change.
3. fprintf和fscanf函数
  使⽤fprintf和fscanf函数来对⽂本⽂件进⾏读写,这⾥有两个案例,分别为写操作案例和读操作案例。
3.1 fprintf函数
  MATLAB中help帮助中对fprintf函数是这样介绍的:
  fprintf(FID, FORMAT, A, ...)   将FORMAT应⽤于所有元素数组A和列顺序中的任何其他数组参数,并
写⼊数据到⽂本⽂件。 FID是整数⽂件标识符。获得来⾃FOPEN的FID,或将其设置为1(标准输出,屏幕)或2(标准错误)。 fprintf使⽤中指定的编码⽅案打电话给FOPEN。
>> filename='';
permission='r+';
fid=fopen(filename,permission);
a=magic(5);
format='%d %d %d %d %d\n';
count=fprintf(fid,format,a);
status=fclose(fid),
  案例分析:⽂件名,打开⽅式读写,status 为0,关闭正常。写⼊的矩阵为特殊矩阵magic(5),,表⽰显
⽰ ⽂件中的内容,如下所⽰是正确的。且写⼊⽂件中的格式为'%d %d %d %d %d\n',代表每个元素以‘ ’隔开,且每个5就换⾏。
status =
172341011
24561218
17131925
81420212
15162239
3.2 fscanf函数
  MATLAB中help帮助中对fscanf函数是这样介绍的:
  fscanf(FID,FORMAT,SIZEA)   从⽂本⽂件中读取和转换数据按列顺序进⼊数组A. FID是从中获取的⽂件标识符FOPEN。 COUNT是⼀个可选的输出参数,返回数字元素成功阅读。 
  FORMAT是包含普通字符和/或转换的字符串规范,包括%字符,可选星号赋值抑制,可选的宽度字段和转换字符(例如
d,i,o,u,x,e,f,g,s或c)。
  将SIZEA元素放⼊A.SIZEA的有效表格是:
inf读取到⽂件末尾。(默认)
N最多将N个元素读⼊列向量。
[M,N]读取⾄多填充M-by-N矩阵的M * N个元素
按列顺序。 N可以是inf,但M不能。
>> filename='';
permission='r+';
fid=fopen(filename,permission);
a=magic(5);
format='%d';
count=fscanf(fid,format,[5,inf]),
status=fclose(fid),
  案例分析:⽂件名,打开⽅式读写,status 为0,关闭正常。由3.1的案例可知写⼊的矩阵为特殊矩阵magic(5),使⽤函数fscanf读出的矩阵为count,如下所⽰。且与所给出的矩阵对⽐,说明使⽤正确。
count =
17241815
23571416
46132022
101219213
11182529
status =
172341011
24561218
17131925
81420212
15162239
4. ⽂件读写位置控制
  我们可以⾃主控制⽂件的读写的位置。主要有四个函数,feof函数,frewind函数,fseek函数,ftell函数。以下案例将打开与关闭⽂件,读与写⽂本⽂件的操作都复习了⼀遍。且简单介绍feof函数,frewind函数,fseek函数,ftell函数的内容:
  ST = feof(FID) 如果⽂件结束指⽰符,则返回1已设置⽂件标识符FID的⽂件,否则为0。当对⽂件执⾏
读取操作时,将设置⽂件结束指⽰符与FID相关联的尝试读取超过⽂件末尾的内容。
  frewind(FID)  将⽂件位置指⽰器设置为开头与⽂件标识符FID关联的⽂件。
  STATUS = fseek(FID, OFFSET, ORIGIN)  重新定位⽂件位置与给定FID关联的⽂件中的指⽰符。 fseek设置了位置指⽰符指向相对于指定OFFSET的字节起源。
  OFFSET值解释如下:
> = 0在ORIGIN之后移动位置指⽰符OFFSET字节。
<0在ORIGIN之前移动位置指⽰器OFFSET字节。
  ORIGIN值解释如下:
'bof'或-1⽂件开头
'cof'或0⽂件中的当前位置
'eof'或1⽂件结尾
  POSITION = ftell(FID)  返回⽂件位置的位置指定⽂件中的指⽰符。位置以字节表⽰从⽂件的开头。如果返回-1,则表⽰查询不成功。使⽤FERROR来确定性质的错误。
1 >> filename='';
2 permission='r+';
3 fid1=fopen(filename,permission);
4 a=magic(5);
5 format='%d %d %d %d %d\n';
6 count=fprintf(fid1,format,a);
7 status=fclose(fid1),
8 fid2=fopen(filename,permission);
9 a=magic(5);
10 format='%d';
11 count=fscanf(fid2,format,[5,inf]),
12 eof=feof(fid2),
13 frewind(fid2),
14 status=fseek(fid2,3,0),
15 position=ftell(fid2),
16 status=fclose(fid2),
  案例分析:eof为0,代表⽂件的末尾指⽰值未被设定,第20⾏的status 为0,代表,设定指针位置操作成功。position 为3,代表指针距离⽂件起始位置的距离为3字节。第30⾏和第1⾏的status代表⽂件关闭正常
1 status =
2matlab二进制字符串转数组
30
4
5
6 count =
7
817241815
923571416
1046132022
11101219213
1211182529
13
14
15 eof =
16
170
18
19
20 status =
21
220
23
24
25 position =
26
273
28
29
30 status =
31
320
  总结:内容的总结不想写了,特别提及⼀点,这次我真正学会了代码粘贴的正确姿势。最后如果你对内容有所疑问可评论留⾔。谢谢阅读。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。