第6章 6.2.2 文本数据的导出操作 (MATLAB入门课程)

本文详细介绍了MATLAB中如何使用fopen和fprintf函数进行文本数据的导出,包括文件打开模式、数据格式化以及实际案例,如生成乘法口诀表和学生成绩单的编写和保存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​

MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili


在MATLAB中,将文本数据导出到文件中是一个常见的需求,尤其是在生成报告、保存分析结果或创建日志文件等场景中。本小节将详细介绍如何利用fopenfprintf函数协同工作来实现文本数据的导出。

在进行文件导出操作之前,首先需要使用fopen函数打开或者新建一个文件。在上一小节中,我们介绍了fopen函数的用法,我们来快速回顾下:

fid = fopen(filename, permission, machinefmt, encodingIn)

其中,参数filename是目标文件的名称;参数permission指定了文件要被如何使用,例如'r'是只读模式(该模式下无法写入内容,因此这一节我们不会用到)、'w'是写入模式(如果文件已存在则清空其内容再写入数据)、'a'是追加模式(不清空内容直接在末尾追加写入数据);参数machinefmt通常设置为'n',表示按照系统默认的字节排序方式读写数据;参数encodingIn则用于指定文件的字符编码,如'GBK'和'UTF-8'。如果文件成功打开,fopen函数将返回一个正整数作为文件标识符(fid);否则返回-1,此时意味着文件打开失败。

接下来,我们将介绍如何使用fprintf函数将格式化的文本写入到通过fopen函数打开或新建的文件中。fprintf函数能够按照指定的格式将数据写入文件,同时提供了丰富的格式化选项,比如设置数字的显示精度、占用的字符宽度等。它的使用方法和我们在本章6.1.1节中介绍的sprintf函数非常相似:

nbytes = fprintf(fid, formatSpec, A1, ..., An)

其中,参数fid是通过fopen函数获得的文件标识符,fprintf函数会按照fopen函数指定的编码方案将数据写入文件;参数formatSpec定义了数据应该如何格式化,可以包含格式化操作符、普通文本和特殊字符,以精确控制数据的输出格式;参数A1, ... , An表示要写入文件的数据。返回值nbytes是一个标量,表示fprintf函数所写入的字节数。

接下来,我们通过一个实际的例子来展示这一过程。假设我们想将上一章5.2.3节中生成的乘法口诀表保存到一个名为“乘法口诀表”的txt文件中。以下是实现这一目标的核心代码:

运行代码后,如果屏幕上显示“保存成功!”,则表示乘法口诀表已成功保存到当前文件夹下的“乘法口诀表.txt”文件中。值得注意的是,由于我们在使用fopen函数时未明确指定文件的编码格式,那么该文件的编码将采用当前MATLAB对话的默认设置。

最后,大家不要忘了需要使用fclose函数来关闭fid表示的文件,这点很容易漏掉。当然你也可以使用fclose all直接关闭所有打开的文件。

再来看一个文本导出的例题,假设某个班上有四名同学,下表左侧给出了他们在三次测试中的成绩,请为每位同学生成一个对应的成绩单,并将各位同学的成绩单保存到单独的txt文件中,文件的命名规则为“xx成绩单”,这里的xx表示学生的姓名。以小王同学的成绩单为例,txt文件名为“小王成绩单”,文件内的文字格式见下表右侧:

% 定义学生姓名、测试名称和学生成绩矩阵
name = ["小王", "小张", "清风", "小李"];  
exam = ["第一次测试", "第二次测试", "第三次测试"]; 
score = [56 78 91;
         36 64 79;
         96 81 98;
         45 66 59];
totalScore = sum(score, 2);  % 每一行的三科成绩求和获取总分
[~, ind] = sort(totalScore, 'descend');  % 对总分进行降序排序并获取索引
[~, ind] = sort(ind);  % 获取排名
% 上面这段获取成绩排名的代码可参考第三章介绍sort函数时的例题
% 接下来为每位同学生成成绩单并保存为txt文件
for ii = 1:length(name)
    % 使用fopen函数以写入模式打开或创建一个文件
    fid = fopen(char(name(ii) + "成绩单.txt"), 'w');
    if fid == -1  % 检查文件是否成功打开
        disp(name(ii)+"同学的文件打开失败");
        continue  % 如果文件未成功打开,跳过当前循环迭代
    end
    % 写入学生姓名
    fprintf(fid, '姓名:%s\n', name(ii));  % 记得加一个换行符的转义字符
    % 使用for循环,写入三次测试的成绩
    for jj = 1:length(exam)
        fprintf(fid, '%s的成绩:%d\n', exam(jj), score(ii, jj));
    end
    % 写入总分和班级排名的数据
    fprintf(fid, '总分:%d\n', totalScore(ii));
    fprintf(fid, '班级排名:%d/%d', ind(ii), length(name));
fclose(fid);  % 最后不要忘了关闭文件
end

在这个例题中,我们巧妙地运用了MATLAB中的fopen和fprintf函数来执行更复杂的文件写入操作。与之前的例题只需单次写入操作不同,这里我们多次调用fprintf函数,逐步构建文件内容,精确控制了文件中各部分文本的结构和格式。当然,你也可以使用下面这种方式:在循环体内,先将各同学的txt文本内的内容保存到字符串标量中,然后通过单次fprintf函数调用将整个字符串一次性写入文件中。这种操作方式的代码可观看配套的视频讲解。


拓展:fprintf的另一种用法

MATLAB中,fprintf函数不仅可以用于导出文件,还能用于直接在屏幕窗口上显示格式化的文本。当我们调用fprintf函数但不指定文件标识符fid或将fid设置为1时,fprintf函数默认将文本输出到MATLAB的屏幕窗口。

我们举个例子,大家可以在命令行窗口运行下面这行代码:

得到的结果如下所示:

我们发现:输出的结果紧跟在命令行的提示符“>>”后,并没有开始新的一行。这是因为fprintf默认不会在文本末尾添加换行符。

为了让文本后的光标自动跳转到下一行,我们可以在参数formatSpec的末尾加上表示换行符的转义字符\n,这样输出结果之后光标才会换行。

当然,在实时脚本中运行这些代码时,加不加\n对结果的显示没有影响。

此外,我们前面介绍过:fprintf函数可以有一个返回值nbytes用于表示所写入的字节数。如果用于向屏幕显示文本时,nbytes表示屏幕上显示字符的个数。

(思考:为什么上面的nbytes是11而不是10?答案:换行符也算一个字符)

另外,你也可以使用sprintf函数和disp函数来实现相同的目的。首先使用sprintf函数返回一个表示格式化后文本的变量,接着使用disp函数在屏幕上显示该变量,显示的结果和sprintf函数完全相同,且由于disp函数显示结果时会自动换行,因此不需要我们手动添加\n。


  点击下方的优快云专栏阅读下一篇文章:

MATLAB入门课程专栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值