从文本文件中逐行读取不知道Octave中文件更新的时间

时间:2014-10-19 11:08:45

标签: matlab octave

我有一个八度的脚本,我希望脚本遍历文本文件并打印文件的每一行。我希望脚本在无限循环中运行,每次文件都有一个新行来打印它。我尝试使用此代码执行此操作:

arg_list = argv ();
file_name = arg_list{1};
if (!(exist(file_name,"file")))
    error (["file ",file_name," doesn't exist."]);
end;

fid = fopen(file_name,"r");

while (1)
    s=fgetl(fid);
    if (ischar(s))
        disp(s);
    end;
    usleep (1e5);
endwhile;

问题是当脚本到达文件末尾时,即使在文件中添加了新行,它也会在其上堆叠。如果新文件添加到文件之前,则脚本到达结尾,然后它会看到并打印出来。

在达到EOF后,八度音程是否有办法在文件中添加新行?

这在Linux下运行。

* - 最终脚本将对线进行评估,而不仅仅是打印它们。印刷品只是一种测试机制的方法。

1 个答案:

答案 0 :(得分:2)

您可以通过设置定时器和定期调用的回调函数来实现。回调将检查文件是否有新行,并在相关时对它们进行处理。

首先将以下函数保存为matlab路径中的return_new_lines.m。此功能是检查文件中新行的功能。如果文件中没有找到新行,则返回一个空单元格数组;如果找到新行,则返回字符串行的单元格数组。

function newLines = return_new_lines( file2watch )

%// initialise and preallocate
persistent oldFileSize
if isempty(oldFileSize) ; oldFileSize=0 ; end
newLines = {} ;

fid = fopen( file2watch , 'r' ) ;

%// Get size of the file
fseek( fid , 0 , 'eof' ) ; %// place cursor at the end of the file
newFileSize = ftell( fid) ; %// get position of cursor

bytes2read = newFileSize - oldFileSize ; 
if bytes2read
   oldFileSize = newFileSize ;
   %// read the new lines
   fseek( fid , -bytes2read , 'eof' ) ; %// place cursor at the beginning of the new part of the file
   iLine = 1 ;
   while ~feof( fid )
      newLines{iLine,1} = fgetl( fid ) ;
      iLine = iLine+1 ;
   end
end

fclose( fid ) ;

接下来,定时器回调将调用此函数processNewLines.m

function processNewLines(obj,evt, file2watch ) %#ok<INUSL>

newLines = return_new_lines( file2watch ) ;

if ~isempty(newLines)
   disp(newLines)
   %// ...
   %// do your processing on these new lines
   %// ...
end

然后在你的工作区或你的gui中,定义:

file2watch = 'L:\TEMP\MatlabCode\StackExchange\test.txt' ; %// change that to your filename
fileUpdater                = timer ;
fileUpdater.Period         = 5 ; %// set to 5 seconds, adjust that to your needs
fileUpdater.TimerFcn       = { @processNewLines , file2watch } ;
fileUpdater.ExecutionMode  = 'fixedRate' ;

要开始此过程,请执行:

start( fileUpdater )

完成后(没有人在您的文件中添加行),请使用以下命令停止计时器:

stop( fileUpdater )

第一次启动计时器时,它将读取文件的所有行。然后它会定期检查添加的行。如果打开文本文件,添加一个新行并保存文本文件,您应该会在命令窗口中看到它。 (完成测试后删除对disp的调用。


注意:如果要限制return_new_lines文件的数量,可以将函数processNewLines嵌入.m而不是单独的函数。我这样做是因为检查文件中新行的函数可以在其他情况下重用,所以我把它分开了。


修改
我差点忘了。函数persistent oldFileSize中的return_new_lines声明使变量记住在函数的先前执行中读取了多少行。由于该功能只返回新行 如果要 重置 该函数并从文本文件的开头再次读取,则必须clear声明持久变量的函数。这样做:

clear return_new_lines

将使您的函数从头开始读取文件。