Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: типизированные файлы. количество записей? Добавлено: 03.10.08 17:36  

Автор вопроса:  DimDoc
как узнать количество записей в типизированом файле для дальнейшего присвоения этого значения динамическому массиву?
функция EOF(1) в следующем цикле входит в бесконечный цикл


Do While Not EOF(1)
i +=1
Loop

Ответить

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

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



Вопросов: 58
Ответов: 4255
 Профиль | | #1 Добавлено: 03.10.08 19:35
В NET нет никаких EOF.. тут абсолютно другая модель доступа к данным. Чтобы ответить на твой вопрос нужно знать что ты используешь в качестве источника данных. Если это обычный DataTable, то у него есть свойство Rows (коллекция записей) у которой, в свою очередь, есть свойство Count - именно это свойство и возвращает количество записей в источнике.

Ответить

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



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

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #2
Добавлено: 04.10.08 10:55
Надо ж читать из файла и перемещать указатель, чтоб достигнуть конец файла=) Вообще, если файл типизированный (структурированный), то чтоб получить количество записей надо разделить размер файла на размер структуры.

Ответить

Номер ответа: 3
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #3 Добавлено: 04.10.08 13:24
Сейчас попробую показать на примере, что нужно сделать....
В моей программе пользователь может выбрать из ComboBox одну из молочных смесей, а программа произведёт необходимые расчёты.
объявляю структуру:
  1.  
  2.  Structure Milk_Mix
  3.         Dim name As String
  4.         Dim Protein As Single
  5.         Dim Fat As Single
  6.         Dim glucose As Single
  7.         Dim energy As Single
  8.     End Structure


Для хранения данных о смесях создаю массив:
  1. Dim mix(2) As Milk_Mix

ввожу данные о смесях:
  1.  
  2.         mix(1).name = "Хумана" : mix(2).name = "Фрисопре"
  3.         mix(1).Protein = 1.5 : mix(2).Protein = 1.2
  4.         mix(1).Fat = 3.5 : mix(2).Fat = 3.3
  5.         mix(1).glucose = 7.5 : mix(2).glucose = 6.5
  6.         mix(1).energy = mix(1).Protein * 4 + mix(1).Fat * 9.3 + mix(1).glucose * 3.4
  7.         mix(2).energy = mix(2).Protein * 4 + mix(2).Fat * 9.3 + mix(2).glucose * 3.4


и сохраняю в типизированный файл:
  1.  
  2.         FileOpen(1, "D:\Visual Studio 2008\Projects\MilkMix\MilkMix\My Project\milk.mrf", OpenMode.Random)
  3.         Dim i As Integer
  4.         For i = 1 To mix.Count - 1
  5.             FilePut(1, mix(i))
  6.         Next i


далее. в процедуре form1_Load : считываю из файла данные о смеси и одновременно добавляю их в cboMIxName
  1.  
  2.         FileOpen(1, "D:\Visual Studio 2008\Projects\MilkMix\MilkMix\My Project\milk.mrf", OpenMode.Random)
  3.         Dim i As Integer      
  4.         For i = 1 To mix.Count - 1
  5.             FileGet(1, mix(i))
  6.             cboMIxName.Items.Add(mix(i).name)
  7.         Next i
  8.         FileClose(1)


Ну вот и всё....
Здесь показан принцип.Реально в проге хранятся данные о десятках смесей. Всё бы ничего... вполне работоспособно. До поры, до времени...
И вот в один прекрасный день пользователю поступает новая смесь, а несколько старых сняты с производства.
Теперь ясно, что нужно дать пользователю возможность самому вводить данные о смесях.
Для этого хорошо подойдёт динамический массив
  1. Dim mix() As Milk_Mix

теперь необходимо при загрузке формы определять размер массива
  1. ReDim mix(icount - 1)

но это возможно только если заранее получить число строк (icount) в файле milk.mrf
поэтому я и пробовал посчитать icount в цикле
  1.  
  2. Do While Not EOF(1)
  3. iсount +=1
  4. Loop


но этот цикл не находит конца файла и становится бесконечным.
Кстати, откуда я взял, что EOF может подойти?
Процетирую автора книги, по которой сейчас учу VB .net

Для работы с типизированными файлами мне показалось проще применять не модель .NET System.IO, методами которой мы пользовались для работы с текстовыми файлами, а процедуры модуля FileSystem пространства имён Microsoft.VisualBasic, доставшиеся в наследство от Visual Basic 6.0
                                                                                                                             С.Н.Лукин, "Понятно о Visual Basic .NET", 2005


Вообщем, проблему решить удалось, но както сильно коряво (мне так самому кажется), поэтому сейчас о решении писать не буду.
Прошу Вас помочь мне. Если, конечно я понятно изложил задачу...
С Уважением,
DimDoc

Ответить

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



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #4
Добавлено: 04.10.08 14:02
1) используйте БД
2) юзайте list и не будет проблем, тот же массив только в красивой "оболочке" =)
3) и т.д.

Ответить

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



Вопросов: 21
Ответов: 104
 Профиль | | #5 Добавлено: 04.10.08 14:17
структура, сохранённая в типизированном файле является базой данных.
Не требует наличия на компе юзера других приложений типа Access.

Ответить

Номер ответа: 6
Автор ответа:
 



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

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #6
Добавлено: 04.10.08 14:35
DimDoc, и это работает?
  1. Structure Milk_Mix
  2.         Dim name As String
  3.         Dim Protein As Single
  4.         Dim Fat As Single
  5.         Dim glucose As Single
  6.         Dim energy As Single
  7.  End Structure


Dim name As String - это плохо. Откуда васик узнает, какой длины строка? Делай уж строки фиксированной длины.
И я уже сказал, тебе надо читать файл, чтобы перемещался указатель. И тогда в конце файла EOF вернет true

Ответить

Номер ответа: 7
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #7 Добавлено: 04.10.08 14:53
Да. Это работает очень хорошо. Можно, конечно сделать строки и фиксированными, но зачем?
я не знаю, как сделать то, что Вы сказали:
надо читать файл, чтобы перемещался указатель

Ответить

Номер ответа: 8
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #8 Добавлено: 04.10.08 15:12
В MSDN нашёл следующее:
The EOF function returns False until the end of the file has been reached. With files opened for Random or Binary access, EOF returns False until the last executed FileGet function is unable to read an entire record.

Но немогу правильно перевести...
Вот что получилось:
Функция EOF возвращает Ложь, пока конец файла не был достигнут. С файлами, открытыми для Случайного или Двойного (Random or Binary) доступа, конец файла возвращает Ложь, пока последняя выполняемая функция FileGet не неспособна читать весь отчет.

как это по русски правильно понять?

Ответить

Номер ответа: 9
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #9 Добавлено: 04.10.08 16:17
Сейчас попробую показать на примере, что нужно сделать....

Лучше бы ты не показывал... :(
Темную сторону силы в тебе я чувствую юный падован..

1. Использование структур в данном случае неуместно(ввиду особенностей их хранения в памяти). Старайся избегать использование структур, вместо них используй классы.. и если все же юзаешь структуру то возьми за правило - суммарный размер всех полей структуры не должен превышать 16 байт.. в противном случае никакой выгоды ты не получишь!
2. Хранить данные лучше всего в типизированном List'e либо в коллекции.. это намного удобней обычного массива
3. FileOpen - это извращение! В NET надо использовать специализированные классы для ввода/вывода. Все они расположены в пространстве имен System.IO.File (В MSDN найдешь массу примеров)
4. Хранить содержимое твоей коллекции смесей лучше всего в Xml - файле. В NET для этого предусмотрены всевозможные форматтеры: BinaryFormatter, XmlFormatter & etc
 
з.ы. Если все сделаешь верно, то отпадет необходимость во всяких EOF, динамических массивах и прочих "извращениях" взятых из VB6

Ответить

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #10 Добавлено: 04.10.08 16:29
1) Не используй эту модель (которая от VB6 осталась) - ничего хорошего ты с ней не сделаешь.
2) Динамческий массив тебе не нужен, используй List, иначе запаришься с добавлением/удалением записей из середины
3) Зачем делаешь структуру? Делай класс, структуры в .NET работают не совсе так как ты можешь ожидать, их нужно использовать только когда на 100% уверен что ты делаешь и что тебе нужен именно структурный тип.
4) Рассмотри варианты с сохранением в XML, сериализацией.

Ответить

Номер ответа: 11
Автор ответа:
 



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

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #11
Добавлено: 05.10.08 00:18
Он не поймет как читать файл, а ты про сериализацию...

Ответить

Номер ответа: 12
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #12 Добавлено: 05.10.08 00:39
  1. <Serializable()> Public Class MilkComponent
  2.  
  3.     Private _name As String
  4.     Private _Protein As Single
  5.     Private _Fat As Single
  6.     Private _glucose As Single
  7.     Private _energy As Single
  8.  
  9.     Sub New(ByVal name As String, ByVal prot As Single, ByVal fat As Single, ByVal gluc As Single, ByVal en As Single)
  10.         _name = name
  11.         _Protein = prot
  12.         _Fat = fat
  13.         _glucose = gluc
  14.         _energy = en
  15.     End Sub
  16.  
  17.     Public Property Name() As String
  18.         Get
  19.             Return _name
  20.         End Get
  21.         Set(ByVal value As String)
  22.             _name = value
  23.         End Set
  24.     End Property
  25.  
  26.     Public Property Protein() As String
  27.         Get
  28.             Return _Protein
  29.         End Get
  30.         Set(ByVal value As String)
  31.             _Protein = value
  32.         End Set
  33.     End Property
  34.  
  35.     Public Property Fat() As String
  36.         Get
  37.             Return _Fat
  38.         End Get
  39.         Set(ByVal value As String)
  40.             _Fat = value
  41.         End Set
  42.     End Property
  43.  
  44.     Public Property Glucose() As String
  45.         Get
  46.             Return _glucose
  47.         End Get
  48.         Set(ByVal value As String)
  49.             _glucose = value
  50.         End Set
  51.     End Property
  52.  
  53.     Public Property Energy() As String
  54.         Get
  55.             Return _energy
  56.         End Get
  57.         Set(ByVal value As String)
  58.             _energy = value
  59.         End Set
  60.     End Property
  61.  
  62.     Public Function ToArray() As Generic.List(Of String)
  63.         Dim l As New Generic.List(Of String)
  64.         l.Add(_name)
  65.         l.Add(_Protein)
  66.         l.Add(_Fat)
  67.         l.Add(_glucose)
  68.         l.Add(_energy)
  69.         Return l
  70.     End Function
  71.  
  72. End Class



  1. Imports System.IO
  2.  
  3. <Serializable()> Public Class MilkMixerDataBase
  4.     Implements IEnumerable(Of MilkComponent)
  5.  
  6.     Private L As Generic.List(Of MilkComponent)
  7.  
  8.     Public Sub Add(ByVal n As String, ByVal p As Single, ByVal f As Single, ByVal g As Single, ByVal en As Single)
  9.         L.Add(New MilkComponent(n, p, f, g, en))
  10.     End Sub
  11.  
  12.     Public ReadOnly Property Count() As Integer
  13.         Get
  14.             Return L.Count
  15.         End Get
  16.     End Property
  17.  
  18.     Function GetMilkComponent(ByVal index As Integer) As Generic.List(Of String)
  19.         Dim row As MilkComponent = L(index)
  20.         Return row.ToArray
  21.     End Function
  22.  
  23.     Public Sub DeleteMilkComponent(ByVal index As Integer)
  24.         L.RemoveAt(index)
  25.     End Sub
  26.  
  27.     Public Sub Save(ByVal fileName As String)
  28.         Dim FS As New FileStream(fileName, FileMode.OpenOrCreate)
  29.         Dim BF As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
  30.             BF.Serialize(FS, Me)
  31.             FS.Flush()
  32.             FS.Close()
  33.     End Sub
  34.  
  35.     Public Shared Function LoadDataBase(ByVal fileName As String) As MilkMixerDataBase
  36.         Dim db As MilkMixerDataBase = Nothing
  37.         Dim FS As New FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)
  38.         Dim BF As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
  39.         db = BF.Deserialize(FS)
  40.         FS.Close()
  41.         Return db
  42.     End Function
  43.  
  44.  
  45.     Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of MilkComponent) Implements System.Collections.Generic.IEnumerable(Of MilkComponent).GetEnumerator
  46.         Return L.GetEnumerator
  47.     End Function
  48.  
  49.     Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
  50.         Return L.GetEnumerator
  51.     End Function
  52. End Class



Ну, а как обьявить Базу Данных, накормить, использовать, догадайся сам.

Ответить

Номер ответа: 13
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #13 Добавлено: 05.10.08 00:54
Упс ОПЕЧАТКА

Замени
  1. Private L as Generic.List(Of MilkComponent)

на
  1. Private L as New Generic.List(Of MilkComponent)

Ответить

Номер ответа: 14
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #14 Добавлено: 05.10.08 09:15
BG(Алексей) зачот! Но если позволите, маленькая рекомендация по архитектуре..
Свойство Energy является вычисляемым и правильней было бы его сделать с аттрибутом ReadOnly и все вычиления производить в этом свойстве исходя из состоянии внутренних полей. Это позволит убрать эти вычисления из конструктора и кода приложения и перенести на уровень класса.
Если же энергетическая ценность у разных продуктов вычисляется по разной формуле то корректней было бы создать базовый класс с переопределяемым методом Energy, и все смеси, либо какие то другие продукты, наследовать от этого класса.

Ответить

Номер ответа: 15
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #15 Добавлено: 05.10.08 09:21
И еще одна странность в коде.. Закрытые переменные объявлены как Single , а свойства почему-то String. Невнимательность? Опечатка? Или просто косяк? :)

Ответить

Страница: 1 | 2 |

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



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