![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Uvs |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.8.2007 Где: Челябинск Репутация: нет Всего: нет |
Добрый день! Наверно я уже 2008 с подобным вопросом, но все же ..
проблема в том, чтоб читая записи из текстового файла в строку - этими данными заполнялись поля структуры. В С++ для этого применяется "финт ушами": union MyUnion { char str[1000]; struct MyStruct { поля структуры.. } } .. и записывая данные в str - получаем заполненные поля в MyStruct. почитав форум написал [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] public struct MyStruct { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 60)] public char[] company; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)] public char[] payDate; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] char[] buffer; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)] public char[] payment; public MyStruct(bool a) { company = new char[60]; payDate = new char[10]; buffer = new char[20]; payment = new char[10]; } } [StructLayout(LayoutKind.Explicit, CharSet=CharSet.Ansi, Pack=1, Size=100)] public struct MyUnion { [FieldOffset(0)] public string str; [FieldOffset(0)] public MyStruct ms; public MyUnion(bool a) { str = ""; ms = new MyStruct(a); } } class Class { [STAThread] static void Main(string[] args) { MyUnion mu = new MyUnion(true); StreamReader sr = new StreamReader("D.txt"); do { mu.str = sr.ReadLine(); } while(mu.str != null); } } но как ожидал данные почему-то не попадают в поля MyStruct :( Почему так? Это сообщение отредактировал(а) Uvs - 8.8.2007, 17:14 |
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
потому что string - это ссылочный тип, в структуре хранится только ссылка. атрибут MarshalAs влияет только на маршалинг, т.е. строка не встраивается в структуру. кроме того массив char из С не тоже самое что string в С#, эти типы бинарно не совместимы + char из С != char из C#, первый размером один байт, второй два байта, т.е. тоже бинарная несовместимость. во время маршалинга для преодоления этой несовместимости используются временные буферы.
как вариант можешь попробовать встроить массив byte (C char) в структуру используя fixed модификатор. весьма спорное и не удобное решение (придётся конвертировать при доступе в строку), к тому же работает только для C# 2.0. рекомендую отказаться от юнионов, кроме головной боли это ничего не даст. -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
Uvs |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.8.2007 Где: Челябинск Репутация: нет Всего: нет |
Здравствуйте, спасибо за ответ. К сожалению отказаться от union я не могу(или не знаю как). Нужно из текстового файла считать записи, длина записи около 2000 байт. Если раньше считав запись в строку - автоматом заполнялись поля структуры
union MyUnion { char str[2000]; struct MyStruct { туча полей различной длины } } , а как это сделать сейчас пока не представляю :( если читать из каждой строки по позициям - это будет ужас, в записи несколько сотен полей! Подскажите какой еще может быть вариант? |
|||
|
||||
archeg |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
может так? Кстати кажись, по-умолчанию структура сразу заполняется ввиде LayotKind.Sequential и вообще лучше уж использовать сериализацию ![]() Это сообщение отредактировал(а) archeg - 9.8.2007, 08:52 -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет ![]() И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
Uvs |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.8.2007 Где: Челябинск Репутация: нет Всего: нет |
попробую..
|
|||
|
||||
stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
так в .net с потоками данных и работают, считывают\записывают каждое поле отдельно. альтернатива - бинарная сериализация, но я так понимаю, вам нужно сохранить совместимомть с каким-то сущетсвующим форматом, так что-то этот вариант отпадает. можно ещё попытаться написать собственный универсальный загрузчик использую рефлекшен и атрибуты, но эффективность такого решения будет очень низкой, время загрузки увеличится в разы, а то и в десять раз. -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
Uvs |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.8.2007 Где: Челябинск Репутация: нет Всего: нет |
Сериализация вряд ли подойдет - да вообще не нужна
![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |