|
#1
|
|||
|
|||
Чтение из файла
Здраствуйте, моя проблемма такая:
У меня есть файл levels.mrg и есть его структура. Мне нужно написать программу которая будет читать этот файл как текст. Если такое возможно покажите пример. Плиз. |
#2
|
|||
|
|||
Цитата:
Не могу прочитать структуру файла - все идет кракозябрами. Но как я понял - это бинарный файл. Соответсвенно, тебе его надо прочитать как бинарный и представить в текстовом виде. |
#3
|
||||
|
||||
В нормальной кодировке, если что:
Код:
Итак, поехали. Для начала для тех, кто в танке, уясню: int = 4 байта short = 2 байта byte = 1 байт Итак. Грубо говоря, файл можно разделить на 2 части: заголовок и сам файл. 1. Заголовок. Заголовок, в свою очередь, можно поделить на 3 части: заголовок легкого, заголовок среднего, заголовок сложного уровней. Структура заголовка (схематично): [int кол-во уровней на easy] { [int номер_байта][название уровня][byte нулевой байт] ... } [int кол-во уровней на medium] { [int номер_байта][название уровня][byte нулевой байт] ... } [int кол-во уровней на hard] { [int номер_байта][название уровня][byte нулевой байт] ... } Это и есть "3 части" заголовка. Рассмотрим их поподробнее. Сначала идет int - количество уровней (на опр. уровне сложности). Потом идет запись (объединяю в контейнер): { int - номер байта (номер байта в файле, считая с нуля, где записан сам уровень.), название уровня, byte - закрывающий нулевой байт }. Эта запись повторяется столько раз, сколько уровней на данном уровне сложности - адрес начала для каждого трека. Потом аналогично для medium и для hard. 2. Сами треки Эту часть файла тоже можно условно разделить на 2 части: информация о треке и сам трек. Как раз начало этой, адрес, где эта запись начинается в файле (номер байта) мы читаем в заголовке файла. То есть если в mrg файле 30 уровней (10/10/10), то таких "записей уровня" будет 30 - они просто идут друг за другом, ничем не разделяются. "Информация" в файле записана следующим образом: [byte - 0x33 - с этого байта начинаются все треки][int* - положение старта по оси X][int* - положение старта по оси Y (положение не флажка, а мотыка)][int* - положение финиша по оси X][int* - положение финиша по оси Y (в принципе ни от чего не зависит, постоянно 0)][short - количество точек][int - первая точка по оси X][int - первая точка по оси Y] Сам трек записывается как последовательность байтов { [byte - точка по оси X][byte точка по оси Y] }: [byte - точка по оси X][byte точка по оси Y][byte - точка по оси X][byte точка по оси Y]...[byte - точка по оси X][byte точка по оси Y]. 2 байта - X и Y = 1 точка. (количество точек, как я уже сказал, записано в "заголовке", "информации" уровня). В итоге: считываем, форматируем, что нужно, в строку, выводим РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت |