Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

使用低级 I/O 导出到文本数据文件

使用 fprintf 写入到文本文件

以下示例演示如何使用低级 fprintf 函数创建文本文件,其中混合了数值、字符数据和非矩形文件。

fprintf 基于其在 ANSI® 标准 C 库中的名称。但是,MATLAB® 使用向量化版本的 fprintf,后者使用最少的控制循环写入数组中的数据。

打开文件

创建一个包含两行的样本矩阵 y

x = 0:0.1:1;
y = [x; exp(x)];

使用 fopen 打开文件以进行写入并获取文件标识符 fileID。默认情况下,fopen 以只读方式打开文件,所以您必须指定写入或追加权限,例如 'w''a'

fileID = fopen('exptable.txt','w');

写入到文件

使用 fprintf 函数写入标题,并后跟一个空行。要移动到文件中的新行,请使用 '\n'

fprintf(fileID, 'Exponential Function\n\n');

注意:某些 Windows® 文本编辑器,包括 Microsoft® 记事本,需要换行符序列 '\r\n' 而不是 '\n'。但是,'\n' 满足 Microsoft Word 或 WordPad 的要求。

按列顺序将值写入到 y,这样两个值显示在文件的每一行中。fprintf 根据您的设定将数组输入中的数值或字符转换为文本。指定 '%f' 可输出浮点数。

fprintf(fileID,'%f %f\n',y);

其他常见的转换设定符包括表示整数的 '%d' 或表示字符的 '%s'fprintf 重新应用转换信息以按列顺序循环使用输入数组的所有值。

写入完成后,使用 fclose 关闭文件。

fclose(fileID);

使用 type 函数查看文件的内容。

type exptable.txt
Exponential Function

0.000000 1.000000
0.100000 1.105171
0.200000 1.221403
0.300000 1.349859
0.400000 1.491825
0.500000 1.648721
0.600000 1.822119
0.700000 2.013753
0.800000 2.225541
0.900000 2.459603
1.000000 2.718282

其他格式化选项

可以选择在对 fprintf 的调用中包括其他信息以描述字段宽度、精度或者输出值的顺序。例如,指定指数表中的字段宽度和小数点右侧的位数。

fileID = fopen('exptable_new.txt', 'w');

fprintf(fileID,'Exponential Function\n\n');
fprintf(fileID,'%6.2f %12.8f\n', y);

fclose(fileID);

查看文件的内容。

type exptable_new.txt
Exponential Function

  0.00   1.00000000
  0.10   1.10517092
  0.20   1.22140276
  0.30   1.34985881
  0.40   1.49182470
  0.50   1.64872127
  0.60   1.82211880
  0.70   2.01375271
  0.80   2.22554093
  0.90   2.45960311
  1.00   2.71828183

追加到或覆盖现有的文本文件

以下示例演示如何将值追加到现有的文本文件、重写整个文件,以及仅覆盖文件的一部分。

默认情况下,fopen 使用只读访问权限打开文件。要更改文件访问权限的类型,请在对 fopen 的调用中使用权限设定符。可能的权限设定符包括:

  • 'r',用于读取

  • 'w',用于写入、放弃文件的任何现有内容

  • 'a',用于追加到现有文件的结尾

要打开文件进行读取和写入或追加,请将一个加号附加到权限,例如 'w+''a+'。如果打开文件进行读取和写入,则必须在读操作和写操作之间调用 fseekfrewind

追加到现有的文本文件

创建一个名为 changing.txt 的文件。

fileID = fopen('changing.txt','w');
fmt = '%5d %5d %5d %5d\n';
fprintf(fileID,fmt, magic(4));
fclose(fileID);

changing.txt 的当前内容为:

16 5 9 4

2 11 7 14

3 10 6 15

13 8 12 1

打开有权进行追加的文件。

fileID = fopen('changing.txt','a');

在文件末尾写入值 [55 55 55 55]

fprintf(fileID,fmt,[55 55 55 55]);

关闭文件。

fclose(fileID);

使用 type 函数查看文件的内容。

type changing.txt
   16     5     9     4
    2    11     7    14
    3    10     6    15
   13     8    12     1
   55    55    55    55

覆盖整个文本文件

文本文件由一系列连续字符组成,包括换行符。要将文件的某行替换为不同数量的字符,必须重写要更改的行和该文件中的所有后续行。

changing.txt 的第一行替换为更长的描述性文本。由于更改将应用到第一行,因此将重写整个文件。

replaceLine = 1;
numLines = 5;
newText = 'This file originally contained a magic square';

fileID = fopen('changing.txt','r');
mydata = cell(1, numLines);
for k = 1:numLines
   mydata{k} = fgetl(fileID);
end
fclose(fileID);

mydata{replaceLine} = newText;

fileID = fopen('changing.txt','w');
fprintf(fileID,'%s\n',mydata{:});
fclose(fileID);

查看文件的内容。

type changing.txt
This file originally contained a magic square
    2    11     7    14
    3    10     6    15
   13     8    12     1
   55    55    55    55

覆盖文本文件的一部分

将 changing.txt 的第三行替换为 [33 33 33 33]。如果要使用完全相同数量的字符替换文本文件的一部分,则无需重写文件中的任何其他行。

replaceLine = 3;
myformat = '%5d %5d %5d %5d\n';
newData = [33 33 33 33];

将文件位置标记移动到正确行。

fileID = fopen('changing.txt','r+');
for k=1:(replaceLine-1);
   fgetl(fileID);
end

在读写操作之间调用 fseek

fseek(fileID,0,'cof');

fprintf(fileID, myformat, newData);
fclose(fileID);

查看文件的内容。

type changing.txt
This file originally contained a magic square
    2    11     7    14
   33    33    33    33
   13     8    12     1
   55    55    55    55

使用不同的字符编码打开文件

编码方案支持特定字母所需的字符,例如日语或欧洲语言字符。常见的编码方案包括 US-ASCII 或 UTF-8。

如果在打开文件进行读取时没有指定编码方案,fopen 会使用自动字符集检测来确定编码。如果在打开文件进行写入时没有指定编码方案,fopen 默认使用 UTF-8,以便在所有平台和区域设置之间提供互操作性,而不会丢失或损坏数据。

要确定默认编码方案,请打开文件,并再次使用以下语法调用 fopen

[filename, permission, machineformat, encoding] = fopen(fid);

如果在打开文件时指定了编码方案,以下函数将应用该方案:fscanffprintffgetlfgetsfreadfwrite

有关支持的编码方案的完整列表以及用于指定编码的语法,请参阅 fopen 参考页。

另请参阅

| |

相关主题