做数据处理的朋友,肯定被 MATLAB 文本文件读写 折磨过。前两天读一个 2GB 的日志文件,用 load直接内存溢出,用 importdata慢得像蜗牛。其实 MATLAB 玩文件,底层全是 C 语言那一套。2026年了,别再用那些慢吞吞的高级函数了,学会 fopen、fgetl和 fprintf,你才能驾驭 TB 级的数据。今天聊聊怎么像黑客一样操作文件。
读大文件,绝对不要用 importdata或 load 一次性读入。它们会把整个文件塞进内存,16GB 内存也扛不住 20GB 的文件。
正确的姿势是用 fgetl逐行读取。
fid = fopen('read.txt', 'r');
data = []; % 预分配内存,虽然这里还是空的,但好习惯
while 1
tline = fgetl(fid);
if ~ischar(tline), break; end % 读到文件尾,tline会变成-1
num_data = str2num(tline); % 字符串转数字
data = [data; num_data]; % 纵向拼接
end
fclose(fid);
致命坑点:上面的代码在循环中动态增长 data数组。MATLAB 每次都要重新申请内存、拷贝数据,文件有 100 万行,速度能慢 100 倍!
优化方案:先算好有多少行,用 zeros(N, 6)预分配,或者用 cell数组暂存。对于你给的那个 read.txt,每行 6 个数,预分配是必须的。写文件用 fprintf,但很多人栽在换行符上。Windows 下是 \r\n,Linux/Mac 下是 \n。

fid = fopen('write.txt', 'a+'); % 'a+' 追加模式,不会覆盖原文件
fprintf(fid, 'Hello, world\r\n'); % 写入字符串并换行
% 写入矩阵
a = rand(1, 10);
fprintf(fid, '%g\r\n', a); % %g 自动选择最紧凑的格式
fclose(fid);
注意:fprintf写入矩阵时,是按列遍历的。如果你想按行写,得先转置。M = rand(3, 4);
fprintf(fid, '%f %f %f %f\r\n', M'); % 转置后按行写
那个 'W'和 'A'修饰符很少人用,它们是无缓冲写入。做实时日志记录时,用 'W',数据直接落盘,不怕程序崩溃丢数据。假设你有个传感器日志 sensor.log,格式是 时间戳, 温度, 湿度:
2026-01-20 10:00:01, 25.3, 60.1
2026-01-20 10:00:02, 25.4, 60.0
用下面的代码解析:fid = fopen('sensor.log', 'r');
results = [];
while 1
line = fgetl(fid);
if ~ischar(line), break; end
% 分割字符串
parts = strsplit(line, ',');
timestamp = parts{1};
temp = str2double(parts{2});
humidity = str2double(parts{3});
results = [results; temp, humidity];
end
fclose(fid);
性能提示:如果你的文件有 100 万行,用 textscan比 fgetl更快。textscan是底层 C 实现,专为批量解析设计。
MATLAB 文件 I/O 的核心是流式处理。2026年,随着 NVMe 硬盘普及,文件读写不再是瓶颈,但错误的读写方式依然能拖慢你的仿真。别让这些低级错误,耽误了你发 Paper 的后腿。武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks 等。