首页 > 编程笔记 > MATLAB笔记 阅读:3

MATLAB fscanf()和fprintf()读写文本文件(附带实例)

文本文件是最便于使用和共享的文件,几乎适用于任何计算机。许多基于文本的程序可读取基于文本的文件。

如果需要通过其他应用程序访问数据,如文字处理或电子表格应用程序,可将数据存储在文本文件中。如果需要将数据存储在文本文件中,使用字符串函数可将所有的数据转换为文本字符串。文本文件可包含不同数据类型的信息。

如果数据本身不是文本格式(如图形或图表数据),由于数据的 ASCII 码表示通常要比数据本身大,因此文本文件要比二进制和数据记录文件占用更多内存。例如,将 -123.4567 作为单精度浮点数保存时只需 4 个字节,如使用 ASCII 码表示,需要 9 个字节,每个字符占用一个字节。

另外,很难随机访问文本文件中的数值数据。尽管字符串中的每个字符占用一个字节的空间,但是将一个数字表示为字符串所需要的空间通常是不固定的。

将数值数据保存在文本文件中,可能会影响数值精度。计算机将数值保存为二进制数据,而通常情况下数值以十进制的形式写入文本文件。因此,将数据写入文本文件时,可能会丢失数据精度。二进制文件中并不存在这种问题。

文件 I/ O函数可在文本文件和电子表格文件中读取或写入数据。

MATLAB读文本文件

在 MATLAB 中,fscanf() 函数用于读取文本文件中的数据。

fscanf() 函数的调用格式及说明如下表所示:

表:fscanf() 函数调用格式及说明
调用格式 说明
A = fscanf(fileID,formatSpec) 将打开的文本文件中的数据读取到列向量 A 中,并根据 formatSpec 指定的格式解释文件中的值
A = fscanf(fileID,formatSpec,sizeA) 将文件数据读取到维度为 sizeA 的数组 A 中,并将文件指针定位到最后读取的值之后。sizeA 必须为正整数或采用 [m n] 的形式,其中 m 和 n 为正整数
[A,count] = fscanf(...) 返回 fscanf 读取到 A 中的字段数 count

【实例 1】将文件内容读取到列向量中。创建文本文件 read_ex.txt,输入数据,以空格或制表符分隔,如下图所示。


图 1 文本文件

在 MATLAB 命令行窗口输入如下命令:
>> close all                           % 关闭当前已打开的文件
>> clear                               % 清除工作区的变量
>> fileID = fopen('read_ex.txt','r');  % 打开要读取的文本文件
>> A=fscanf(fileID,'%f\n')             % 读取文本文件中的浮点数数据
A =
  16.5500
   2.8700
   3.6500
   5.8600
  11.4200
  10.7800
   9.6300
   7.4700
   6.2100
>> fclose(fileID);                     % 关闭文件

MATLAB写文本文件

在 MATLAB 中,使用 fprintf() 函数将数据写入文本文件。

fprintf() 函数的调用格式及说明如下表所示:

表:fprintf() 函数调用格式及说明
调用格式 说明
fprintf(fileID,formatSpec,A1,⋯,An) 按列顺序将 formatSpec 应用于数组 A1, A2, ⋯, An 的所有元素,并将数据写入一个文本文件
fprintf(formatSpec,A1,⋯,An) 设置数据的格式并在屏幕上显示结果
nbytes = fprintf(⋯) 返回 fprintf 所写入的字节数

【实例 2】输出文本值。在 MATLAB 命令行窗口中输入如下命令:
>> close all    % 关闭当前已打开的文件
>> clear        % 清除工作区的变量
>> T=[0 32.5 46.3 78.8 85.5 96.6 107.3 110.4 115.7 118 119.2 119.8 120]; % 输入温度T 的数据
>> formatSpec = 'X is %4.2f meters or %8.3f mm\n';  % 设置输出字段的格式
>> fprintf(formatSpec,T)                            % 以指定的格式在屏幕上输出字段
X is 0.00 meters or   32.500 mm
X is 46.30 meters or   78.800 mm
X is 85.50 meters or   96.600 mm
X is 107.30 meters or  110.400 mm
X is 115.70 meters or  118.000 mm
X is 119.20 meters or  119.800 mm
X is 120.00 meters or >> 1                          % 用户输入
ans =
    1
注意,%4.2f 指定输出中每行的第 1 个值为浮点数,字段宽度为四位,包括小数点后的两位数。%8.3f 指定输出中每行的第 2 个值为浮点数,字段宽度为八位,包括小数点后的三位数。\n 为新起一行的控制字符。

下表显示了要将数值和字符数据格式化为文本的转换字符:

表:转换字符
值类型 转换 详细信息
有符号整数 %d 或 %i 以 10 为基数
无符号整数 %u 以 10 为基数
%o 以 8 为基数(八进制)
%x 以 16 为基数(十六进制),小写字母 a-f
%X 与 %x 相同,大写字母 A~F
浮点数 %f 定点记数法(使用精度操作符指定小数点后的位数)
%e 指数记数法,例如 3.141593e+00(使用精度操作符指定小数点后的位数)
%E 与 %e 相同,但为大写,例如 3.141593E+00(使用精度操作符指定小数点后的位数)
%g 更紧凑的 %e 或 %f,不带尾随零(使用精度操作符指定有效数字位数)
%G 更紧凑的 %E 或 %f,不带尾随零(使用精度操作符指定有效数字位数)
字符或字符串 %c 单个字符
%s 字符向量或字符串数组。输出文本的类型与 formatSpec 的类型相同

读取操作如果遇到回车符后加换行符(\r\n),则会从输入中删除回车符,写入操作在输出中的任何换行符之前插入一个回车符。

【实例 3】将数据写入文本文件。创建 txt 文件 cos.txt。输入下面的数据(如下图所示):
x = 0:.1:1;
A = [x^2;cos(x)];

图 2 TXT文件

在 MATLAB 命令行窗口输入如下程序:
>> close all                                  % 关闭当前已打开的文件
>> clear                                      % 清除工作区的变量
>> fileID = fopen('cos.txt','a');             % 打开要写入的文件,在文件末尾追加数据
>> fprintf(fileID,'%6s %12s\n','x','cos(x)'); % 以指定格式将数据写入文件
>> fclose(fileID);                            % 关闭文件
运行后的文本文件添加的数据如下图所示:


图 3 追加数据

相关文章