1

バイナリファイルの処理に使用する小さなツールを作成しました。ファイルの読み取りと処理に関連するすべての関数はテンプレート化されており、次のようになっています。

template <class T> void processFile( const char* fileName );

テンプレートパラメータTは、読み取られて1つのアイテムとして扱われるデータのサイズを決定するために使用されます。正確に言う方法がわからないので、小さな例です(これらは、16進エディターで見られるバイナリデータであることに注意してください)。ファイルの内容:

BEEF1234DEAD5678

Tunsigned charの場合、アイテムは次のとおりです。unsigned intの場合、アイテムは次のとおりです。double のBE EF 12 34 DE AD 56 78
場合:TBEAF1234 DEAD5678
TBEAF1234DEAD5678

(ここでunsigned charは、1バイト、unsigned int4バイト、double8バイトの大きさであると想定していることに注意してください。)TSTLコンテナーも頻繁に使用するため、STLコンテナーにも使用されます(ベクトル、マップ、およびリストは、ファイルの処理に関連する関数)。組み込みのデータ型(char、intなど)ですべてが完全に正常に機能します。

さて、私の問題は何ですか。1、4、8とは異なるサイズで作業できるようにしたいと思います。たとえば、16、32、さらには6、10、14などです。私が知る限り、これらのサイズの組み込みタイプはありません。どうすればこれを達成できますか?私の主な関心事は、STLコンテナー内のデータが必要であり、たとえばsort()を使用することです。POD構造は機能しますか?読み取りには主にC関数を使用していることに注意してください(ここにはストリームはありませんが、memcpyとmemcmp、freadなどがあります)。

これ以上コードを提供しないことをお詫びします。現在、予備のラップトップを使用しています。しかし、私はそれ以上のコードは必要ないはずだと信じています。もしそうなら、私は明日それを提供します。

4

2 に答える 2

2

私があなたの質問を正しく理解していれば、答えはイエスです。適切なPODタイプでテンプレート関数を特殊化できるはずです。operator<()ただし、を使用できるようにするには、メンバーを定義する必要がありますstd::sort()

次のPODは、一般的なケースで役立つ場合があります(doubleよりも確実にソートされます)。

template <int N>
struct MyFill{
  char contents[N];
  bool operator<(const MyFill<N>& other){
    for (int i=0; i<N; ++i){
      if (contents[i]!=other.contents[i]){
        return (contents[i]<other.contents[i]);
      }
    }
    return false;
  }
};
于 2010-07-25T19:21:03.130 に答える
0

演算子<<を使用してデータを抽出します。このように、Tのサイズと、それをソートできるかどうかは問題ではありません。したがって、C ++ストリームを取得します。これには、std::ifstreamのfscanfを廃止した理由があります。

memcpyやmemcmpの多くの、多くのC ++タイプを使用することは実際には安全ではなく、それらを使用することは間違いなくカットする必要のある習慣です。

于 2010-07-25T19:25:02.233 に答える