Обработка двоичного файла - проблема с шаблонными функциями - PullRequest
1 голос
/ 25 июля 2010

Я создал небольшой инструмент, который используется для обработки двоичных файлов. Все функции, связанные с чтением файлов и их обработкой, являются шаблонными и похожи на это:

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

Параметр шаблона T используется для определения размера данных, которые будут считываться и обрабатываться как один элемент. Я не знаю, как сказать это точно, поэтому крошечный пример (обратите внимание, что это двоичные данные, как видно с шестнадцатеричным). Содержание файла:

BEEF1234DEAD5678

С T как неподписанным символом, элементы: BE EF 12 34 DE AD 56 78
С T, являющимся неподписанным int, элементы: BEAF1234 DEAD5678
С T является двойным: 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 и т. Д.).

Извините, что не предоставил больше кода, сейчас я использую свой запасной ноутбук. Но я считаю, что больше кода не должно быть необходимо. Если так, я предоставлю это завтра.

Ответы [ 2 ]

2 голосов
/ 25 июля 2010

Если я правильно понимаю ваш вопрос, ответ - да: у вас должна быть возможность специализировать шаблонную функцию с подходящим типом 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;
  }
};
0 голосов
/ 25 июля 2010

Используйте оператор << для извлечения данных.Таким образом, размер T и возможность его сортировки - не ваша проблема.Так что получайте потоки C ++, есть причина, по которой мы отказались от fscanf для std :: ifstream. </p>

На самом деле, memcpy или memcmp многих, многих типов C ++ небезопасно, и их использование - привычка, которую вам определенно следует сократить.1003 *

...