Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > .NET для новичков > Жизнь в отсутствии указателей C# |
Автор: EqKeeper 18.2.2010, 07:36 | ||
Доброго времени суток! Всю жизнь сидел на C++Builder, но благодаря обитателям этого (и не только) форума, решил освоить что-нибудь еще. И поставил себе Visual Studio 2008 и создал проект на C# (прошу прощения, но раздела по нему не нашел, потому пишу сюда). И сразу мне этот язык понравился, но вопросов возникла масса. Раньше я терпеть не мог указатели. И только сейчас, когда их лишился, понял - какая это замечательная штука! Возникло масса вопросов, касательно порта CB-проекта на новую основу. В частности: 1) Есть структура с разнообразным содержимым, в том числе вложенными структурами и битовыми полями - как считать ее (или в нее - как правильно?) из файла? В C++ это делалось элементарно, но здесь указатель не передашь, да и функции наверняка уже нет... Так что вопрос - как или лучше даже чем ее считать? Очень желательно с коротеньким примером. 2) Есть древо каталогов на основе TreeView (первый раз его сам писал, так что, может, не в ту сторону копал...). Ноды можно помечать флажками. Задача - сделать поиск файлов только внутри помеченных флажками каталогов и вывести список файлов. Если бы шли они по порядку, да с самого верха (от диска), то проблем бы не было. А так сам диск может быть и не помечен - вначале нужно сформировать массив помеченных нодов. И вот тут очередной ступор - как? Написал функцию, но, видимо, не верно:
Возможно есть более простой способ или... или вообще - способ. ^^ Буду рад любой помощи! |
Автор: EqKeeper 18.2.2010, 22:42 |
Вопрос с TreeView снимается. Я забыл о возможности создать "глобальный" массив и использовтаь его без всяких указателей. Ко всему прочему алгоритм работы был несколько изменен, наследуемое выделение убрано, а пометки сохраняются в-, и удаляются из- массива сразу после тыка по флажку. Heinzz Вот то жуткое слово я уже встречал. Что это такое и как этим пользоваться? Как уже говорил - с примером, если не сложно. И еще немного не понял, что имелось ввиду под "вновь создаваемая". Есть структура. struct SomeStruct { int a; char b[32]; char c:1; char d:2; char e:1; }; Есть файл, вначале которого идут 37 байт, которые нужно считать, соответственно раскидав по структуре. Первые 4 - в int a, следующие 32 - в char [] b, а последний разбить побитно. |
Автор: EqKeeper 19.2.2010, 18:15 | ||
Неужели никто не знает? Чтобы было нагляднее, приведу кусок из программы на BCB - его-то и надо портировать на C#
... или, как вариант - расширение для C#, позволяющее это делать. Например - оформить это вот в качестве функции в C++, отправить в библиотеку и подключить к C#... Или еще что-нибудь... Если есть идеи - поделитесь пожалуйста! Только с примерами - я еще только учусь, а в мелкомягкой справке сам черт ногу сломит... да и термины там жуткие... >_> |
Автор: KuMa1104 19.2.2010, 23:57 | ||||
И взял земли и воды, и смешал их, и создал он тварей водяных и гадов с холодной кровью. И взял он воды и огня, и.. ![]() Почитайте про сериализацию рекомендую Троелсен Эндрю С# И платформа НЕТ! Вот это от туда
|
Автор: EqKeeper 20.2.2010, 11:49 |
KuMa1104 Спасибо, суть понял! Попробую написать у себя по аналогии с твоим примером. Если не получится... придется и впрямь читать книжку, хотя не люблю я это дело... один единственный раз мне понравилось читать док по C++, на каком-то сайте. Но там очень хорошо материал подавался. Что поделать - самоучка, мне легче по чужим скриптам учиться, чем по докам. =\ |
Автор: EqKeeper 20.2.2010, 13:28 | ||||||
Ехаем дальше. С се... сериализацией и де... десериализацией своих объектов я разобрался. Собрал структуру, сделал ее сериализируемой, изменил, сохранил в файл, потом считал - все прекрасно. Но когда попытался таким образом считать файл, получил следующую ошибку:
Оно и понятно - если открыть файл блокнотиком, можно увидеть такую картину:
Тобишь, сохраняя файл, он записывает туда кучу дополнительной информации для ее считывания. В готовом файле (в данном примере - mp3) понятное дело такой информации нет. Есть лишь последовательность байт, которую нужно прочитать и рассортировать по структуре. Смещение 0, длина 4 - это вот первое поле. Смещение 4 длина 16 - это второе и т.д. Привожу код, надеюсь, что поможете разобраться - что я делаю неправильно... (записываю я класс или структуру - значения не имеет, видимо, потом что все они наследники object).
|
Автор: KelTron 20.2.2010, 17:46 |
http://www.codeproject.com/KB/files/fastbinaryfileinput.aspx |
Автор: EqKeeper 21.2.2010, 17:02 |
Ммм... спасибо, посмотрю... P.S. Уже объяснили, что сериализация в моем случае не подходит. |
Автор: Heinzz 21.2.2010, 18:39 |
напишите свой простой класс для чтения таких файлов. Вновь создаваемая - я имел в виду что если читать файлы уже сгенерированные не сериализацией то сериализация Вам не подходит, тк файлы имеют различный формат, в файле полученном путем сериализации есть информация о сохраненной структуре, а в Вашей последосательности байтов нет. открывайте поток и если знаете в какой последовательности записаны байты используйте ReadInt ReadChar .... |
Автор: EqKeeper 21.2.2010, 20:51 | ||
Heinzz Да, с сериализацией я уже понял. А жаль. =\ Класс это конечно хорошо, но хочется универсализации. =\\ В BCB было все так просто и удобно... А здесь целый класс... =\\\ KelTron Раскурочил ту демку. Большущее спасибо. Файл считал всеми тремя способами. Структуру заполнил - все прекрастно. Проблема одна - я не могу вытащить из файла строки. Предположим, у меня есть строка длиной 12 байт. В структуре я ее записываю как указано в той демке:
Целочисленные данные до и после нее считываются на ура. Если же попробовать считать после прочтения some_struct.date.toString(), то для любого файла я получаю "System.Byte[]" или "System.Char[]", если пытаюсь считать как char'ы. Попытка выставить string вызывает ошибку TSize. Что делать? Что я делаю неправильно? |
Автор: KelTron 22.2.2010, 13:06 | ||
Кодировку смотри сам, какая нужна. |
Автор: EqKeeper 22.2.2010, 15:42 |
Большущее спасибо! Попробую. |
Автор: EqKeeper 22.2.2010, 16:38 |
Все работает! Еще раз спасибо! |