文件操作 #
一、文件读写基础 #
1.1 打开和关闭文件 #
matlab
% 打开文件
fid = fopen('data.txt', 'r'); % 只读
fid = fopen('data.txt', 'w'); % 写入(覆盖)
fid = fopen('data.txt', 'a'); % 追加
fid = fopen('data.txt', 'r+'); % 读写
% 检查是否成功
if fid == -1
error('无法打开文件');
end
% 关闭文件
fclose(fid);
% 关闭所有文件
fclose('all');
1.2 读取文本文件 #
matlab
% 方法1:fgetl逐行读取
fid = fopen('data.txt', 'r');
while ~feof(fid)
line = fgetl(fid);
disp(line);
end
fclose(fid);
% 方法2:fileread读取全部
content = fileread('data.txt');
% 方法3:readlines逐行读取
lines = readlines('data.txt');
1.3 写入文本文件 #
matlab
fid = fopen('output.txt', 'w');
fprintf(fid, 'Hello World\n');
fprintf(fid, '数值: %.2f\n', 3.14159);
fprintf(fid, '数组: %d %d %d\n', 1, 2, 3);
fclose(fid);
1.4 格式化读写 #
matlab
% 写入格式化数据
x = 1:10;
y = sin(x);
fid = fopen('data.txt', 'w');
for i = 1:length(x)
fprintf(fid, '%d %.6f\n', x(i), y(i));
end
fclose(fid);
% 读取格式化数据
fid = fopen('data.txt', 'r');
data = textscan(fid, '%d %f');
fclose(fid);
x = data{1};
y = data{2};
二、二进制文件 #
2.1 读取二进制 #
matlab
fid = fopen('data.bin', 'rb');
% 读取整数
data = fread(fid, [100, 1], 'int32');
% 读取浮点数
data = fread(fid, [100, 1], 'double');
% 读取到文件末尾
data = fread(fid, inf, 'double');
% 读取指定字节
data = fread(fid, 100, 'uint8=>char');
fclose(fid);
2.2 写入二进制 #
matlab
data = rand(100, 1);
fid = fopen('output.bin', 'wb');
fwrite(fid, data, 'double');
fclose(fid);
2.3 文件定位 #
matlab
fid = fopen('data.bin', 'rb');
% 获取当前位置
pos = ftell(fid);
% 移动到指定位置
fseek(fid, 100, 'bof'); % 从文件开头
fseek(fid, 10, 'cof'); % 从当前位置
fseek(fid, -10, 'eof'); % 从文件末尾
% 重置到开头
frewind(fid);
% 获取文件大小
fseek(fid, 0, 'eof');
file_size = ftell(fid);
frewind(fid);
fclose(fid);
三、目录操作 #
3.1 获取目录内容 #
matlab
% 当前目录
current_dir = pwd;
% 切换目录
cd('new_directory');
% 列出目录内容
files = dir();
files = dir('*.m'); % 只列出.m文件
files = dir('data/'); % 指定目录
% 获取文件信息
for i = 1:length(files)
if ~files(i).isdir
fprintf('%s (%d bytes)\n', files(i).name, files(i).bytes);
end
end
3.2 创建和删除目录 #
matlab
% 创建目录
mkdir('new_folder');
mkdir('parent', 'child'); % 创建嵌套目录
% 检查目录是否存在
if ~exist('new_folder', 'dir')
mkdir('new_folder');
end
% 删除空目录
rmdir('empty_folder');
% 删除非空目录
rmdir('folder', 's');
3.3 路径操作 #
matlab
% 拼接路径
full_path = fullfile('folder', 'subfolder', 'file.txt');
% 分割路径
[path, name, ext] = fileparts('/path/to/file.txt');
% path = '/path/to'
% name = 'file'
% ext = '.txt'
% 获取文件名
[~, name, ~] = fileparts('/path/to/file.txt');
% 获取扩展名
[~, ~, ext] = fileparts('/path/to/file.txt');
四、文件管理 #
4.1 复制、移动、删除 #
matlab
% 复制文件
copyfile('source.txt', 'destination.txt');
copyfile('source.txt', 'folder/');
% 移动文件
movefile('source.txt', 'destination.txt');
movefile('source.txt', 'folder/');
% 重命名
movefile('old_name.txt', 'new_name.txt');
% 删除文件
delete('file.txt');
% 删除多个文件
delete('*.tmp');
4.2 检查文件 #
matlab
% 检查文件是否存在
if exist('file.txt', 'file')
disp('文件存在');
end
% 检查目录是否存在
if exist('folder', 'dir')
disp('目录存在');
end
% 获取文件信息
info = dir('file.txt');
fprintf('大小: %d bytes\n', info.bytes);
fprintf('修改时间: %s\n', datestr(info.datenum));
五、临时文件 #
5.1 临时目录和文件 #
matlab
% 获取临时目录
temp_dir = tempdir;
% 创建临时文件
temp_file = tempname;
fid = fopen([temp_file '.txt'], 'w');
fprintf(fid, '临时数据');
fclose(fid);
% 使用后删除
delete([temp_file '.txt']);
六、实用示例 #
6.1 批量处理文件 #
matlab
function process_all_files(folder, pattern)
% PROCESS_ALL_FILES 批量处理文件
files = dir(fullfile(folder, pattern));
for i = 1:length(files)
filename = fullfile(folder, files(i).name);
% 读取文件
data = readmatrix(filename);
% 处理数据
result = process(data);
% 保存结果
output_name = strrep(files(i).name, '.', '_result.');
writematrix(result, fullfile(folder, 'results', output_name));
fprintf('处理完成: %s\n', files(i).name);
end
end
6.2 日志文件 #
matlab
function log_message(filename, message)
% LOG_MESSAGE 写入日志
fid = fopen(filename, 'a');
timestamp = datestr(now, 'yyyy-mm-dd HH:MM:SS');
fprintf(fid, '[%s] %s\n', timestamp, message);
fclose(fid);
end
% 使用
log_message('app.log', '程序启动');
log_message('app.log', '处理完成');
七、总结 #
本章学习了:
- 文件读写:fopen、fclose、fprintf、fscanf
- 二进制文件:fread、fwrite、fseek
- 目录操作:pwd、cd、dir、mkdir、rmdir
- 文件管理:copyfile、movefile、delete
- 路径操作:fullfile、fileparts
- 临时文件:tempdir、tempname
下一章将学习面向对象编程。
最后更新:2026-03-27