代码之家  ›  专栏  ›  技术社区  ›  PeterK

处理二进制文件模板函数问题

  •  1
  • PeterK  · 技术社区  · 16 年前

    我创建了一个用于处理二进制文件的小工具。读取和处理文件所涉及的所有函数都是模板化的,与此类似:

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

    模板参数 T 用于确定将作为一个项目读取和处理的数据的大小。我不知道如何准确地说出来,所以举一个小例子(注意,这些是用hexeditor看到的二进制数据)。文件内容:

    BEEF1234DEAD5678
    

    与 作为无符号字符,项包括: BE EF 12 34 DE AD 56 78
    与 由于是无符号int,项为: BEAF1234 DEAD5678
    T型 BEAF1234DEAD5678

    (注意,我在这里假设 unsigned char unsigned int 是4字节 double 是8字节大。)的 也用于STL容器,因为我经常使用它们(向量、映射和列表用于处理文件所涉及的许多函数)。对于内置的数据类型(char、int等),一切都可以很好地工作。

    现在我的问题是:我想能够与1,4,8不同的大小工作。例如16、32甚至6、10、14等等,据我所知,没有这种尺寸的内置类型。我怎样才能做到这一点?我主要关心的是我需要STL容器中的数据,例如使用sort()。吊舱结构能用吗?注意,我主要使用C函数进行读取(这里没有流,但是有一些memcpy和memcmp、fread等)。

    抱歉,没有提供更多的代码,我正在使用我的备用笔记本电脑。但我相信不需要更多的代码。如果是的话,我明天提供。

    2 回复  |  直到 16 年前
        1
  •  2
  •   ssegvic    16 年前

    如果我正确理解你的问题,答案是肯定的:你应该能够用一个合适的POD类型专门化你的模板函数。但是,您需要定义一个成员 operator<() 为了能够使用 std::sort() .

    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;
      }
    };
    
        2
  •  0
  •   Puppy    16 年前

    使用运算符<&书信电报;提取数据。这样,T的大小以及它是否可以被排序就不是你的问题了。因此,获得C++流,我们有一个理由为STD::IFSIFT丢弃FSCANF。

    对于McCPY或MEMCP来说,很多、很多C++类型实际上是不安全的,使用它们是一个你绝对应该削减的习惯。