1

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

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

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

BEEF1234DEAD5678

对于Tunsigned char,项目是:BE EF 12 34 DE AD 56 78
对于Tunsigned int,项目是:BEAF1234 DEAD5678
对于Tdouble:BEAF1234DEAD5678

(请注意,我假设这里unsigned char是 1 个字节,unsigned int是 4 个字节,并且double是 8 个字节大。)T它也用于 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 可能对您有用(它肯定会比双精度排序更好):

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

使用 operator<< 提取数据。这样 T 的大小以及是否可以排序都不是您的问题。因此,获得 C++ 流,我们放弃 fscanf 使用 std::ifstream 是有原因的。

memcpy 或 memcmp 很多很多 C++ 类型实际上是不安全的,使用它们是你绝对应该改掉的习惯。

于 2010-07-25T19:25:02.233 回答