我有一个八度的脚本,我希望脚本遍历文本文件并打印文件的每一行。我希望脚本在无限循环中运行,每次文件都有一个新行来打印它。我尝试使用此代码执行此操作:
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下运行。
* - 最终脚本将对线进行评估,而不仅仅是打印它们。印刷品只是一种测试机制的方法。
答案 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
将使您的函数从头开始读取文件。