У меня есть этот фрагмент кода, чтобы загрузить некоторые файлы в память, в данные.
По тому же пути есть три файла, которые я хотел бы прочитать: файл шрифта XML, PNG и файл шрифта ТТФ. Все три успешно открыты, и их размер показан в размер. К сожалению, только XML и PNG считываются в данные.
Файл ТТФ получает правильный размер, такой же правильный результат, как и фред, но пустой (не нулевой) данные и пустой fp->_base.
char* data;
size_t size = 0;
FILE *fp = fopen(completeFilePath, "rb");
if (fp != NULL) {
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);
data = new char[size];
size_t result = fread(data, sizeof(char), size, fp);
fclose(fp);
}
Не могли бы вы пролить свет на эту проблему?
Очень ценится.
Вы смотрели содержимое data
? Как вы смотрите содержимое data
? Что он должен содержать? А FILE
— это непрозрачная структура, на её члены (если они известны) смотреть не стоит.
Я просматриваю содержимое data
во время отладки. Я могу прочитать в его содержимом полный файл XML, увидеть двоичные данные для файла PNG и увидеть только байт \0
с ТФФ.
Это подтверждает ошибку, которую я подозревал в своем первом комментарии. Ответ опубликован с подробным объяснением.
Я рекомендую использовать uint8_t
для байты, а не char
. Тип char
подразумевает, что переменная содержит персонажи. Байты могут содержать значения, не являющиеся символами (особенно непечатаемые символы).
Нулевой байт волшебным образом не означает конец всего, в чем он находится. Это просто соглашение, используемое многими функциями стандартной библиотеки C. Для файла вполне допустимо содержать нулевой байт, а затем иметь больше символов. Это именно то, что находится в вашем data
: нулевой байт, а затем еще символы. Так что на самом деле он не пуст; вы просто неправильно предполагаете, что это так.
Большинство отладчиков имеют представление «необработанной памяти», часто отображаемое в виде дампа hex-ascii. Попробуй это.
Как вы смотрите на то, пусто ли
data
? Я предполагаю, что на самом деле он не пустой, а просто содержит нулевой байт, и вы используете функции для его просмотра, которые обрабатывают нуль как ограничитель строки.