我有一个写入文件的应用程序A。 我想使用MATLAB从该文件实时读取N行。
我的问题与此堆栈帖子有关:How to plot real time data from text file in MATLAB
答案之一的作者提到了以下方法:
您不能使用严格的实时条件进行绘图,因此Matlab总是会错过10ms的时隙。您必须使用选项2来获取所有数据。
开始:编写一个仅读取自上次调用以来写入的新数据的函数。为此,请不要关闭文件句柄。它存储位置。
因此,这是我的代码:
myfile_fid=fopen(filePath, 'rt')
waitForFileToHaveData(filePath, 10);
for readingIdx = 1:10
fgetl(myfile_fid)
end
我的waitForFileToHaveData
函数的定义如下:
function waitForFileToHaveData(filePath, desired_length)
if (getNumLinesOfFile(filePath) < desired_length)
disp('###### not enough data in the file');
pause(0.02);
waitForFileToHaveData(filePath, desired_length);
end
end
function num = getNumLinesOfFile(file_to_read)
[status, result] = system( ['wc -l ', file_to_read] );
if(status~=1)
scanCell = textscan(result,'%u %s');
num = scanCell{1} - 2;
else
num = 0;
end
end
结果:
当我进入for循环时,myfile_fid
的值为3
,而fgetl(myfile_fid)
的值为-1
。如果我打印出getNumLinesOfFile(filePath)
的结果,则会看到20
。奇怪的是,如果我等待,说文件有40
行,并执行上面的代码,我不会得到错误。我试图查看文档以了解为什么fgetl
返回-1
的原因,但是我似乎在2018b MATLAB文档中找不到它。提到myfile_fid
可以返回-1
,但这仅在无法打开文件的情况下。但是,在运行时,myfile_id
的值为3。
使用MATLAB,自上次读取另一个应用程序正在写入的文件以来,是否可以读取N条线?
答案 0 :(得分:2)
fgetl
到达文件结束标记时, -1
返回fileID
,请参见Matlab fgetl documentation。这意味着,如果fgetl
的第一个结果为-1
,则文件为空。
我不确定如果-1
返回getNumLinesOfFile
时为什么会得到20
,如果您正在读取同一文件,请仔细检查代码。也许文件已更改?
我在这里编写了MATLAB代码,该代码检查是否添加了10条新行,然后使用fgetl
获取它们:
myfile_fid = fopen(filePath, 'rt');
newLines = 10;
linesRead = 0;
while(waitForFileToHaveData(filePath, linesRead + newLines))
linesRead = linesRead + newLines;
for readingIdx = 1:newLines
line = fgetl(myfile_fid)
end
end
fclose(myfile_fid);
我更新了waitForFileToHaveData
函数以返回1
:
function ready = waitForFileToHaveData(filePath, desired_length)
while (getNumLinesOfFile(filePath) < desired_length)
disp('###### not enough data in the file');
pause(0.02);
end
ready = 1;
end
注意:
如果文件恰好有10行,而在第10行没有结束行标记,并且您阅读了它们,则又添加了10行,fileID
现在指向第10行的结束行,并且第一行指向第fgetl
行将返回第10行的结束行,但是由于fgetl
删除了结束行,因此它将返回一个空数组。
旁注:
函数waitForFileToHaveData
使用的递归效率低下。您可以轻松地使用while循环。