10 文件输入输出

Download Report

Transcript 10 文件输入输出

文件操作
一、Matlab文件导入/导出基础
二、内存变量导入/导出
三、文本文件导入/导出
四、电子表格导入/导出
五、图形文件导入/导出
六、音频视频文件导入/导出
七、底层I/O函数
一、Matlab文件导入/导出基础
1. Matlab文件导入/导出支持的文件格式
文件内容
扩展名
MATLAB formatted data
MAT
Text
CSV,TXT,……
Spreadsheet
XLS,LSX,XLSM,……
Extensible Markup Language
XML
Data Acquisition Toolbox™ file
DAQ
Scientific data
CDF,FITS,HDF,H5,NC
Image
BMP,GIF,HDF,JPEG,……
Audio
WAV,M4A,MP4,……
Video
AVI,MPG,ASF,MP4,……
2、数据导入通用函数
importdata
uiimport
Load data from file
Import data interactively
importdata 和 uiimport 都不支持导入H5 and netCDF 文件
importdata 还不支持导入 HDF files.
当只导入文件的一部分时,可使用针对特定文件格式专
门定制的导入函数,这些定制导入函数比通用导入函数提供了
更多的选项。
(1)importdata
从文件导入数据
A = importdata(filename) 将数据从文件导入数组A
A = importdata(‘-pastespecial’) 将数据从粘贴板导入数组A
A = importdata(___,delimiterIn) 将ASCII文件中的分隔符
delimiterIn解释为列分隔符
A = importdata(___,delimiterIn,headerlinesIn) 导入数据,数值
数据从第headerlinesIn+1行开始.
[A,delimiterOut,headerlinesOut] = importdata(___) 导入数据,
返回从输入ASCII文件中检测到的分隔符到变量delimiterOut,
文件头的总行数到变量 headerlinesOut
例1:导入并显示一幅图像
A = importdata('ngc6543a.jpg');
image(A)
例2:导入ASCII文件
>> edit myfile01.txt
创建编辑ASCII文件,拷贝下面的数据并存盘
Day1 Day2 Day3 Day4 Day5 Day6 Day7
95.01 76.21 61.54 40.57 5.79 20.28 1.53
23.11 45.65 79.19 93.55 35.29 19.87 74.68
60.68 1.85 92.18 91.69 81.32 60.38 44.51
48.60 82.14 73.82 41.03 0.99 27.22 93.18
89.13 44.47 17.63 89.36 13.89 19.88 46.60
filename = 'myfile01.txt';
delimiterIn = ' ';
headerlinesIn = 1;
A = importdata(filename,delimiterIn,headerlinesIn);
A=
A为结构
data: [5x7 double]
textdata: {'Day1' 'Day2' 'Day3' 'Day4' 'Day5' 'Day6' 'Day7'}
colheaders: {'Day1' 'Day2' 'Day3' 'Day4' 'Day5' 'Day6' 'Day7'}
(2) uiimport
交互式导入数据
uiimport 打开导入数据向导
uiimport(filename) 打开导入数据向导,显示文件filename的内容
uiimport(‘-file’) 打开导入数据向导,显示文件选择对话框
uiimport(‘-pastespecial’) 打开导入数据向导,显示粘贴板内的内容
S = uiimport(___) s将导入结果存储为结构S的记录(fields)
练习:使用uiimport数据导入向导,把myfile01.txt文件中的数据
导入matlab。
二、内存变量的保存和导入
MATLAB提供一种特殊的数据文件格式——MAT文件,这种
文件是一种二进制格式文件,扩展名为 .mat,它为MATLAB提供
了跨平台的数据交互能力,是MATLAB用户最常用的数据文件格
式。在MATLAB中,可以将当前工作空间中的变量保存成MAT文
件,也可以将MAT文件中的数据导入到MATLAB的工作空间中,
这两个过程分别使用save指令和load指令就可以完成。
文件内容
MATLAB
formatted data
扩展名
MAT
描述
导入函数 导出函数
Saved MATLAB workspace
load
save
Partial access of variables in
MATLAB workspace
matfile
matfile
1. save() 将工作空间中的变量保存到磁盘文件
save(filename) 将工作空间中所有的变量保存到文件filename,若文件已存
在,则覆盖原文件。不指定filename,则保存到默认文件matlab.mat
save(filename,variables,fmt) 指定格式fmt保存变量variables(可选项)
到文件filename
save(filename,variables,version) 指定MAT文件版本保存变量variables
(可选项)到文件filename
save(filename,variables,‘-append’) 追加变量variables (可选项)到已
存在的文件filename(不是覆盖原文件)
save filename save的命令形式,可减少输入(不需要输入圆括号,字符
串也不必使用单引号,参数之间用空格隔开即可。)
新版 MATLAB( R2014b及以后)重新构建了图形系统,若在Mat文件中
保存了图形,那么以前MATLAB的版本将无法打开这个Mat文件。可使用
savefig保存为fig格式的文件与以前的版本兼容。
save的可选文件格式
fmt
文件格式
'-mat'
二进制的MAT文件格式(默认格式)
'-ascii'
ASCII文本格式,数据按照8位精度保存
'-ascii','-tabs'
ASCII文本格式,8位精度,使用制表符
作为间隔
'-ascii','-double'
ASCII文本格式,数据按照16位精度保存
'-ascii','-double','-tabs'
ASCII文本格式,8位精度,使用制表符
作为间隔
save的可选文件版本
支持的特性
version
MATLAB版本
'-v7.3'
7.3 (R2006b) or
later
Version 7.0的所有特性,64位系统
上变量可以超过2GB
'-v7'
7.0 (R14) or later
Version 6 的所有特性, 文件将被压缩
并使用Unicode字符编码(默认)
'-v6'
5 (R8) or later
Version 4的所有特性,N维数组,元
胞数组,结构,超过19的字符的变
量名
'-v4'
all
二维双精度、字符、稀疏数组
To view or set the default version for MAT-files, select a MATfile save format option in the General Preferences.
例1:保存所有变量到一个.mat文件中
若文件名为一个变量,必须使用函数形式调用save
filename = 'test.mat';
save(filename)
也可以使用命令形式调用save:
save test.mat
例2:保存指定变量到一个.mat文件中
创建两个变量p,q,保存到文件pqfile.mat.
p = rand(1,10);
q = ones(10);
save('pqfile.mat','p','q')
也可以使用命令形式调用save:
save pqfile.mat p q
例3:用whos()函数查看一个.mat文件中的变量
whos('-file','pqfile.mat')
Name
p
q
Size
1x10
10x10
Bytes Class
80 double
800 double
Attributes
2. load() 将数据文件导入MATLAB工作空间
load(filename)
从文件导入数据,若为MAT格式,则导入所有变量,若
为 ASCII文件,则由文件中的数据创建一个双精度数组
load(filename,variables) 从文件(mat格式)导入指定变量
load(filename,‘-ascii’) 视文件为 ASCII文件,忽略扩展名
load(filename,‘-mat’) 视文件为MAT格式,忽略扩展名
load(filename,‘-mat’,variables) 从文件导入指定变量
S = load(___) 将数据导入S,若为MAT格式文件,则S为结构数组,若为
ASCII文件,则S为双精度数组
load filename
load的命令形式,可减少输入(不需要输入圆括号,字符
串也不必使用单引号,参数之间用空格隔开即可。)
使用load时,数据文件保存在MATLAB的搜索路径上即可,
若不指明文件的扩展名,则数据文件默认按照二进制的MAT文件
格式加载。
例1:导入gong.mat文件中的所有变量
使用函数形式调用load:
clear all
load('gong.mat')
whos
也可以使用命令形式调用load:
load gong.mat
例2:导入gong.mat文件中的指定变量y
使用函数形式调用load:
clear all
load('handel.mat','y')
也可以使用命令形式调用load:
load handel.mat y
三、文本文件的导入/导出
文件内容
Text
扩展名
描述
导入函数
导出函数
Comma delimited numbers
csvread
csvwrite
Delimited numbers
dlmread
dlmwrite
textscan
none
readtable
writetable
any, including:
CSV
TXT
Delimited numbers, or a mix
of strings and numbers
Column-oriented delimited
numbers or a mix of strings
and numbers
csvread
读取以逗号作为间隔符的文本文件
csvwrite
保存数据到文本文件,逗号作为间隔符
dlmread
按照指定的间隔符读取文本文件的数据
dlmwrite
按照指定间隔符将数据写入文本文件
textread
按照指定的格式从文本文件中读取数据
textscan
按照指定的格式从文本文件、字符串中读取数据
readtable
由文件创建表格
writetable
保存表格到文件
type
显示文件内容
1. csvread()
读取csv文件
CSV file:a comma-separated value formatted file
M = csvread(filename)
将 filename(csv文件)中的数据读入数组 M。filename
中只能包含数字,并且数字之间以逗号分隔。M 是一个数组,行
数与 filename 的行数相同,列数为 filename 列的最大值,对于
元素不足的行,以 0 补充。
M = csvread(filename, R1, C1)
读取文件 filename 中的数据,起始行为R1,起始列为C1
,需要注意的是,注意文件的行、列从 0 开始计数。
M = csvread(filename,R1,C1,[R1 C1 R2 C2])
读取文件 filename 中的数据,起始行为R1,起始列为 C1
,读取的数据由数组[R1 C1 R2 C2] 指定,R1、C1 为读取区域
左上角的行和列,R2、C2为读取区域右下角的行和列。也可以
使用电子表格的形式:如 ‘A1..B7’,表示 [0 0 6 1]
例:读取csv文件
先创建一个csv文件csvlist.dat,
将右边的内容拷进文件,然后存盘。
>> edit csvlist.dat
02, 04, 06, 08
03, 06, 09, 12
05, 10, 15, 20
07, 14, 21, 28
读取整个csv文件
filename = 'csvlist.dat';
M1 = csvread(filename)
从指定的起始行、列开始读取csv文件
M2 = csvread('csvlist.dat',2,1)
从起始行、列开始读取csv文件的指定范围的数据
M3 = csvread('csvlist.dat',1,0,[1,0,2,2])
2. csvwrite( )
将数值数值输出为csv文件
csvwrite(filename,M)
将数值数值M输出为csv文件filename
csvwrite(filename,M,row,col)
在文件的第row行,第col列开
始输出数组,文件的行、列从0开始计数。
M = rand(3,4)
csvwrite('csvlist2.dat',M)
在命令行窗口显示文件内容:
type csvlist2.dat
指定输出在文件中的起始位置:
csvwrite('csvlist3.dat',M,3,2)
type csvlist3.dat
3. dlmread()
M = dlmread(filename)
M = dlmread(filename, delimiter)
M = dlmread(filename, delimiter, R, C)
M = dlmread(filename, delimiter, range)
range = [R1 C1 R2 C2]
'A1..B7'
其中参数 delimiter 用于指定文件中的分隔符,其他参数
的意义与 csvread 函数中参数的意义相同。dlmread 函数与
csvread 函数的差别在于,dlmread 函数在读入数据时可以指
定分隔符,不指定时默认分隔符为逗号。
4. dlmwrite
dlmwrite(filename, M) 将 M 写入文件 filename 中,以逗号分隔; 若
文件存在,覆盖原文件;
dlmwrite(filename, M, ‘-append’) 若文件存在,在文件后面追加数据
dlmwrite(filename, M, delimiter) 指定delimiter为分隔符
dlmwrite(filename, M, delimiter, row, col) 指定写入数据的起始位置
dlmwrite(___, Name, Value) 指定参数;
Name-Value Pair Arguments
参数名
功能
‘delimiter’
用于指定分隔符
‘roffset’
行偏移,指定文件第一行的位置 0 (default) | scalar
‘coffset’
列偏移,指定文件第一列的位置 0 (default) | scalar
‘precision’
指定精度 5 (default) | scalar | C-style format string
‘newline’
用于指定换行符
',' (default) | string
‘pc’ | ‘unix‘
'pc' to use a carriage return/line feed (CR/LF)
'unix' to use a line feed (LF).
例: 用dlmwrite()输出数据到文本文件
M = magic(3);
dlmwrite('myFile.txt',M)
type('myFile1.txt')
输出M中的所有数据,默认以 , 为分隔符。
8,1,6
3,5,7
4,9,2
M = magic(3)*pi
dlmwrite('myFile2.txt',M,'delimiter','\t','precision',3)
type('myFile2.txt')
25.1
9.42
12.6
3.14
15.7
28.3
18.8
22
6.28
输出M中的所有数据,指定以 \t 为分
隔符,数据精度为3位数字。
例:使用格式化字符串指定数据的输出格式:
C-style format string
M = magic(3);
dlmwrite('myFile.txt',M,'precision','%.6f');
type('myFile3.txt')
8.000000,1.000000,6.000000
3.000000,5.000000,7.000000
4.000000,9.000000,2.000000
例:使用 -append 选项在已存在的文件后面添加加数据
M = magic(5);
N = magic(3);
dlmwrite('myFile4.txt',M,'delimiter', '\t');
dlmwrite('myFile4.txt',N, '-append',...
'delimiter', '\t')
type('myFile4.txt')
17
23
4
10
11
8
3
4
24
5
6
12
18
1
5
9
1
7
13
19
25
6
7
2
8
14
20
21
2
15
16
22
3
9
例: 用dlmread()读取文本文件
dlmread('myFile4.txt')
读取整个文件
ans =
17
23
4
10
11
8
3
4
24
5
6
12
18
1
5
9
1
7
13
19
25
6
7
2
8
14
20
21
2
0
0
0
15
16
22
3
9
0
0
0
dlmread()读取文
件时会自动补0
dlmread('myFile4.txt', '\t', 2, 3)
从文件的第2行,第3列开始读取,
行、列从0开始计数。
例:有一个text_test.txt文件(可从课程网页下载),包含
60000行数据,每行两个数据以空格分隔,前面的为x,后面的
为y(要注意的是,y的后面也有一个空格)。请绘制出这些数
据在直角坐标系中的图形。
A = dlmread('text_test.txt',' ');
plot(A(:,1),A(:,2))
5. textscan(): 读取复杂的文本文件中的数据
C = textscan(fileID,formatSpec) 按格式formatSpec从文件fileID
中读取数据到元胞数组C
C = textscan(fileID,formatSpec,N) 使用 formatSpecg N 次
C = textscan(str,formatSpec) 从字符串读取数据到元胞数组
C = textscan(str,formatSpec,N)使用 formatSpecg N 次
C = textscan(___,Name,Value) 指定选项
[C,position] = textscan(___)返回position参数
例:使用textscan()读取不同格式的数据。
edit scan1.dat
先创建一个文本文件,内容如下。
09/12/2005 Level1 12.34 45 1.23e10 inf Nan Yes 5.1+3i
10/12/2005 Level2 23.54 60 9e19 -inf 0.001 No 2.2-.5i
11/12/2005 Level3 34.90 12 2e5 10 100 No 3.1+.1i
fileID = fopen('scan1.dat');
C = textscan(fileID,'%s %s %f32 %d8 %u %f %f %s %f');
fclose(fileID);
celldisp(C)
这里textscan 返回的是一个 1×9 元胞数组C
textscan()可以读取复杂的文本文件中的数据,更多的
例子请参考matlab的帮助。
四、电子表格文件的导入/导出
xlsfinfo
获取文件类型等基本信息
xlsread
读取Excel电子表格文件的数据
xlswrite
写入Excel电子表格文件的数据
请自行查阅matlab的帮助系统,了解上面这些函数的用法。
例:
1、用xlswrite()输出一个Excel文件
values = {1, 2, 3 ; 4, 5, 'x' ; 7, 8, 9};
headers = {'First','Second','Third'};
xlswrite('myExample.xlsx', [headers; values]);
2、用xlsread()读取Excel文件
filename = 'myExample.xlsx';
A = xlsread(filename)
五、图像文件的读写
函数
函数说明
imformats
显示matlab支持的图形格式列表及相关信息
imfinfo
获取图形文件信息
imread
读取图形文件
imwrite
写入图形文件
imshow
显示图片
Image
显示图片对象
例:用imwrite()输出png图形
load clown.mat
imwrite(X,map,'myclown.png')
例:读取、修改、另存图形
读取并显示图片,image_test.jpg可从课程网页下载
Img = imread('image_test.jpg');
imshow(Img);
修改图片、显示、存盘
Img(:,:,3)=0;
imshow(Img)
imwrite(Img,'image_new.jpg')
六、音频、视频文件
1、Import and export audio and video files
audioinfo
audioread
audiowrite
mmfileinfo
VideoReader
VideoWriter
Information about audio file
Read audio file
Write audio file
Information about multimedia file
Read video files
Write video files
2、Audio Recording and Playback
audiodevinfo
audioplayer
audiorecorder
sound
soundsc
Information about audio device
Create object for playing audio
Create object for recording audio
Convert matrix of signal data to sound
Scale data and play as sound
3、Audio Utilities
beep
lin2mu
mu2lin
Produce operating system beep sound
Convert linear audio signal to mu-law
Convert mu-law audio signal to linear
例:音频文件的输入输出
1、导入 handel.mat文件中的音频数据,用audiowrite()输出.wav文件
load handel.mat
filename = 'handel.wav';
audiowrite(filename,y,Fs);
clear y Fs
2、用audioread()函数读入音频文件
[y,Fs] = audioread('handel.wav');
3、用sound()函数播放音频文件
sound(y,Fs);
例:视频文件的输入输出
1、从视频文件创建一个视频对象,设定宽度、高度
xyloObj = VideoReader('xylophone.mp4');
nFrames = xyloObj.NumberOfFrames;
vidHeight = xyloObj.Height;
vidWidth = xyloObj.Width;
2、创建一个视频结构
mov(1:nFrames) = ...
struct('cdata',zeros(vidHeight,vidWidth, 3,'uint8'),...
'colormap',[]);
3、用循环读取所有的帧(frame)
for k = 1 : nFrames
mov(k).cdata = read(xyloObj,k);
end
4、创建一个图形窗口,播放视频
hf = figure;
set(hf,'position',[150 150 vidWidth vidHeight]);
movie(hf,mov,1,xyloObj.FrameRate);
七、底层I/O函数
1、 打开、关闭文件 fopen:打开文件
fclose:关闭文件
ferror:文件错误信息
2、 读写数据
fgetl、fgets:每次读一行
fscanf、fprintf:格式化读写文本文件
fileread:读整个文本文件内容
fread、fwrite:读写二进制文件
3、文件位置指针
feof:判断指针是否到达文件尾部
frewind:将指针返回到文件起始位置
ftell:获取当前指针的位置
fseek:设置指针到指定的位置
1、 打开、关闭文件
打开文件:fileID = fopen(filename,permission)
若成功地打开文件,则fileID为>=3的整数,否则为-1
permission为控制文件读写的标识符,它的取值可以为
r
打开的文件进行读操作。
w
打开的文件进行写操作,若文件不存在则创建新的文件。
a
打开的文件进行追加数据操作,若文件不存在则创建新的文件。
r+
打开的文件既可以进行写操作,也可以进行读操作。
w+
打开的文件既可以进行写操作,也可以进行读操作,若文件不存在
则创建新的文件。
a+
打开的文件既可以进行写操作、读操作,也可以进行数据追加操作,
若文件不存在则创建新的文件。
关闭已打开的文件:status = fclose(fileID)
若函数运行成功,则status为0,否则为-1。
2、 读写数据
打开文件之后就可以进行文件内容的读写,MATLAB提供
了两大类低级文件I/O函数进行文件内容的读写——二进制文件
读写函数和文本文件读写函数。
函 数
说 明
输 出
fscanf
从文件中读取格式化的输入
数据矩阵
fprintf
向文件写入格式化的输出
写入数据文件的数据个数
fgetl
读取文本文件的一行数据,不包含文 字符串
本的结束符(换行符)
fgets
读取文本文件的一行数据,包含文本 字符串
的结束符(换行符)
fileread 读取文本文件的所有内容
字符串
fread
读取文件的二进制数据
数据矩阵和读入的数据个数
fwrite
写入文件的二进制数据
写入的字节数
(1) fprintf :格式化输出
fprintf(fileID,formatSpec,A1,...,An)
fprintf(formatSpec,A1,...,An)
nbytes = fprintf(___)
fileID:接收输出数据的文件的文件标识
formatSpec:格式化参数,如下图所示,由 % 开头
A1,…,An:数值数值或字符数组
nbytes:写入数据文件的数据总字节数
Flags、Field width、Precision为可选部分
Conversion character为必须部分
Flags:标记,用于控制输出的对齐方式,可以选择:
-(负号)
+ (正号)
空格
0
在参数左侧进行判别
在数字前添加符号
在数字前插入空格
在数字前插入 0
%-5.2d
%+5.2d
% 5.2d
%05.2d
Field width(宽度)和Precision(精度)指示:通过数字指定输出
数字的宽度及精度,格式为:
%6f
%6.2f
%.2f
指定数字的宽度;
指定数字的宽度及精度;
指定数字的精度。
Conversion character(转换字符)
转换字符
意义
%c
输出单个字符
%d
输出有符号十进制数
%e
用指数格式输出,用小写字母 e,如:3.1415e+00
%E
用指数格式输出,用大写字母 E,如:3.1415E+00
%f
以定点数的格式输出
%g
%e 及 %f 的更紧凑的格式,不显示数字中无效的 0
%G
与 %g 相同,但是使用大写字母 E
%i
有符号十进制数
%o
无符号八进制数
%s
输出字符串
%u
无符号十进制数
%x
十六进制数(使用小写字母 a-f)
%X
十六进制数(使用大写字母 A-F)
转义符:转换字符用于指定输出的符号,
转义符
功能
转义符
功能
\b
退格
\t
tab
\f
表格填充
\\
\,反斜线
\n
换行符
\'' 或 ''
',单引号
\r
回车
%%
%,百分号
例:用 fprintf 函数在显示器上输出字符串。
fprintf(1,'It''s Friday.\n')
It's Friday.
fileID取1 (标准输出)表示显示器(若不提供fileID,默认为1)
用两个单引号显示单引号,使用 \n 进行换行。
例:用 fprintf 函数在显示器上输出。
A1 = [9.9, 9900];
A2 = [8.8, 7.7 ; 8800, 7700];
formatSpec = 'X is %4.2f meters or %8.3f mm\n';
fprintf(formatSpec,A1,A2)
X is 9.90 meters or 9900.000 mm
X is 8.80 meters or 8800.000 mm
X is 7.70 meters or 7700.000 mm
a = [1.02, 3.04, 5.06];
fprintf('%d\n',round(a));
1
3
5
例:用 fprintf 函数输出文本文件。
x = 0:.1:1;
A = [x; exp(x)];
fileID = fopen('exp.txt','w');
fprintf(fileID,'%6s %12s\n','x','exp(x)');
fprintf(fileID,'%6.2f %12.8f\n',A);
fclose(fileID);
type exp.txt
x
0.00
0.10
0.20
0.30
0.40
0.50
0.60
0.70
0.80
0.90
1.00
exp(x)
1.00000000
1.10517092
1.22140276
1.34985881
1.49182470
1.64872127
1.82211880
2.01375271
2.22554093
2.45960311
2.71828183
(2) fscanf():格式化输入
A = fscanf(fileID,formatSpec)
A = fscanf(fileID,formatSpec,sizeA)
[A,count] = fscanf(___)
fileID:
要读取的文件的文件标识
formatSpec:控制如何读取的格式字符串,
A:接受数据的数组,
count:返回从文件读取的变量的个数。
sizeA:指定从文件读取数据的数目,可取:
n 准确地读取n个值。执行完相应的语句后,array将是一个包含有n
个值的列向量
Inf 读取文件中所有值。执行完相应的语句后,array将是一个列向量,
包含有从文件所有值。
[m,n] 从文件中精确定地读取m×n个值,array是一个m×n的数组。
例1: 用fscanf()读取文件中的数据到列向量
先创建一个文本文件
x = 100*rand(8,1);
fileID = fopen('nums1.txt','w');
fprintf(fileID,'%4.4f\n',x);
fclose(fileID);
查看文件内容:
type nums1.txt
读取文件:
fileID = fopen('nums1.txt','r');
formatSpec = '%f';
A = fscanf(fileID,formatSpec)
fclose(fileID);
例2: 用fscanf()读取文件中的数据到二维数组
先创建一个文本文件
x = 1:1:5;
y = [x;rand(1,5)];
fileID = fopen('nums2.txt','w');
fprintf(fileID,'%d %4.4f\n',y);
fclose(fileID);
查看文件内容:
type nums2.txt
读取文件内容(按行的次序,一行一行的读),依次输出至数组
A中(按单下标的次序,也就是按列的次序输出):
fileID = fopen('nums2.txt','r');
formatSpec = '%d %f';
sizeA = [2 Inf];
A = fscanf(fileID,formatSpec,sizeA)
fclose(fileID);
转置A,使数组与文件的行列方向一致:
A = A'
(3) fgetl()
tline = fgetl(fileID) 读取文件下1行的内容,删除换行符。tline
为字符串,若行只包含文件结束标志eof(the end-of-file marker)
,则 tline 为 -1。
例:按行读取并显示文件fgetl.m的内容
fid = fopen('fgetl.m');
tline = fgetl(fid);
while ischar(tline)
disp(tline)
tline = fgetl(fid);
end
fclose(fid);
(4) fgets()
tline = fgets(fileID) 读取文件下1行的内容,保留换行符。tline
为字符串,若行只包含文件结束标志eof(the end-of-file
marker),则 tline 为 -1。
tline = fgets(fileID, nchar) 返回最多nchar个字符
例:按行读取并显示文件fgetl.m的内容
fid = fopen('fgets.m');
tline = fgets(fid);
while ischar(tline)
disp(tline)
tline = fgets(fid);
end
fclose(fid);
因为保留了换行符,disp函数也输
出一个换行符,所有输出的行与行
之间有两个空行。
(5) fileread()
text = fileread(filename) 读取filename的所有内容到字符数组text
text = fileread('cos.m');
text =
%COS
Cosine of argument in radians.
%
COS(X) is the cosine of the elements of X.
%
%
See also ACOS, COSD.
%
%
Copyright 1984-2005 The MathWorks, Inc.
Built-in function.
(6) fwrite(): 输出二进制文件
fwrite(fileID,A)
按8为无符号整数格式(uint8)将数组A(按列的顺序)
输出到文件
fwrite(fileID,A,precision)
用precision 指定数据的类型和大小
fwrite(fileID,A,precision,skip)
输出每个数据前,跳过skip个字节
fwrite(fileID,A,precision,skip,machinefmt)
用machinefmt指定输出字节(byte)的顺序
count = fwrite(___)
count为成功输出到文件的A的元素的个数
precision: 指定数据的类型和大小
Value Type
Precision
uint
uint8
uint16
uint32
Integers,
uint64
unsigned
uchar
无符号整数
unsigned char
ushort
ulong
ubitn
single
double
float
Floating-point
numbers
float32
浮点数
float64
real*4
real*8
Bits (Bytes)
32 (4)
8 (1)
16 (2)
32 (4)
64 (8)
8 (1)
8 (1)
16 (2)
32 (4)
1 ≤ n ≤ 64
32 (4)
64 (8)
32 (4)
32 (4)
64 (8)
32 (4)
64 (8)
Value Type
Integers,
signed
有符号整数
Characters
字符
Precision
int
int8
int16
int32
int64
integer*1
integer*2
integer*4
integer*8
schar
signed char
short
long
bitn
char*1
char
Bits (Bytes)
32 (4)
8 (1)
16 (2)
32 (4)
64 (8)
8 (1)
16 (2)
32 (4)
64 (8)
8 (1)
8 (1)
16 (2)
32 (4)
1 ≤ n ≤ 64
8 (1)
注1
注1:Depends on the encoding scheme associated with the file. Set encoding with fopen
machinefmt:指定输出字节(byte)的顺序
machinefmt — Order for writing bytes
'n'(default) | 'b' | 'l' | 's' | 'a'
'n' or 'native'
'b' or 'ieee-be'
'l' or 'ieee-le'
's' or 'ieee-be.l64'
'a' or 'ieee-le.l64'
Your system byte ordering (default)
Big-endian ordering
Little-endian ordering
Big-endian ordering, 64-bit long data type
Little-endian ordering, 64-bit long data type
对于 bitn 和 ubitn 这两种类型的数据, machinefmt 用来
指定一个字节内的位bit的顺序,字节的顺序有系统决定。
新文件默认使用 little-endian。
例:输出uint8数据至二进制文件
fileID = fopen('nine.bin','w');
fwrite(fileID,[1:9]);
fclose(fileID);
例:输出4-byte整数至二进制文件
fileID = fopen('magic5.bin','w');
fwrite(fileID,magic(5),'integer*4');
fclose(fileID);
例:输出 双精度数至二进制文件
fileID = fopen('magic4.bin','w');
fwrite(fileID,magic(4),'double');
fclose(fileID);
(7) fread():读取二进制文件
A = fread(fileID) A为列向量
A = fread(fileID,sizeA)A为数组,维数为sizeA
A = fread(fileID,sizeA,precision)
用precision 指定数据的类型和大小
A = fread(fileID,sizeA,precision,skip)
两次读取之间跳过skip个字节
A = fread(fileID,sizeA,precision,skip,machinefmt)
用machinefmt指定读取字节(byte)的顺序
[A,count] = fread(___)返回从文件读取的总字符数count
例:读取二进制文件
fileID = fopen('nine.bin');
A = fread(fileID)
fclose(fileID);
例:读取双精度数据文件
fileID = fopen('doubledata.bin','w');
fwrite(fileID,magic(3),'double');
fclose(fileID);
fileID = fopen('doubledata.bin');
A = fread(fileID,[3 3])
fclose(fileID);
默认按uint8读取,每次1个字节,然后转为double
fileID = fopen('doubledata.bin');
B = fread(fileID,[3 3],'double')
fclose(fileID);
指定按double读取,每次读8个字节
例:用fread读取文本文件的内容
fileID = fopen('fread.m');
A = fread(fileID,'*char')';
fclose(fileID);
指定’*char’,fread()读取文本文件,返回字符数组,默
认为列向量,转置后,A为行向量。
3、文件位置指针
当正确地打开文件并进行数据的读写时,MATLAB自动创建
一个文件位置指针来管理和维护文件读写数据的起始位置。所以,
在进行数据文件的读写时,需要通过某种手段来控制和判断当前
文件位置指针,例如判断当前文件位置指针是否已经到达文件尾
部,将文件位置指针移动到指定的位置,获取当前文件位置指针
在文件中的位置以及将文件位置指针重置在文件的头部等。
函数
fseek
ftell
feof
frewind
说
明
设置文件位置指针到指定的位置
获取当前文件位置指针的位置
判断当前的文件位置指针是否到达文件尾部
将文件位置指针返回到文件的起始位置
(1) fseek()
设置文件位置指针到指定的位置
fseek(fileID, offset, origin)
从origin开始,将文件位置指针移动offset个字节
offset:是指移动文件指针的偏移量,单位为字节数,若数值为正,
则向文件尾部的方向移动文件位置指针,若数值为0,则不移动,
若数值为负,则向文件头部的方面移动。
origin:
Starting location in the file:
'bof' or -1 Beginning of file
'cof' or 0 Current position in file
'eof' or 1 End of file
status = fseek(fileID, offset, origin)
操作成功,status为0,否则为-1。
例:从文件test1.dat的第10个字节开始复制5个字节,
添加到文件test2.dat。
% 创建文件test1.dat和test2.dat
% 每个字符用8个bit(1 byte)
fid1 = fopen('test1.dat', 'w+');
fwrite(fid1, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
fid2 = fopen('test2.dat', 'w+');
fwrite(fid2, 'Second File');
% 定位指针到第10个字节(‘J’,从0开始计数), 然后读取5个字节
fseek(fid1, 9, 'bof');
A = fread(fid1, 5, 'uint8=>char');
fclose(fid1);
% Append to test2.dat
fseek(fid2, 0, 'eof');
fwrite(fid2, A);
fclose(fid2);
(2) position = ftell(fileID)
查询文件位置指针的位置,position为整数,数值为当前
位置距离文件开始处(bof)的字节数。 若查询失败,返回 -1。
(3) frewind(fileID)
将文件位置指针返回到文件的起始位置
frewind(fileID)与fseek(fileID, 0, ‘bof’) 作用相同。
(4) status = feof(fileID)
若上一次对文件操作到达文件结束标志,返回1,否则返回 0
例:读取文件bench.dat,每次读一个字符,直到文件结束。
fid = fopen('bench.dat');
k = 0;
while ~feof(fid)
curr = fscanf(fid,'%c',1);
if ~isempty(curr)
k = k+1;
benchstr(k) = curr;
end
end
fclose(fid);