在Matlab中写入文件时从EOF中删除字符

时间:2009-11-06 22:34:26

标签: matlab file-io character

在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);  

我看了一遍,但我似乎无法找到解决问题的方法。有什么建议吗?

3 个答案:

答案 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的DELETEMOVEFILE命令来避免系统调用:

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')