MATLAB:实时读取数据文件

时间:2019-06-23 23:29:33

标签: matlab

我有一个写入文件的应用程序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条线?

1 个答案:

答案 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循环。