Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/32: Рейтинг темы: голосов - 32, средняя оценка - 4.53
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
1

Запись/чтение структур из файла с произвольным доступом

12.05.2011, 14:33. Показов 5780. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Возникла проблема. Необходимо реализовать чтение и запись структур в файл с произвольным доступом.

Создал структуру:
VB.NET
1
2
3
4
5
6
7
Structure zapis
Dim naimen As String
Dim proizvod As String
Dim strana As String
Dim harakter As String
Dim price As String
End Structure
Сделал процедуру записи:
VB.NET
1
2
3
4
5
6
7
8
9
Private Sub ****
 
FileOpen(1,"путь",OpenMode.Random)
Dim z as zapis
'заполнил все поля 
Fileput(1, z)
Fileclose(1)
 
End Sub
Косяк собственно в том, что запись z имеет непостоянный размер из-за динамического размера строк. Из-за этого не могу сделать ни чтение, ни запись(не знаю, под каким номером нужно записывать новую запись).

Как сделать размер строк фиксированным? Допустим 100 символов.

Всем заранее спасибо за помощь!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2011, 14:33
Ответы с готовыми решениями:

Чтение данных из файла, запись в массив структур
Всем привет, помогите, пожалуйста, с программой. Суть такова: имеется файл вида нужно...

Сделать переход на страницу с произвольным номером и сохранение и чтение из файла
Здравствуйте, кто может сделать переход на страницу с произвольным номером и сохранение и чтение из...

ОЗУ с произвольным доступом
Доброго времени суток! Что значит с произвольным доступом и что значит слово оперативное это...

Фаил с произвольным доступом
/* Создание файла с произвольным доступом, инициализация файла пустой структурой */ #include...

12
753 / 552 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
12.05.2011, 16:15 2
Цитата Сообщение от PbICbK Посмотреть сообщение
Dim z as zapis
Надо объявить массив размерности структуры.
VB.NET
1
2
3
4
5
6
7
Dim z(5) As zapis
'заполнил все поля 
FileOpen(1, "путь", OpenMode.Random)
        For I As Integer = 1 To 5
            FilePut(1, z(I))
        Next
        FileClose(1)
1
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
12.05.2011, 16:53  [ТС] 3
gitarillo, огромное спасибо! А можете вкратце объяснить, почему так? И как тогда заносить данные? Ранее было: z.naimen="значение". А теперь?
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
12.05.2011, 16:59 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Как вариант. Взамен доисторическим FileOpen и т.д. которые использовались в VB6.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Imports System.IO
Imports System.Runtime.InteropServices
 
Namespace VBConsoleApplication1
    Module Module1
        <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode, Pack:=1)> _
        Class DATA
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=100)> _
            Public naimen As String
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=100)> _
            Public proizvod As String
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=100)> _
            Public strana As String
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=100)> _
            Public harakter As String
            <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=100)> _
            Public price As String
        End Class
 
        Sub Main(args As String())
            Dim data As New DATA()
            data.naimen = "1"
            data.harakter = "1"
            data.price = "1"
            data.proizvod = "1"
            ' Запись
            Using fs As FileStream = File.Open("data.txt", FileMode.Create)
                fs.Write(GetBytes(data), 0, Marshal.SizeOf(data))
                fs.Flush()
            End Using
            ' Чтение
            Using fs As FileStream = File.Open("data.txt", FileMode.Open)
                Dim buff As Byte() = New Byte(Marshal.SizeOf(data) - 1) {}
                fs.Read(buff, 0, buff.Length)
                WriteBytes(data, buff)
            End Using
        End Sub
        ''' <summary>
        ''' Перевод объекта в байтовый массив.
        ''' </summary>
        ''' <param name="data">Объект.</param>
        Function GetBytes(data As Object) As Byte()
            Dim buff As Byte() = New Byte(Marshal.SizeOf(data) - 1) {}
            Dim pMem As IntPtr = Marshal.AllocHGlobal(buff.Length)
 
            Marshal.StructureToPtr(data, pMem, False)
            Marshal.Copy(pMem, buff, 0, buff.Length)
            Marshal.FreeHGlobal(pMem)
 
            Return buff
        End Function
        ''' <summary>
        ''' Запись байтового массива по адресу памяти, по которому расположен объект.
        ''' </summary>
        ''' <param name="data">Объект.</param>
        ''' <param name="buffer">Байтовый массив.</param>
        ''' <remarks></remarks>
        Sub WriteBytes(data As Object, buffer As Byte())
            If Marshal.SizeOf(data) < buffer.Length Then
                Throw New ArgumentOutOfRangeException("buffer length")
            End If
 
            Dim pMem As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(data))
 
            Marshal.StructureToPtr(data, pMem, True)
            Marshal.Copy(buffer, 0, pMem, buffer.Length)
            Marshal.PtrToStructure(pMem, data)
            Marshal.FreeHGlobal(pMem)
        End Sub
    End Module
End Namespace
2
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
12.05.2011, 17:00  [ТС] 5
SSTREGG, мне это нужно, чтобы сдать лабораторку. Доисторические filopen итд проще будет пожалуй) Но всё равно спасибо!
0
753 / 552 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
12.05.2011, 17:44 6
Цитата Сообщение от PbICbK Посмотреть сообщение
И как тогда заносить данные?
VB.NET
1
2
3
z(<номер записи>).naimen = <значение>
z(<номер записи>).proizvod = <значение>
'..........................
И так далее.
0
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
12.05.2011, 19:40  [ТС] 7
Ну это получается мы просто создали массив записей и всё. Мне надо, чтобы запись имела фиксированный размер (допустим 1024 байта), тогда имея размер файла я смогу посчитать количество уже имеющихся записей, чтобы добавить ещё одну (если записей 7, укажу номер для новой записи - 8).
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
12.05.2011, 20:19 8
PbICbK, можно при чтении с файла структур узнать их количество.
или при вводе значений можно задать валидацию на размер вводимых данных
1
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
12.05.2011, 20:58  [ТС] 9
можно при чтении с файла структур узнать их количество.
Каким образом?

Я хотел:

VB.NET
1
kolvo=lof(1)/len(z) 'Размер файла делить на размер записи
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
12.05.2011, 21:12 10
примерно так
VB.NET
1
2
3
4
5
6
7
8
9
10
11
Dim file As String = OpenFileDialog1.FileName
            FileOpen(1, file, OpenMode.Random)
            While Not EOF(1)
                ReDim Preserve zapis(i)
                FileGet(1, zapis(i))
                i = i + 1
            End While
 
            FileClose(1)
        
        h = i - 1
В итоге на выходе получаем массив записей zapis и число записей - h
1
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
12.05.2011, 21:18  [ТС] 11
Во, огромное спасибо! А если в конец нужно будет добавить 1 запись, то:
VB.NET
1
Fileput(1, zapis,h+1)
Верно?
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
12.05.2011, 21:25 12
По идее так, попробуй экспериментальным путем
0
1 / 1 / 0
Регистрация: 21.04.2011
Сообщений: 30
12.05.2011, 21:26  [ТС] 13
Ок, большое спасибо ещё раз!
0
12.05.2011, 21:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2011, 21:26
Помогаю со студенческими работами здесь

Файлы с произвольным доступом
Столкнулся со следующем проблемой: при записи данных в файл произвольного доступа и при последующем...

Файлы с произвольным доступом данных
27 номер задачи, извините нету возможности обрезать.

калькулятор в 1С с произвольным доступом к элементам
Большое здравствуйте!Знающие люди, подскажите пожалуйста,как можно решить в 1С вот такую задачу:...

Текстовый файл с произвольным доступом
Прошу подсказку ) Имеется текстовый файл большого размера, который нельзя загрузить весь в...

Динамический массив с произвольным доступом
Здравствуйте. Проблема заключается в следующем. Имеется массив целых чисел InputArr, выполняется...

Файлы данных с произвольным доступом в Pascal
Имеются данные о наименовании товара его кол-ва на складе,цене,и количестве проданного товара....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru