Как правильно определить состояние конца файла в RWops SDL2? - PullRequest
1 голос
/ 31 января 2020

SDL2 определяет потоковую абстракцию ввода / вывода, SDL_RWops, которая поддерживает чтение, запись, поиск и т. Д. c.

Документация для SDL_RWops функции чтения говорит, что каждая реализация

Возвращает количество прочитанных объектов или 0 в случае ошибки или конца файла; вызовите SDL_GetError () для получения дополнительной информации.

Поскольку один и тот же код ошибки используется как для ошибки, так и для EOF, нет способа отличить guish между этими двумя условиями только с помощью этого вызов. Похоже, нет другого способа запросить RWops для условия конца файла.

Подпись для SDL_GetError():

const char* SDL_GetError(void)

... другими словами, он также совершенно не подходит для проведения различий между этими условиями.

Итак, как мы можем узнать, произошла ли ошибка или поток просто достиг конца файла?

Одна хорошая мысль - использовать SDL_RWseek() для получения текущей позиции потока, затем искать до конца, сравнивать две позиции и искать назад. Тем не менее, это не работает в целом - потому что не все потоки могут искать (например, реализация сетевого потока или поток, который на лету распаковывается из ввода какого-либо другого потока, и т. Д. c ... в общем, поиск может просто не поддерживаться).

1 Ответ

0 голосов
/ 12 февраля 2020

Что вам нужно сделать, это вызвать SDL_ClearError (), прежде чем начать использовать SDL_RWread (). Когда SDL_RWread () возвращает 0, вы проверяете с помощью SDL_GetError (), была ли ошибка. Если произошла ошибка, SDL_GetError () вернет строку, описывающую ошибку. Если SDL_GetError () возвращает пустую строку, это означает, что ошибки не было, поэтому SDL_RWread () вернул 0 для EOF.

...