Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: VB .NET - чтение структуры из файла Добавлено: 22.05.03 17:28  

Автор вопроса:  Павел | Web-сайт: www.vbnet.ru | ICQ: 326066673 
VB .NET. Как прочитать инфу из файла в структуру? Конечно, можно это сделать, юзая операторы Open/Get/Close. Но хотелось бы как-нибудь цивилизованно, через Stream'ы.

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 Chill



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #1 Добавлено: 23.05.03 00:55

' Открытие файла

Dim fs As FileStream

Dim sr As StreamReader

cdlFileOpen.Filter = "Текстовые (*.txt)|*.txt|Все файлы (*.*)|*.*"

If cdlFileOpen.ShowDialog() = DialogResult.OK Then

txtText.Clear()

fs = cdlFileOpen.OpenFile

If Not (fs Is Nothing) Then

'sr = New StreamReader(fs, System.Text.Encoding.GetEncoding(1251))

'sr = New StreamReader(fs, System.Text.Encoding.GetEncoding(10007)) ' MacCP

sr = New StreamReader(fs, System.Text.Encoding.GetEncoding(20866)) ' Koi8-r CP

'sr = New StreamReader(fs, System.Text.Encoding.GetEncoding(866))

txtText.Text = sr.ReadToEnd

sr.Close()

fs.Close()

End If

End If

Вот пример кода из моей проги

Ответить

Номер ответа: 2
Автор ответа:
  Creator



Вопросов: 11
Ответов: 61
 Профиль | | #2 Добавлено: 23.05.03 08:17

 Конкретней нужно формулировать .....

Если а правильно понял, то посмотри пример:

Structure Product

Dim ProdID As String

Dim prodDescription As String

Dim listPrice As Single

Dim Available As Boolean

Dim minStock As Integer

End Structure

Private Sub SaveToFile

Dim FS As FileStream

FS = New FileStream("BinaryData.bin", _

System.IO.FileMode.OpenOrCreate, _

System.IO.FileAccess.Write)

BW = New BinaryWriter(FS)

BW.BaseStream.Seek(0, SeekOrigin.Begin)

Dim p As New Product()

p.ProdID = "100-A39"

p.prodDescription = "Cellular Phone with built-in TV"

p.listPrice = 497.99

p.available = True

p.minStock = 40

SaveRecord(BW, p)

p = New Product()

p.ProdID = "100-U300"

p.prodDescription = "Wireless Handheld"

p.listPrice = 315.5

p.Available = False

p.minStock = 12

SaveRecord(BW, p)

p = New Product()

p.ProdID = "99-BBB"

p.prodDescription = "Calculator/Recorder Watch"

p.listPrice = 49.99

p.available = True

p.minStock = 10

SaveRecord(BW, p)

BW.Close()

FS.Close()

FS = Nothing

MsgBox("Records saved")

Button2.Enabled = True

End Sub

Sub SaveRecord(ByVal writer As BinaryWriter, ByVal record As Product)

writer.Write(record.ProdID)

writer.Write(record.prodDescription)

writer.Write(record.listPrice)

writer.Write(record.Available)

writer.Write(record.minStock)

End Sub

Private Sub ReadFromFile

Dim BR As BinaryReader

Dim FS As FileStream

FS = New System.IO.FileStream("Binarydata.bin", _

FileMode.Open, _

FileAccess.Read)

BR = New System.IO.BinaryReader(FS)

BR.BaseStream.Seek(0, SeekOrigin.Begin)

Dim p As New Product()

TextBox1.Clear()

Dim c As Integer

c = BR.PeekChar

While FS.Position < FS.Length

Console.WriteLine(c)

p = Nothing

p.ProdID = BR.ReadString

p.prodDescription = BR.ReadString

p.listPrice = BR.ReadSingle

p.Available = BR.ReadBoolean

p.minStock = BR.ReadInt32

c = BR.PeekChar

End While

BR.Close()

FS.Close()

End Sub

Кажется примерно так, но вообщето я сам для этих целей использую XML схемы, пишу сериализацию, разные там конвертеры ....и т.д.

Ответить

Номер ответа: 3
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #3
Добавлено: 23.05.03 09:33
Спасибо, так и я умею (по отдельности читать в свойства структуры). А пордробнее про XML схемы, пишу сериализацию, разные там конвертеры можно?

 

Ответить

Номер ответа: 4
Автор ответа:
  Creator



Вопросов: 11
Ответов: 61
 Профиль | | #4 Добавлено: 23.05.03 10:37

Отправил симпл на мыло .....

Ответить

Номер ответа: 5
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 27.01.08 18:30
О! Наконец-то смайлы вернули!

Ответить

Номер ответа: 6
Автор ответа:
 ника



Вопросов: 1
Ответов: 111


 Профиль | | #6 Добавлено: 27.01.08 20:25
Это реализуется достаточно просто через Marshal.PtrToStructure. Но надо помнить несколько правил использования структур:
1. Все поля структуры должны иметь фиксированный размер. Т.е если это int - 4 байта, byte -1 и т.д. Если же в структуре используете string , то это поле обязательно должно быть объявлено с аттрибутом SizeConst.
2. Сама структура должна иметь аттрибут [StructLayout(LayoutKind.Sequential)]
3. Суммарный размер структуры (полученный через Marshal.SizeOf) не должен превышать 16 байт. В противном случае применение структур становится неоправданным из за потери скорости работы с нею (Boxing / Unboxing)

Само собой, что файл должен иметь соотвествующую структуру.

P.S. пример писать не буду из за неимения VB и неадекватного отношения отдельных личностей вашего форума к C#

Ответить

Номер ответа: 7
Автор ответа:
 BUMM ®



Вопросов: 8
Ответов: 482
 Профиль | | #7 Добавлено: 28.01.08 02:29
Попробуй делать не структуру, а класс с атрибутом serializable и сериализуй его либо с помощью SOAP в XML, либо в бинарник с binaryformatter (2-й способ намного быстрее)

Ответить

Номер ответа: 8
Автор ответа:
 BUMM ®



Вопросов: 8
Ответов: 482
 Профиль | | #8 Добавлено: 28.01.08 02:43
а вот пару примеров с хештаблей(можешь ее использовать вместо структуры), для SOAP поменяй форматтер.

Public Sub set_percorsi_connesione(ByVal ht As Hashtable)
        Dim fs As IO.Stream
        Try
            fs = New IO.FileStream(Application.StartupPath & "\init.dat", IO.FileMode.OpenOrCreate)
            Dim bw As New Runtime.Serialization.Formatters.Binary.BinaryFormatter
            bw.Serialize(fs, ht)
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical)
        Finally
            fs.Close()
        End Try
    End Sub
    Public Function get_percorsi_connesione() As Hashtable

        Dim ht As Hashtable
        Dim fs As IO.Stream
        Try

            fs = New IO.FileStream(Application.StartupPath & "\init.dat", IO.FileMode.OpenOrCreate)
            Dim bw As New Runtime.Serialization.Formatters.Binary.BinaryFormatter
            ht = DirectCast(bw.Deserialize(fs), Hashtable)
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical)
        Finally
            fs.Close()
        End Try
    End Function

Ответить

Номер ответа: 9
Автор ответа:
 ника



Вопросов: 1
Ответов: 111


 Профиль | | #9 Добавлено: 28.01.08 14:20
binaryformatter (2-й способ намного быстрее)

1. Утверждение имеет смысл только на больших объемах сохраняемых данных. Выигрыш в скорости может доходить до 50 раз. Но на маленьких объемах - это неактуально.
2. После малейшего изменения кода, файл с данными становится нечитаемым. Во избежании этого код приходится выносить в отдельную сборку - а это не всегда удобно.
3. Xml сериализация имхо является более предпочтительной, если позволяют объемы.
4. PtrToStructure это самый быстрый способ заполнения структуры на сегоднешний момент. Но структура, это как рыба фуго - надо уметь правильно приготовить. Иначе ничего, кроме тормозов, ты не получишь.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам