跳转到内容

MATLAB 编程/高级主题/高级 IO/从文件读取和写入

来自维基教科书,开放书籍,开放世界

Excel 文件

[编辑 | 编辑源代码]
- xlsread, xlswrite

分隔符文件

[编辑 | 编辑源代码]
- textscan, dlmread, dlmwrite

低级函数

[编辑 | 编辑源代码]

如果您熟悉在 C 中读取和写入文件,这些函数将看起来很熟悉。对于其他用户,如果需要更详细地控制如何读取文件(或者内置函数和 MATLAB 贡献者中心函数无法读取文件),它们很有用。

打开和关闭文件

[编辑 | 编辑源代码]

为了使用低级函数读取和写入文件,您必须首先打开文件。您还必须指定是要读取还是写入文件,以及是否要创建新文件。例如,

>> fid = fopen('TEXTFILE.txt', 'r'); % Read-only (creates a file if there is none there)
>> fid = fopen('TEXTFILE.txt', 'w'); % Write to an existing file (overwrite what is already there)
>> fid = fopen('TEXTFILE.txt', 'w+'); % Write to an existing file or create a new file (overwrite over existing contents)
>> fid = fopen('TEXTFILE.txt', 'a'); % Write to existing file but append to what is already there

还有其他权限,有关详细信息,请参阅 fopen 函数文档。

默认情况下(如果您没有指定权限),当您打开文件时,您只有读取权限。

关于 MATLAB 中的文件 ID 的一个小提示:文件标识符实际上将是一个数字,而某些数字具有特殊含义

fid = -1 ---> cannot open file
fid =  1 ---> standard output
fid =  2 ---> standard error

当您完成一个文件后,最好关闭它,以便其他程序可以使用它,并且您不会意外覆盖数据。关闭文件是使用 fclose 函数完成的

>> fclose(fid);

格式说明符

[编辑 | 编辑源代码]

低级文本读取函数依赖于您(用户)告诉他们要读取或写入的数据类型。但是,它们提供了对输入和输出精度以及它们如何标记的极大控制。格式说明符通过提供占位符然后提供数据来拼接这些占位符来工作。例如,以下格式说明符指示您希望在 %s 指定的位置读取或写入字符串

>> spec = 'Bob has a daughter named %s';

%s 是字符串的占位符。您还可以为整数 (%d)、浮点值 (%x.yf,其中 x 是小数点前要打印的位数,y 是小数点后要打印的位数)、%x 用于十六进制等定义占位符。有关支持的说明符的详细信息,请参阅 fprintf 文档。

要读取包含以下文本的文件(“Daughters.txt”)

Bob has a daughter named Jill

您将使用以下命令

>> fid = fopen('Daughters.txt');
>> spec = 'Bob has a daughter named %s'
>> s = fscanf(spec)
s = Jill
>> fclose(fid);

请注意,只有 %s 指定的字符串实际上被返回,但整个字符串被读取。如果文件改为包含以下内容

Bob has a son named Bob

并且您运行相同的代码,您将获得

>> fid = fopen('Daughters.txt');
>> spec = 'Bob has a daughter named %s'
>> s = fscanf(spec);
s = ''
>> fclose(fid);

什么都没有返回,因为文件中开头没有匹配“Bob has a daughter named”。请注意,以下文件也不会返回任何内容

Bob has a son named Bob
Bob has a daughter named Jill

我们只有在读取了“Bob has a son named Bob”之后才能读取“Bob has a daughter named Jill”。

打印和扫描函数的向量化

[编辑 | 编辑源代码]

与 C 版本的 fscanf 和 fprintf 不同,MATLAB 的打印和扫描函数是“向量化的”,这意味着您可以将矩阵传递给 fprintf 并让它以相同的格式打印所有行,或者您可以要求 fscanf 以相同的方式读取文件的每一行并返回一个矩阵给您。这仅对数值矩阵有效。但是,还有其他更易于使用的函数可以执行相同的任务,但性能损失。

如果您有一个全数值矩阵,除非输入或输出需要特定的数值精度,否则 dlmreaddlmwrite 函数工作得很好。

要从包含字符串的文本文件读取元胞数组,建议在 MATLAB 贡献者中心查找名为 readtext 的例程,该例程与 xlsread/xlswrite 一样易于使用,并以类似的格式返回结果。只要所有行的格式一致(即没有混合字符串和数值的列,没有空白单元格等等),也可以使用 textscan 函数读取此类文件。

类似地,使用来自 MATLAB 贡献者中心的 此文件 可以将元胞数组写入文本。不幸的是,没有内置的等效于 textscan 的函数,可以将格式化数据从元胞数组写入文本文件。

华夏公益教科书