Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] сохранить элементы массива и потом загрузить обратно (http://forum.oszone.net/showthread.php?t=294866)

matyash 02-02-2015 15:31 2465246

сохранить элементы массива и потом загрузить обратно
 
помогите разобраться с прогой, есть две формы связанные одним глобальным массивом, так вот на одной форме мы к примеру в текстбоксах пишем некие суммы и надо чтоб это сохранялось в массив потом при новом запуске проги, вторая форма уже использовала этот сохраненный массив ;)

Iska 02-02-2015 16:48 2465301

Пишете в файл. При запуске ищете этот файл и загружаете из него данные.

matyash 02-02-2015 17:03 2465311

я тут по искал в инете http://www.cyberforum.ru/vb-net/thread1233719.html, сохраняет в файл, но вот почему то не получается сохранить данные типа double

Iska 02-02-2015 17:23 2465319

matyash, у Вас VB, VBA или VB.Net? Массив содержит данные одного типа или нескольких?

matyash 02-02-2015 17:50 2465339

VB.Net одного Double

Iska 02-02-2015 23:05 2465468

Можете, например, попробовать так:
Скрытый текст
Код:

Imports System.IO

Module Module1
    Sub Main()
        Dim aArrayOfDoubles() = New Double() {1, 2, 3, 4, 5}
        Dim elem As Double

        Dim sSourceFile As String = "c:\MyArray.bin"
        Dim oFileStream As New System.IO.FileStream(sSourceFile, IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
        Dim oBinaryWriter As New System.IO.BinaryWriter(oFileStream)

        For Each elem In aArrayOfDoubles
            oBinaryWriter.Write(elem)
        Next

        oBinaryWriter.Close()
        oFileStream.Close()



        Dim oFileStream2 As New System.IO.FileStream(sSourceFile, IO.FileMode.Open, IO.FileAccess.Read)
        Dim oBinaryReader As New System.IO.BinaryReader(oFileStream2)

        Try
            Do
                Console.WriteLine(oBinaryReader.ReadDouble())
            Loop
        Catch ex As EndOfStreamException
            ' Nothing to do
        Finally
            oBinaryReader.Close()
        End Try

        oFileStream2.Close()
    End Sub
End Module


Первая часть кода сохраняет значения массива double() в файл, вторая — читает значения double из файла.

matyash 03-02-2015 20:55 2465944

спасибо попробую, а если не сложно можно закомментировать данный код, чтобы не тупо скатать, а понять и запомнить на будущее :)

matyash 03-02-2015 21:24 2465963

не выходит:
у меня массив public:

вот форма 1

Код:

Public Class Form1
    Dim sum As Double

    Private Sub Button40_Click(sender As Object, e As EventArgs) Handles Button40.Click
        Form2.Show()
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        TextBox1.Text = TextBox1.Text & "мясной - " & Convert.ToString(costs(1)) & vbCrLf
        sum = sum + costs(1)
        TextBox2.Text = Convert.ToString(sum)
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox1.Text = TextBox1.Text & "элегия - " & Convert.ToString(costs(0)) & vbCrLf
        sum = sum + costs(0)
        TextBox2.Text = Convert.ToString(sum)
    End Sub

    Private Sub Button39_Click(sender As Object, e As EventArgs) Handles Button39.Click
        TextBox1.Clear()
        TextBox2.Clear()
        sum = 0
    End Sub


модуль

Код:

Module Module1
    Public costs() As Double = {12, 23}

End Module



форма 2


Код:

Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
        If TextBox2.Text <> "" Then
            costs(1) = Convert.ToDouble(TextBox2.Text)
        Else
            costs(1) = costs(1)
        End If
    End Sub
    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        If TextBox1.Text <> "" Then
            costs(0) = Convert.ToDouble(TextBox1.Text)
        Else
            costs(0) = costs(0)
        End If


Iska 04-02-2015 21:08 2466462

Цитата:

Цитата matyash
можно закомментировать данный код »

Скрытый текст
Код:

' Импортируем библиотеку
Imports System.IO

Module Module1
    Sub Main()
        ' Первая часть марлезонского балета
       
        ' Создаём массив типа Double из пяти элементов
        Dim aArrayOfDoubles() = New Double() {1, 2, 3, 4, 5}
        ' Переменная того же типа
        Dim elem As Double

        ' Путь к целевому файлу
        Dim sSourceFile As String = "c:\MyArray.bin"
        ' Открываем файловый поток для вышеуказанного файла
        Dim oFileStream As New System.IO.FileStream(sSourceFile, IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
        ' Создаём объект для двоичной записи в вышеприведённый поток
        Dim oBinaryWriter As New System.IO.BinaryWriter(oFileStream)

        ' Для каждого элемента массива...
        For Each elem In aArrayOfDoubles
            ' ...выполняем запись его значения в поток
            oBinaryWriter.Write(elem)
        Next

        ' Закрываем объект
        oBinaryWriter.Close()
        ' Закрываем поток
        oFileStream.Close()
        ' На этом первая часть завершена - данные из массива записаны в файл.
        ' Длина файла - размер массива*8 байт.


        ' Вторая часть марлезонского балета

        ' Открываем файловый поток для вышеуказанного файла
        Dim oFileStream2 As New System.IO.FileStream(sSourceFile, IO.FileMode.Open, IO.FileAccess.Read)
        ' Создаём объект для двоичной записи в вышеприведённый поток
        Dim oBinaryReader As New System.IO.BinaryReader(oFileStream2)

        ' Пытаемся...
        Try
            Do
                ' ...читать из файла по одному значению типа Double (по восемь байт)...
                Console.WriteLine(oBinaryReader.ReadDouble())
            Loop ' ...в бесконечном цикле
        ' ...как только попытаемся читать за концом файла - попадём сюда...
        Catch ex As EndOfStreamException
            ' Nothing to do
        ' ... и, наконец, сюда
        Finally
            ' Закрываем объект
            oBinaryReader.Close()
        End Try
       
        ' Закрываем поток
        oFileStream2.Close()
    End Sub
End Module


Замечания:
  • Я в коде при чтении просто вывожу прочитанные значения на консоль. Вы же можете использовать их по назначению — заполнять массив, сразу заполнять значения полей форме и т.п., что именно Вам потребно.
  • Я в коде продемонстрировал подход, когда мы заранее рассчитываем количество данных, которые будут считаны из в файла. Вы можете использовать иную, старую добрую C-шную технику: получить размер файла в байтах, разделить его на размер в байтах типа «Double()», получив количество сохранённых в нём отдельных данных. Затем просто прочитать уже известное количество данных по «for i=0 to «количество сохранённых в нём отдельных данных» - 1 : ….ReadDouble() : next».

matyash 05-02-2015 08:43 2466583

спасибо вам;)


Время: 16:10.

Время: 16:10.
© OSzone.net 2001-