Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объединения и структуры, Запись данных в объединение.. 
:(
    Опции темы
Uvs
Дата 8.8.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ Skype   Вверх
stab
Дата 8.8.2007, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 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.
PM MAIL WWW   Вверх
Uvs
Дата 9.8.2007, 06:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.8.2007
Где: Челябинск

Репутация: нет
Всего: нет



Здравствуйте, спасибо за ответ. К сожалению отказаться от union я не могу(или не знаю как).  Нужно из текстового файла считать записи, длина записи около 2000 байт. Если раньше считав запись в строку - автоматом заполнялись поля структуры

union MyUnion
{
 char str[2000];
 struct MyStruct
 {
   туча полей различной длины 
 }
}
, а как это сделать сейчас пока не представляю :(

если читать из каждой строки по позициям - это будет ужас, в записи несколько сотен полей! Подскажите какой еще может быть вариант?
PM MAIL ICQ Skype   Вверх
archeg
Дата 9.8.2007, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 11
Всего: 27



Код

[StructLayout(LayoutKind.Custom)]
struct MyUnion
{
 [FieldOffset(0)]
 char str[2000];
 [FieldOffset(0)]
 MyStruct struct;

 [StructLayout(LayoutKind.Sequential)]
 struct MyStruct
 {
   .....
 }
}

может так? Кстати кажись, по-умолчанию структура сразу заполняется ввиде LayotKind.Sequential

и вообще лучше уж использовать сериализацию smile 

Это сообщение отредактировал(а) archeg - 9.8.2007, 08:52


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
Uvs
Дата 9.8.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.8.2007
Где: Челябинск

Репутация: нет
Всего: нет



попробую..
PM MAIL ICQ Skype   Вверх
stab
Дата 9.8.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Цитата(Uvs @  9.8.2007,  10:07 Найти цитируемый пост)
если читать из каждой строки по позициям - это будет ужас, в записи несколько сотен полей! Подскажите какой еще может быть вариант? 


так в .net с потоками данных и работают, считывают\записывают каждое поле отдельно. альтернатива - бинарная сериализация, но я так понимаю, вам нужно сохранить совместимомть с каким-то сущетсвующим форматом, так что-то этот вариант отпадает. можно ещё попытаться написать собственный универсальный загрузчик использую рефлекшен и атрибуты, но эффективность такого решения будет очень низкой, время загрузки увеличится в разы, а то и в десять раз.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Uvs
Дата 10.8.2007, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.8.2007
Где: Челябинск

Репутация: нет
Всего: нет



Сериализация вряд ли подойдет - да вообще не нужна  smile. Приходит готовая выписка из банка, это текстовый файл, считываю оттуда данные для конвертации в базу.
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.