2009-11-06 76 views
2

在Matlab中,在创建一定数量的行并将其打印到文件后,我需要删除一行并将其余数据重写到同一文件。当我这样做时,新数据将覆盖先前的数据,但由于数据比原始数据短,因此仍然存在原始数据的残余。有谁知道删除额外数据的最佳/最有效的方法是什么?在Matlab中写入文件时从EOF中删除字符

这里是什么,我试图做一个简单的例子:

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

你在使用什么平台(Windows,Mac,Unix)?最好的选择可能是从MATLAB内部调用一些系统命令。 – gnovice 2009-11-07 01:11:56

+0

我使用Windows和Linux,所以我不想使用系统特定的命令。 – ServAce85 2009-11-07 20:37:57

回答

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

打印“EOF”不起作用 - 不错的尝试!

有UNIX系统调用截断ftruncate,将做到的是,给定的任一一个文件描述符(截断)或处理(ftruncate)中的第一个参数,并在第二期望的长度。

我想试试看Matlab是否支持ftruncate。否则......如果最坏的情况发生,你可以将文件复制写入一个新文件,当你点击你认为数据结束时停止和关闭新文件。

+0

是的,我打印“EOF”作为我自己的参考,当我下次打开文件时读取数据。谢谢。答案是否定的,Matlab(至少在Windows中)似乎不支持ftruncate。 – ServAce85 2009-11-07 20:41:29

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

在这一点上,我宁愿不使用多个文件。感谢您的信息,如果我决定走这条路。 – ServAce85 2009-11-07 20:43:21