Сохранить структуру в файл

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сохранить структуру в файл

Сообщение Ruslan Demidow » 06.01.2009 (Вт) 18:30

Всем привет!
Давно я тут не был! :-)
Есть небольшой код, который сохраняет структуру в файл.
Всё бы хорошо, но почему-то если смотреть в сохранённый файл - то видно, что между полями структуры VB при сохранении вставляет "лишние" символы. :-(
При этом, если прочитать эту структуру из файла - то она читается в том же виде, как и записывалась, "лишние" знаки в структуре не читаются.
Вот код:
Код: Выделить всё
Option Explicit


Private Type PacketMessage
PType As Integer
oNode As Integer
dNode As Integer
oNet As Integer
dNet As Integer
Attr As Integer
cost As Integer
datetime As String '* 20
ToUserName As String '* 36
FromUserName As String '* 36
subject As String '* 72
Area As String
text As String
End Type



Private Sub Command1_Click()
    Dim PktMsg As PacketMessage
    Dim sFileName As String
    Dim fNum As Integer
   
    sFileName = "D:\Test.pkt"
   
    With PktMsg
        .PType = 2
        .oNode = 112
        .dNode = 234
        .oNet = 5015
        .dNet = 5020
        .Attr = 0
        .cost = 0
        .datetime = "06 Jan 09 13:10:45"
        .ToUserName = "Vadim Makarov"
        .FromUserName = "Ruslan Demidov"
        .subject = "Тест № 7 - проверка."
        .Area = ""
        .text = "Это всего лишь проверка - тест № 7."
    End With
   
    fNum = FreeFile
    Open sFileName For Output As fNum
    Put fNum, , PktMsg
    Close fNum
'    Unload Me
End Sub


Private Sub Command2_Click()
    Dim PktMsg As PacketMessage
    Dim sFileName As String
    Dim fNum As Integer
    Dim strTmp As String
   
    sFileName = "D:\Test.pkt"
     fNum = FreeFile
    Open sFileName For Binary As fNum
    Get fNum, , PktMsg
    Close fNum
   strTmp = ""
       
   With PktMsg
        strTmp = strTmp & "PType: " & .PType & vbCrLf
        strTmp = strTmp & "oNode: " & .oNode & vbCrLf
        strTmp = strTmp & "dNode: " & .dNode & vbCrLf
        strTmp = strTmp & "oNet: " & .oNet & vbCrLf
        strTmp = strTmp & "dNet: " & .dNet & vbCrLf
        strTmp = strTmp & "Attr: " & .Attr & vbCrLf
        strTmp = strTmp & "cost: " & .cost & vbCrLf
        strTmp = strTmp & "datetime: " & .datetime & vbCrLf
        strTmp = strTmp & "ToUserName: " & .ToUserName & vbCrLf
        strTmp = strTmp & "FromUserName: " & .FromUserName & vbCrLf
        strTmp = strTmp & "subject: " & .subject & vbCrLf
        strTmp = strTmp & "Area: " & .Area & vbCrLf
        strTmp = strTmp & "text: " & .text & vbCrLf
    End With
   
   Text1.text = strTmp
End Sub



Подскажите, плиз, в какую сторону копать, чтобы записать структуру без "лишних" символов?
Или может быть я вообще не с той стороны подхожу?
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Сохранить структуру в файл

Сообщение ANDLL » 06.01.2009 (Вт) 18:34

А как технически можно записать такую структуру без "лишних" символов да еще и прочитать ее потом?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Re: Сохранить структуру в файл

Сообщение Ruslan Demidow » 07.01.2009 (Ср) 19:25

Это-то я и хотел спросить. :-) Я записываю, но структура пишется с дополнительными символами между полями (видимо служебные), которые VB при чтении не учитывает.
Те файлы, которые я собираюсь формировать - должны содержать данные без этих, лишних, символов.
При том данные будут записываться порциями. Каждая порция содержит в себе разные данные, расположенные в определённой последовательности.
И если я подсовываю другой программе такой файл, сохранённый из-под VB, она спотыкается именно на этих символах (как правило символы из первых 3-х десятков, т.е. непечатаемые). Единственным разделителем полей записанной структуры, который допускается в этих файлах, является char$(0).
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Сохранить структуру в файл

Сообщение MIT » 07.01.2009 (Ср) 19:43

Если хочешь сохранять только данные, то они должны иметь ограниченную, фиксированную длину.
Например, что бы записать следующую структуру:

Data as string
Count as long

необходимо вставить данные о длине эдемента Data
В структуре

C1 as long
C2 as long
C3 as long

можно обойтись без доп. символов, ведь в VB6 long всегда занимает 4 байта. Но учти: подобным способом сохранять и читать только ручками можно.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Сохранить структуру в файл

Сообщение ANDLL » 08.01.2009 (Чт) 16:35

Ну если для тебя chr(0) разделитель, то пиши руками с этим разделителем. Перед этим неплохо бы проверить, нету ли chr(0) в самой строке
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Re: Сохранить структуру в файл

Сообщение Ruslan Demidow » 09.01.2009 (Пт) 0:40

ANDLL писал(а):Ну если для тебя chr(0) разделитель, то пиши руками с этим разделителем. Перед этим неплохо бы проверить, нету ли chr(0) в самой строке

Так и пришлось. :-)
Если один раз открыть файл и потом последовательно записать каждое из полей (отдельной командой), то всё нормально пишется.
А по поводу разделителя - конечно же все значения полей перед записью "очищаются" от chr(0) и терминирутся в конце им же.
Таким образом для внешней программы программы файл подходит на 100%. :-)
Всем спасибо за участие.
Тред можно считать закрытым. :-)
Это Ж-ж-ж-ж неспроста (с) Винни-Пух


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 90

    TopList