Страница: 1 | 2 |
|
Вопрос: типизированные файлы. количество записей?
|
Добавлено: 03.10.08 17:36
|
|
Автор вопроса: DimDoc
|
как узнать количество записей в типизированом файле для дальнейшего присвоения этого значения динамическому массиву?
функция EOF(1) в следующем цикле входит в бесконечный цикл
Do While Not EOF(1)
i +=1
Loop
Ответить
|
Номер ответа: 3 Автор ответа: DimDoc
Вопросов: 21 Ответов: 104
|
Профиль | | #3
|
Добавлено: 04.10.08 13:24
|
Сейчас попробую показать на примере, что нужно сделать....
В моей программе пользователь может выбрать из ComboBox одну из молочных смесей, а программа произведёт необходимые расчёты.
объявляю структуру:
-
- Structure Milk_Mix
- Dim name As String
- Dim Protein As Single
- Dim Fat As Single
- Dim glucose As Single
- Dim energy As Single
- End Structure
Для хранения данных о смесях создаю массив:
ввожу данные о смесях:
-
- mix(1).name = "Хумана" : mix(2).name = "Фрисопре"
- mix(1).Protein = 1.5 : mix(2).Protein = 1.2
- mix(1).Fat = 3.5 : mix(2).Fat = 3.3
- mix(1).glucose = 7.5 : mix(2).glucose = 6.5
- mix(1).energy = mix(1).Protein * 4 + mix(1).Fat * 9.3 + mix(1).glucose * 3.4
- mix(2).energy = mix(2).Protein * 4 + mix(2).Fat * 9.3 + mix(2).glucose * 3.4
и сохраняю в типизированный файл:
-
- FileOpen(1, "D:\Visual Studio 2008\Projects\MilkMix\MilkMix\My Project\milk.mrf", OpenMode.Random)
- Dim i As Integer
- For i = 1 To mix.Count - 1
- FilePut(1, mix(i))
- Next i
далее. в процедуре form1_Load : считываю из файла данные о смеси и одновременно добавляю их в cboMIxName
-
- FileOpen(1, "D:\Visual Studio 2008\Projects\MilkMix\MilkMix\My Project\milk.mrf", OpenMode.Random)
- Dim i As Integer
- For i = 1 To mix.Count - 1
- FileGet(1, mix(i))
- cboMIxName.Items.Add(mix(i).name)
- Next i
- FileClose(1)
Ну вот и всё....
Здесь показан принцип.Реально в проге хранятся данные о десятках смесей. Всё бы ничего... вполне работоспособно. До поры, до времени...
И вот в один прекрасный день пользователю поступает новая смесь, а несколько старых сняты с производства.
Теперь ясно, что нужно дать пользователю возможность самому вводить данные о смесях.
Для этого хорошо подойдёт динамический массив
теперь необходимо при загрузке формы определять размер массива
но это возможно только если заранее получить число строк (icount) в файле milk.mrf
поэтому я и пробовал посчитать icount в цикле
-
- Do While Not EOF(1)
- iсount +=1
- Loop
но этот цикл не находит конца файла и становится бесконечным.
Кстати, откуда я взял, что EOF может подойти?
Процетирую автора книги, по которой сейчас учу VB .net
Для работы с типизированными файлами мне показалось проще применять не модель .NET System.IO, методами которой мы пользовались для работы с текстовыми файлами, а процедуры модуля FileSystem пространства имён Microsoft.VisualBasic, доставшиеся в наследство от Visual Basic 6.0
С.Н.Лукин, "Понятно о Visual Basic .NET", 2005
Вообщем, проблему решить удалось, но както сильно коряво (мне так самому кажется), поэтому сейчас о решении писать не буду.
Прошу Вас помочь мне. Если, конечно я понятно изложил задачу...
С Уважением,
DimDoc
Ответить
|
Номер ответа: 5 Автор ответа: DimDoc
Вопросов: 21 Ответов: 104
|
Профиль | | #5
|
Добавлено: 04.10.08 14:17
|
структура, сохранённая в типизированном файле является базой данных.
Не требует наличия на компе юзера других приложений типа Access.
Ответить
|
Номер ответа: 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 не неспособна читать весь отчет.
как это по русски правильно понять?
Ответить
|
Номер ответа: 12 Автор ответа: BG(Алексей)
Вопросов: 26 Ответов: 295
|
Профиль | | #12
|
Добавлено: 05.10.08 00:39
|
- <Serializable()> Public Class MilkComponent
-
- Private _name As String
- Private _Protein As Single
- Private _Fat As Single
- Private _glucose As Single
- Private _energy As Single
-
- Sub New(ByVal name As String, ByVal prot As Single, ByVal fat As Single, ByVal gluc As Single, ByVal en As Single)
- _name = name
- _Protein = prot
- _Fat = fat
- _glucose = gluc
- _energy = en
- End Sub
-
- Public Property Name() As String
- Get
- Return _name
- End Get
- Set(ByVal value As String)
- _name = value
- End Set
- End Property
-
- Public Property Protein() As String
- Get
- Return _Protein
- End Get
- Set(ByVal value As String)
- _Protein = value
- End Set
- End Property
-
- Public Property Fat() As String
- Get
- Return _Fat
- End Get
- Set(ByVal value As String)
- _Fat = value
- End Set
- End Property
-
- Public Property Glucose() As String
- Get
- Return _glucose
- End Get
- Set(ByVal value As String)
- _glucose = value
- End Set
- End Property
-
- Public Property Energy() As String
- Get
- Return _energy
- End Get
- Set(ByVal value As String)
- _energy = value
- End Set
- End Property
-
- Public Function ToArray() As Generic.List(Of String)
- Dim l As New Generic.List(Of String)
- l.Add(_name)
- l.Add(_Protein)
- l.Add(_Fat)
- l.Add(_glucose)
- l.Add(_energy)
- Return l
- End Function
-
- End Class
- Imports System.IO
-
- <Serializable()> Public Class MilkMixerDataBase
- Implements IEnumerable(Of MilkComponent)
-
- Private L As Generic.List(Of MilkComponent)
-
- Public Sub Add(ByVal n As String, ByVal p As Single, ByVal f As Single, ByVal g As Single, ByVal en As Single)
- L.Add(New MilkComponent(n, p, f, g, en))
- End Sub
-
- Public ReadOnly Property Count() As Integer
- Get
- Return L.Count
- End Get
- End Property
-
- Function GetMilkComponent(ByVal index As Integer) As Generic.List(Of String)
- Dim row As MilkComponent = L(index)
- Return row.ToArray
- End Function
-
- Public Sub DeleteMilkComponent(ByVal index As Integer)
- L.RemoveAt(index)
- End Sub
-
- Public Sub Save(ByVal fileName As String)
- Dim FS As New FileStream(fileName, FileMode.OpenOrCreate)
- Dim BF As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
- BF.Serialize(FS, Me)
- FS.Flush()
- FS.Close()
- End Sub
-
- Public Shared Function LoadDataBase(ByVal fileName As String) As MilkMixerDataBase
- Dim db As MilkMixerDataBase = Nothing
- Dim FS As New FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)
- Dim BF As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
- db = BF.Deserialize(FS)
- FS.Close()
- Return db
- End Function
-
-
- Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of MilkComponent) Implements System.Collections.Generic.IEnumerable(Of MilkComponent).GetEnumerator
- Return L.GetEnumerator
- End Function
-
- Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
- Return L.GetEnumerator
- End Function
- End Class
Ну, а как обьявить Базу Данных, накормить, использовать, догадайся сам.
Ответить
|
Страница: 1 | 2 |
Поиск по форуму