Обработка двоичного файла - шаблонная проблема функций

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

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

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

BEEF1234DEAD5678

С T будучи неподписанным символом, объекты: BE EF 12 34 DE AD 56 78
С T будучи неподписанным интервалом, объекты: BEAF1234 DEAD5678
С T быть двойным: BEAF1234DEAD5678

(Обратите внимание, что я принимаю здесь это unsigned char 1 байт, unsigned int 4 байта и double 8 байтов шириной.) T также используется для контейнеров STL, потому что я использую их много (вектор, карта и список используются во многих функциях, вовлеченных в обработку файлов). Все работает превосходное со встроенными типами данных (символ, интервал и т.д.).

Теперь что является моей проблемой: Я хотел бы смочь работать с размерами, отличающимися от 1,4,8. Например, 16, 32 или даже 6, 10, 14 и т.д. Насколько я знаю, нет никаких встроенных типов этих размеров. Как я могу достигнуть этого? Мое основное беспокойство - то, что я нуждаюсь в данных в контейнерах STL и использую вид (), например. Структура POD будет работать? Обратите внимание, что я использую главным образом C функции для чтения (никакие потоки здесь, но некоторый memcpy и memcmp, освобожденный и т.д.).

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

1
задан meagar 1 November 2010 в 16:36
поделиться

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;
  }
};
2
ответ дан 2 September 2019 в 22:47
поделиться

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

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

0
ответ дан 2 September 2019 в 22:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: