2

ファイルの最後から読み取りを開始するMATLABでファイルを開いて読み取る方法を誰かが知っているかどうか疑問に思っていました。ファイルは常に更新されており (読み取り間の速度は一定ではありません)、毎回ファイルの最後の 6 行を読み取りたいと考えています。

また、同じ行を 2 回読み直さないことを確認するテストも含めます。各行は次のようにフォーマットされます (各変数は浮動小数点数です)。

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

tailコマンドを使用して、unix で直接 MATLAB に読み込むことができますsystem

[~, 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

ファイルの最後のチャンクを検索できます (を使用fseek()して、EOF の位置を 6 行よりかなり前に設定し、最後の 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 に答える
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.  */

ファイルがそれほど大きくない場合、最も簡単な方法は、一度に 1 行ずつ読み取り、最後の N 行だけを保持する関数を作成することです。

于 2011-07-01T04:30:53.913 に答える