• ベストアンサー

バイナリデータを頭から読むのではなく、最後部の一部を読み出すプログラム

バイナリデータを頭から読むのではなく、最後部の一部を読み出すプログラムって、存在するのでしょうか? いつもお世話になっております。時系列データを記録している最中に保存されているバイナリファイルから、最新のデータ(1秒前後)を取得したいと思っております。いろいろ見てみましたが、今のところ見当がつきません。ご存知の方、どうかご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

http://www9.plala.or.jp/sgwr-t/lib/fseek.html fseekを使ってファイルサイズを調べ、 読み出したい位置に同じくfseekで移動。 そこからfreadで読み出せばいいです。

wsow
質問者

お礼

ありがとうございます。今回は本当に専門の方に聞いて良かったなと思いました。

その他の回答 (3)

回答No.4

No2. です。 やはり、直接の回答ではありませんが……。 よく見ると、最終データだけではなく、複数ありそうですね。 しかも、単に、「知る」だけなら、ファイルに保存する必然性もないかもしれません。 こんなのはいかがでしょうか? ひたすらデータを流し込むと、最後の 10個だけ覚えておくクラスです。 #include <iostream> class list10 { private: double data[10]; public: list10(); list10& operator<<(double); double operator[](int); }; list10::list10() { for (int i = 0; i < 10; data[i++] = 0); } list10 &list10::operator <<(double v) { for (int i = 0; i < 9; i++) { data[i] = data[i + 1]; } data[9] = v; return *this; } double list10::operator[](int i) { if ((i >= 0) && (i <= 9)) { return data[i]; } else return -1; } int main() { list10 lastDataList; lastDataList << 1 << 2 << 3; lastDataList << 4 << 5 << 6; lastDataList << 7 << 8 << 9; lastDataList << 10 << 11 << 12; lastDataList << 13 << 14 << 15; lastDataList << 16 << 17 << 18; lastDataList << 19 << 20 << 21; for (int i = 0; i < 10; i++) { std::cout << "index = " << i << " value = " << lastDataList[i] << "\n"; } return 0; }

回答No.3

#1氏と同じ内容だけど、 1レコードの書き込みサイズが固定なら、 fseek( *FILE, -[1レコードサイズ], SEEK_END ); で終端から1レコードサイズ分手前に移動してから読み込む。

wsow
質問者

お礼

ありがとうございます。早速やってみます。

回答No.2

単に、「時系列データを記録している最中に保存されているバイナリファイルから、最新のデータを読みたい」を実現するためと考えれば、別の方法もあります。 ・データが取得できた ・そのデータを、ログファイルに追記 ・同時に、そのデータを、「最終データ」という名前のファイルに「上書き」 これで、「最終データ」の方を読めば、いつでもその時点の最終データを確認できます。

wsow
質問者

お礼

ありがとうございます。あまりCを理解していないので、これから勉強してご助言活かせるようにします。