2

我想知道是否有人知道如何在 MATLAB 中打开和读取文件,从文件末尾开始读取。该文件不断更新(在读取之间以一些不恒定的速率),我想每次都读取文件的最后六行。

我还将包括一个测试,以验证我不会重复阅读相同的行两次。每一行的格式如下(每个变量都是一个浮点数):

timestamp accx accy accz gyrox gyroy gyroz magx magy magz

我试图使用 fseek 将位置更改为文件的最后一行,但这仅允许我读取我认为的文件的最后一行,而不是向后读取文件,除非我指定一定数量的字节,这我不知道确切的字节数。

4

3 回答 3

2

如果您在基于 unix 的系统(Linux/Mac)上,您可以直接使用系统命令来做您想做的事情。这是一个示例测试文件:

12345 accx accy accz gyrox gyroy gyroz magx magy magz
23456 accx accy accz gyrox gyroy gyroz magx magy magz
34567 accx accy accz gyrox gyroy gyroz magx magy magz
45678 accx accy accz gyrox gyroy gyroz magx magy magz
56789 accx accy accz gyrox gyroy gyroz magx magy magz
67890 accx accy accz gyrox gyroy gyroz magx magy magz

您可以在 unix 上使用该命令读取它tail,并直接使用该system命令将其读取到 MATLAB 中。

[~, str]=system('tail -n 2 filename')
str =

    56789 accx accy accz gyrox gyroy gyroz magx magy magz
    67890 accx accy accz gyrox gyroy gyroz magx magy magz

2in替换为-n 2您想要阅读的行数。

接下来,为了确保您阅读的是同一行,您可能需要存储时间戳(第一列)。最简单的方法是再次让 unix 为你做这件事

[~, timestamp]=system('tail -n 2 filename | awk ''{print $1}''')

timestamp =

56789
67890

str2num每次阅读时使用并存储这些数字将其转换为数字,然后使用该函数ismember检查新时间戳是否已经是您先前读取的时间戳的一部分。

于 2011-07-01T05:02:52.630 回答
0

知道您正在从文件中读取哪一行的唯一方法是从头开始计算换行符。没有办法从文件末尾开始,直接向后查找一定行数。

您可以编写一个从文件末尾向后读取的函数,直到它看到 N 个换行符,然后输出这个块。这正是tail工作原理。这是来自 GNU 的评论tail.c

/* Print the last N_LINES lines from the end of file FD.
   Go backward through the file, reading `BUFSIZ' bytes at a time (except
   probably the first), until we hit the start of the file or have
   read NUMBER newlines.
   START_POS is the starting position of the read pointer for the file
   associated with FD (may be nonzero).
   END_POS is the file offset of EOF (one larger than offset of last byte).
   Return true if successful.  */

如果文件不是太大,最简单的做法是编写一个一次读取一行的函数,只保留最后 N 行。

于 2011-07-01T04:30:53.913 回答
0

您可以搜索文件的结尾块(使用fseek()在 6 行之前设置 EOF 的位置,然后搜索最后 6 或 7 个换行符并使用find(). 然后您可以提取数据,因为您知道最后 6 行在您阅读的原始块中。

fid=fopen(filename,'r');
fseek(fid,500,'eof');
dat=fread(fid,Inf,'*char');
linestart=find(dat=="\n",7,'last'); % choose 7 newlines because there will be one at the end?
于 2011-07-01T12:15:23.377 回答