Аналог file of (record) C#
От: Electronic_terrorist  
Дата: 08.05.11 19:27
Оценка:
Здравствуйте. Когда я был маленьким, я программировал на паскале. И горя не знал, используя типизированные файлы. Ну, вы знаете, это такие файлы, которые хранят данные определенного типа. Я мог объявить такой файл с помощью File of ... , переместиться на нужную позицию с помощью SEEK и даже, если мне не изменяет память, перезаписать отдельный элемент (структуру, например). Прошло несколько лет. Я учусь на программиста, типизированными файлами не пользовался года два — мне всегда было достаточно лишь сохранения значений в текстовой файл и последовательного считывания их из файла (потока). Таким образом я работал со всеми структурами данных, включая деревья. Но черт меня все-таки дернул и я выбрал (какова же моя ошибка) в качестве курсовой работы Б-дерево. Языком реализации, ради нового опыта, был выбран C#. Проблема, как уже, наверное, многие поняли, заключается в том, что идеологически неправильно это самое б-дерево полностью грузить в память из файла. Нужно грузить его отдельными узлами, иначе пропадает весь смысл. При том, без полной перезаписи файла нужно перезаписывать эти самые узлы (уже существующие в файле)... И вот тут бы пригодился паскалевский типизированный файл. Но заглянув в гугл, я увидел, что там холодно,дурно пахнет, а нехорошие дяденьки маниакальной наружности ходят и бормочат под нос : "сериализация!", "Маршалинг!", "Неуправляемая память!", и другие неприличные слова, за которые мама дала бы мне затрещину, а я хочу назад к теплому , родному и ламповому типизированному файлу, к которому так привык в детстве.

С помощью жутких костылей типа вышеупомянутой сериализации, маршалинга и т.д. я смог записывать в файл структуры и даже находить и читать нужную структуру по ее номеру. Но это настолько вырвиглазно, что я в замешательстве. Подскажите нормальный способ организации такого файла или хотя бы ткните носом, как перезаписать n байт в произвольном месте файла новыми значениями. Спасибо заранее и простите за графоманство.
Re: Аналог file of (record) C#
От: samius Япония http://sams-tricks.blogspot.com
Дата: 08.05.11 19:32
Оценка: 3 (1) +1
Здравствуйте, Electronic_terrorist, Вы писали:

E_>Подскажите нормальный способ организации такого файла или хотя бы ткните носом, как перезаписать n байт в произвольном месте файла новыми значениями. Спасибо заранее и простите за графоманство.


http://msdn.microsoft.com/en-us/library/system.io.filestream.position.aspx
http://msdn.microsoft.com/en-us/library/system.io.filestream.write.aspx
Re[2]: Аналог file of (record) C#
От: Electronic_terrorist  
Дата: 08.05.11 19:37
Оценка:
Да, пожалуй тут мой мозг совсем сварился. Спасибо, странно что сам не нашел. И все же хотелось бы узнать о нормальных реализациях подобного.
Re[3]: Аналог file of (record) C#
От: samius Япония http://sams-tricks.blogspot.com
Дата: 08.05.11 20:22
Оценка:
Здравствуйте, Electronic_terrorist, Вы писали:

E_>Да, пожалуй тут мой мозг совсем сварился. Спасибо, странно что сам не нашел. И все же хотелось бы узнать о нормальных реализациях подобного.

Нормальные реализации подобного упираются в то, что в дотнете нет предопределенных типов для строк фиксированного размера, да еще и существует толпа кодировок, в которых можно записать строки, потому и строки одной длины могут иметь разную длину в файле. Так же, некоторые типы содержат явно избыточную информацию для прямого отображения в файл (например, DateTime).
Именно по этому придется указывать явный способ преобразования вашей структуры данных в массив байт(или поток байт) и обратно.
В помощь: BinaryWriter/BinaryReader, BitConverter, MemoryStream (для записи в буфер при необходимости, а не в поток файла непосредственно), а так же двоичная и текстовые сериализации. Внимание, контроль за непревышением длины записи в файле остается на разработчике.
Re: Аналог file of (record) C#
От: matumba  
Дата: 09.05.11 07:52
Оценка:
Здравствуйте, Electronic_terrorist, Вы писали:

E_>Здравствуйте. Когда я был маленьким....


Для самых маленьких можно попробовать SQLLite.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.