在Matlab中,在创建一定数量的行并将它们打印到文件后,我需要删除一行并将其余数据重写到同一个文件中。当我这样做时,新数据会覆盖以前的数据,但由于数据比原始数据短,因此仍然存在原始数据的残余。有没有人知道删除额外数据的最佳/最有效方法是什么?
以下是我正在尝试做的简化示例:
fid = fopen('file.txt','w');
for i=1:10
fprintf(fid,'%i\r\t',i);
end
frewind(fid);
for i=3:5
fprintf(fid,'%i\r\t',i);
end
fprintf(fid,'EOF');
fclose(fid);
我看了一遍,但我似乎无法找到解决问题的方法。有什么建议吗?
答案 0 :(得分:3)
不使用任何临时文件,您可以执行以下操作:
fid = fopen('file.txt', 'wt');
for i=1:10
fprintf(fid, '%i\n', i);
end
frewind(fid);
for i=3:5
fprintf(fid, '%i\n', i);
end
pos = ftell(fid); % get current position in file
fclose(fid);
% read from begining to pos
fid = fopen('file.txt', 'r');
data = fread(fid, pos);
fclose(fid);
% overwite file with data read
fid = fopen('file.txt', 'w');
fwrite(fid, data);
fclose(fid);
答案 1 :(得分:0)
打印“EOF”不起作用 - 好好试试!
有Unix系统调用 truncate 和 ftruncate ,它们会在第一个参数中提供文件描述符(truncate)或handle(ftruncate)并且需要在第二个长度。
我试着看看Matlab是否支持ftruncate。失败了......如果最坏的情况发生,你可以将文件复制写入新文件,当你点击你认为数据结束的时候停止并关闭新文件。
答案 2 :(得分:0)
要跟进Carl Smotricz's建议使用两个文件,您可以使用MATLAB的DELETE和MOVEFILE命令来避免系统调用:
fid = fopen('file.txt','wt');
for i=1:10
fprintf(fid,'\t%i\r',i);
end
fclose(fid);
fid = fopen('file.txt','rt');
fidNew = fopen('fileNew.txt', 'wt');
for i = 1:2
s = fgetl(fid);
fprintf(fidNew, '%s\r', s);
end
for i=4:10
fprintf(fidNew, '\t%i\r', i);
end
fclose(fid);
fclose(fidNew);
delete('file.txt');
movefile('fileNew.txt', 'file.txt')