Функция «fread ()» не читает определенные типы файлов?

У меня есть этот фрагмент кода, чтобы загрузить некоторые файлы в память, в данные.

По тому же пути есть три файла, которые я хотел бы прочитать: файл шрифта 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? Я предполагаю, что на самом деле он не пустой, а просто содержит нулевой байт, и вы используете функции для его просмотра, которые обрабатывают нуль как ограничитель строки.

Joseph Sible-Reinstate Monica 27.05.2019 16:27

Вы смотрели содержимое data? Как вы смотрите содержимое data? Что он должен содержать? А FILE — это непрозрачная структура, на её члены (если они известны) смотреть не стоит.

Some programmer dude 27.05.2019 16:27

Я просматриваю содержимое data во время отладки. Я могу прочитать в его содержимом полный файл XML, увидеть двоичные данные для файла PNG и увидеть только байт \0 с ТФФ.

ConcernedCoder 27.05.2019 16:45

Это подтверждает ошибку, которую я подозревал в своем первом комментарии. Ответ опубликован с подробным объяснением.

Joseph Sible-Reinstate Monica 27.05.2019 17:03

Я рекомендую использовать uint8_t для байты, а не char. Тип charподразумевает, что переменная содержит персонажи. Байты могут содержать значения, не являющиеся символами (особенно непечатаемые символы).

Thomas Matthews 27.05.2019 18:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нулевой байт волшебным образом не означает конец всего, в чем он находится. Это просто соглашение, используемое многими функциями стандартной библиотеки C. Для файла вполне допустимо содержать нулевой байт, а затем иметь больше символов. Это именно то, что находится в вашем data: нулевой байт, а затем еще символы. Так что на самом деле он не пуст; вы просто неправильно предполагаете, что это так.

Большинство отладчиков имеют представление «необработанной памяти», часто отображаемое в виде дампа hex-ascii. Попробуй это.

Paul Sanders 27.05.2019 17:58

Другие вопросы по теме