|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.06.2017, 13:59 | #1 | |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
Динамический массив с динамическими массивами: есть ли возможность всё это записать в файл и читать из файла?
Здравствуйте!
У меня программа работает вот с такой структурой: Код:
Догадываюсь, что string надо перевести в, например, string[255], чтобы записать его в файл. Но как записать динамический массив с динамическими массивами? Всё, на что меня хватает - это Код:
Цитата:
|
|
27.06.2017, 14:08 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
27.06.2017, 14:15 | #3 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
если вкратце, то по простому не получится.
нельзя задать File Of <ВашТип> и записать его. и string здесь самая малая из проблем (хотя суть проблемы в том же, что и с массивами, string - это указатель) если Вы попытаетесь записать TLineTrace, то в состав записи входит динамический массив Segments: TLineSegmArray; а динамический массив в структуре представлен указателем на данные (на выделенную под массив область памяти). поэтому, Вам нужно или отказываться от динамических массивов, или использовать свою структуру записи: в том месте, где нужно записать данные по указателю (String или динамический массив), в файл нужно писать размер данных в файле, после - собственно сами данные. ну и читать так же - прочитали в целочисленную переменную размер данных CurSize, сделали SetLength(S, CurSize) потом прочитали данные f.Read(s[1], CurSize); и т.д. в связи с тем, что у Вас динамические массивы вложены в динамические массивы, которые являются динамическими массивами - это будет достаточно заморочено. но реально! Цитата:
Последний раз редактировалось Serge_Bliznykov; 27.06.2017 в 14:22. |
|
27.06.2017, 14:22 | #4 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
Аватар, спасибо за пример, попробую его понять когда времени будет побольше.
Serge_Bliznykov, а какой при этом указывать тип файла? Вообще нетипизированный? |
27.06.2017, 14:36 | #5 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
либо нетипизированный, либо file of byte;
но лучше не использовать old-school стиль через файловую переменную. Используйте обёртки. Очень рекомендую - потомки от TStream, например, TFileStream. Кстати, пример от Аватар как раз с TStream и работает. |
28.06.2017, 09:26 | #6 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
По поводу примера в целом, вроде, понятно, но возникли вопросы:
1. Может кто-нибудь доходчиво объяснить что это за строка? Код:
Второй вопрос: что-то поменяется, если будет не TStream, а TFileStream, или можно просто заменить одно на другое, больше ничего не меняя в коде, типа как в некоторых случаях ничего не изменится, если TStrings заменить на TStringList? И третий: а зачем вообще нужен в подобных случаях TStream? Что с ним дальше делать? Сохранение и загрузку на данный момент для своего случая сделал через циклы и TStringList: Код:
Последний раз редактировалось Serge_Bliznykov; 28.06.2017 в 10:19. |
28.06.2017, 10:50 | #7 | ||||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
мы записываем в выходной поток (в файл) собственно данные. Это мы делаем так, получаем адрес массива X, находящегося в массиве M в i-строке j-м стролбце ([i][j].X) ( в том коде это X: TArrayOfreal; array of real) т.к. массив состоит из real - то размер памяти, который занимают данные (и который нужно записать) составляет количество * размер(real) так понятней? Цитата:
Если Вы вдруг не знакомы, ознакомьтесь с принципами ООП. Цитата:
Цитата:
Плюсы - Вы получаете текстовый файл, данные можно посмотреть и даже (очень аккуратно) подредактировать в текстовом редакторе. Минусы - большой размер (в десятки/сотни раз больше бинарного файла), низкая скорость - как записи, так и чтения, сложный и очень ненадёжный (особенно в вашей реализации) код чтения и т.д. но ещё раз повторю - Вы программист, Вам и выбирать решение, которое Вас устроит. |
||||
28.06.2017, 13:23 | #8 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
Serge_Bliznykov, спасибо за пояснения! Но:
1. Нет, не понятней. Как раз то, что Вы написали, я и понимаю. Я не понимаю, почему в этом случае на запись передаётся указатель, а не переменная (тем более, что в случае динамических массивов переменная содержит не сам массив, а указатель на него)? Особенность реализации процесса в Delphi или что-то более логичное? 2. Тут всё понятно, спасибо. 3. Из предыдущего понятно зачем TFileStream: его можно записать в файл, создать из файла. А просто TStream? Используется ли он сам по себе? Или это нечто абстрактное типа TString, TGrid, которое само по себе не используется, но используется в модифицированных вариантах (как TStringList, TStringGrid)? |
28.06.2017, 13:57 | #9 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
А где Вы увидели указатель? посмотрите, что делает ^
простите, я не понимаю, о чём Вы... по моему, это тоже АБСТРАКТНЫЙ класс, как и TStrings (кстати, если Вы посмотрите методы у TStrings, то увидите методы, которые работают с потоком: procedure LoadFromStream(Stream: TStream); virtual; procedure SaveToStream(Stream: TStream); virtual; ) Базовые классы TStream и THandleStream Цитата:
|
|
28.06.2017, 15:45 | #10 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
Цитата:
Цитата:
Это некая "структура" содержащая 1. указатель на данные 2. размерность массива(число элементов) если точнее, то указатель на нее(структуру). пока не будем вдаваться как именно она организована в "физическом" плане, поскольку это "закрыто" компилятором. Для записи в Stream нужны "чистые" данные, указатель на ИХ(данных) первый(начальный) байт.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 28.06.2017 в 15:51. |
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Файловый ввод/вывод в языке С: двоичный файл и записать в него двумерный целочисленный массив размером n*m, записать в файл F2... | Анастасия_А | Помощь студентам | 0 | 28.03.2016 14:07 |
Есть файл с текстом. Нужно записать ззадом на перед текст с файла. | vova_makr | Помощь студентам | 7 | 17.10.2015 21:26 |
Создать 3 числовых файла. Найти кол-во совпадающих элементов и записать это число в другой файл. | Astronomer | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 05.04.2014 02:55 |
Динамический массив - или всё таки не динамический? | vedro-compota | Общие вопросы C/C++ | 30 | 10.12.2010 23:22 |
Как записать в файл динамический массив. | Вадим Буренков | Общие вопросы Delphi | 9 | 24.07.2009 15:12 |