Могу ли я прочитать динамическую переменную длины, используя fread без указателей? - PullRequest
1 голос
/ 15 июля 2010

Я использую cstdio (stdio.h) для чтения и записи данных из двоичных файлов.Я должен использовать эту библиотеку из-за устаревшего кода, и она должна быть кросс-платформенной, совместимой с Windows и Linux.У меня есть FILE* basefile_, который я использую для чтения в переменных configLabelLength и configLabel, где configLabelLength говорит мне, сколько памяти выделить для configLabel.

unsigned int configLabelLength; // 4 bytes
char* configLabel = 0;          // Variable length

fread((char *) &configLabelLength, 1, sizeof configLabelLength, baseFile_);
configLabel = new char[configLabelLength];
fread(configLabel,1, configLabelLength,baseFile_);

delete [] configLabel; // Free memory allocated for char array
configLabel = 0; // Be sure the deallocated memory isn't used

Есть лиспособ чтения в configLabel без использования указателя?Например, есть ли решение, где я могу использовать векторную библиотеку c ++ или что-то такое, где мне не нужно беспокоиться об управлении памятью указателя.

1 Ответ

5 голосов
/ 15 июля 2010

Просто сделай:

unsigned int configLabelLength; // 4 bytes*
fread((char *) &configLabelLength, 1, sizeof configLabelLength, baseFile_);

std::vector<char> configLabel(configLabelLength);
fread(&configLabel[0], 1, configLabel.size(), baseFile_);

Элементы вектора смежны.


* Я полагаю, вы знаете, что unsigned int не обязательно всегда 4 байта. Если вы обратите внимание на детали реализации, это нормально, но будет немного проще, если вы примете Boost's cstdint.hpp и просто используете uint32_t.

...