MATLAB 编程/高级主题/高级 IO/从文件读取和写入
- 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 以相同的方式读取文件的每一行并返回一个矩阵给您。这仅对数值矩阵有效。但是,还有其他更易于使用的函数可以执行相同的任务,但性能损失。
如果您有一个全数值矩阵,除非输入或输出需要特定的数值精度,否则 dlmread 和 dlmwrite 函数工作得很好。
要从包含字符串的文本文件读取元胞数组,建议在 MATLAB 贡献者中心查找名为 readtext 的例程,该例程与 xlsread/xlswrite 一样易于使用,并以类似的格式返回结果。只要所有行的格式一致(即没有混合字符串和数值的列,没有空白单元格等等),也可以使用 textscan 函数读取此类文件。
类似地,使用来自 MATLAB 贡献者中心的 此文件 可以将元胞数组写入文本。不幸的是,没有内置的等效于 textscan 的函数,可以将格式化数据从元胞数组写入文本文件。