Здравствуйте. Когда я был маленьким, я программировал на паскале. И горя не знал, используя типизированные файлы. Ну, вы знаете, это такие файлы, которые хранят данные определенного типа. Я мог объявить такой файл с помощью File of ... , переместиться на нужную позицию с помощью SEEK и даже, если мне не изменяет память, перезаписать отдельный элемент (структуру, например). Прошло несколько лет. Я учусь на программиста, типизированными файлами не пользовался года два — мне всегда было достаточно лишь сохранения значений в текстовой файл и последовательного считывания их из файла (потока). Таким образом я работал со всеми структурами данных, включая деревья. Но черт меня все-таки дернул и я выбрал (какова же моя ошибка) в качестве курсовой работы Б-дерево. Языком реализации, ради нового опыта, был выбран C#. Проблема, как уже, наверное, многие поняли, заключается в том, что идеологически неправильно это самое б-дерево полностью грузить в память из файла. Нужно грузить его отдельными узлами, иначе пропадает весь смысл. При том, без полной перезаписи файла нужно перезаписывать эти самые узлы (уже существующие в файле)... И вот тут бы пригодился паскалевский типизированный файл. Но заглянув в гугл, я увидел, что там холодно,дурно пахнет, а нехорошие дяденьки маниакальной наружности ходят и бормочат под нос : "сериализация!", "Маршалинг!", "Неуправляемая память!", и другие неприличные слова, за которые мама дала бы мне затрещину, а я хочу назад к теплому , родному и ламповому типизированному файлу, к которому так привык в детстве.
С помощью жутких костылей типа вышеупомянутой сериализации, маршалинга и т.д. я смог записывать в файл структуры и даже находить и читать нужную структуру по ее номеру. Но это настолько вырвиглазно, что я в замешательстве. Подскажите нормальный способ организации такого файла или хотя бы ткните носом, как перезаписать n байт в произвольном месте файла новыми значениями. Спасибо заранее и простите за графоманство.
Здравствуйте, Electronic_terrorist, Вы писали:
E_>Подскажите нормальный способ организации такого файла или хотя бы ткните носом, как перезаписать n байт в произвольном месте файла новыми значениями. Спасибо заранее и простите за графоманство.
Здравствуйте, Electronic_terrorist, Вы писали:
E_>Да, пожалуй тут мой мозг совсем сварился. Спасибо, странно что сам не нашел. И все же хотелось бы узнать о нормальных реализациях подобного.
Нормальные реализации подобного упираются в то, что в дотнете нет предопределенных типов для строк фиксированного размера, да еще и существует толпа кодировок, в которых можно записать строки, потому и строки одной длины могут иметь разную длину в файле. Так же, некоторые типы содержат явно избыточную информацию для прямого отображения в файл (например, DateTime).
Именно по этому придется указывать явный способ преобразования вашей структуры данных в массив байт(или поток байт) и обратно.
В помощь: BinaryWriter/BinaryReader, BitConverter, MemoryStream (для записи в буфер при необходимости, а не в поток файла непосредственно), а так же двоичная и текстовые сериализации. Внимание, контроль за непревышением длины записи в файле остается на разработчике.