matlab的文件操作

2018-5-9

1. fopen、fprintf与fscanf的用法

  • FID = fopen(file_name, mode)

参数:
file_name:输入文件的名字,以字符串的形式读入
mode:读入文件的模式,如下表所示

mode 功能
r 只读
w 覆盖式写入文件,如果文件不存在就创建该文件
a 添加式写入,不清除原文件,直接在该文件后面续写
r+ 打开已经存在的文件来进行读写
w+ 重新刷新读入与写入
a+ 对文件进行添加式读写操作, 如果文件不存在就创建该文件

在写入文件时,如果该文件不存在则会创建该文件,文件打开的默认存储格式是二进制的,如果以文本方式打开,则在mode中加入t,例如’rt’或’wt’

返回值:
FID=n,如果n是正整数,则表示读入文件成功且n表示文件代号,如果FID=-1则读入文件失败,FID类似于python中的文件对象,在文件关闭前FID都是有效的。

示例:

1
2
fid = fopen('test.txt','w+')   % 打开一个文件,返回的fid为一个正整数,假设为fid=7
fclose(fid) % 关闭文件号为fid=7的文件

fopen()函数仅打开了一个文件并返回其文件代号,但无法直接读取文件的内容,所以需要使用fscanf()函数来将文件代号对应文件中的内容读入到字符串变量中,类似于python文件中的readline()函数

  • [VAL, COUNT, ERRMSG] = fscanf (FID, TEMPLATE, SIZE)

参数:
FID:为fopen()函数返回的文件代号
TEMPLAGE:输入数据的格式,如下表所示
SIZE:该参数是针对读取文件内容篇幅的,将文本当做矩阵,SIZE表示返回VAL矩阵的行列值,从原文件读入数据是按照行进行,但是在返回VAL时会将数据按列优先来排列,直到满足SIZE,然后忽略其余数据,SIZE除了取[m,n]类型外,也可以直接取数,取的数决定了VAL的数据的量,如果为inf则直接读取文件的所以内容

表-1 格式描述符

TEMPLATE类型 功能
%d 整数
%e 实数,科学计数法形式
%f 实数,小数形式
%g 会输出整数或实数,由数本身决定,但末尾的0会省去
%s 输出字符串格式
%c 输出字符格式

返回值:
VAL:返回的文件内容,可以是字符串也可以是数字
COUNT:返回的字符串或数字的个数
ERRMSG:当读取文件失败时才会输出stream not open for reading,读入文件正确时该项为空

示例:
test.txt文件中内容如下:
1 2 3
4 5 6
7 8 9
10 11 12

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 fid = fopen('test.txt');
[f1, c1, e1] = fscanf(fid, '%d', [2,3]); % 输出如下
% f1 =
% 1 3 5
% 2 4 6
% c1 = 6
% e1 =
fseek(fid, 0,-1); % 将文件位置指针指向文件头
% 输出ans = 0
[f1, c1, e1] = fscanf(fid, '%d', [3,3]); % 输出如下
% f1 =
% 1 4 7
% 2 5 8
% 3 6 9
% c1 = 6
% e1 =

读取文件时类型混合无法直接读取,
文件如下:
1 hello
2 world
3 happy
只能分别使用fscanf(fid, '%d', 1)fscanf(fid, '%s', 1)按数据类型逐个读入数据(这里使用octave实验)。

这里需要注意,每次使用fscanf()函数读取文件后,文件的指针会移动到当前读取的位置,例如在test.txt示例中,文件指针当前指向数据7,所以必须将文件指针回到文件的开头才能再次使用该文件,这里使用fseek()函数来修改文件的指针

  • status = fseek(fid, offset, origin)

    参数:
    fid:文件代号或文件句柄
    offset:>0 向文件末尾移动; =0 保持位置不变; <0 向文件开头移动
    origin:文件位置指针移动的参考位置,
    ‘bof’ 或 -1表示文件的开头;
    ‘cof’或0表示文件的当前位置;
    ‘eof’或1表示文件的末尾
    返回值:
    status=0表示改变指针位置成功,否则返回-1

  • count = fprintf (fid, template, variable)

    参数:
    fid:文件代号或文件句柄,当该项为空时,直接输出到屏幕中
    template:输出文件的格式,与输入的格式描述相同,见上表-1
    variable:要输出的变量
    返回值:
    count:按文件描述符格式划分的数据个数