【问题标题】:MATLAB : read data file in real timeMATLAB:实时读取数据文件
【发布时间】:2019-06-24 21:07:48
【问题描述】:

我有一个应用程序 A,它写入文件。 我想用 MATLAB 从这个文件中实时读取 N 行。

我的问题与此堆栈帖子有关:How to plot real time data from text file in MATLAB

其中一个答案的作者提到了以下方法:

您不能使用硬实时条件进行绘图,因此 matlab 总是会错过 10 毫秒的时隙。您必须使用选项 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 行?

【问题讨论】:

    标签: matlab


    【解决方案1】:
    fileID 到达文件结束 标记时,

    fgetl 返回-1,参见Matlab fgetl documentation。这意味着如果fgetl 的第一个结果是-1,则文件为空

    如果getNumLinesOfFile 返回20,我不确定您为什么会收到-1,如果您正在阅读相同的文件,请仔细检查代码。也许文件已经改变了?

    我在这里编写了 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 行的结束行和第一行 @ 987654336@ 将返回第 10 行的结束行,但由于 fgetl 删除了结束行,因此它返回一个空数组。

    旁注:

    函数waitForFileToHaveData 使用低效的递归。您可以轻松地使用 while 循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 2014-03-14
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多