Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2011, 14:25   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вы, видимо, не так поняли.
Да уж... Трудно понять того кто сам не оч. понимает что хочет...
А SNUPY между прочим дело говорит. Структуры в текстовые файлы сохранять не удобно. Так что ты определись что тебе нужно.
Если посчитаешь это флудом то вот тебе конструктив: Сохраняй то что в StringList в текстовый файл, а то что в Array of Record в другой методом SNUPY, не забыв образмерить или финализировать строки в записи. не смешивай все в кучу - пожалеешь

Удачи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.01.2011, 22:32   #12
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

Цитата:
Сообщение от SNUPY Посмотреть сообщение
^__^ помниться можно делать так f: file of Struct.... но он будет ругаться т.к. ему подавай статические массивы, т.е. для string надо будет зафиксировать размер...
Спасибо, но у меня все объявлено, компилируется и работает.
Цитата:
Сообщение от Stilet Посмотреть сообщение
Сохраняй то что в StringList в текстовый файл, а то что в Array of Record в другой методом SNUPY, не забыв образмерить или финализировать строки в записи. не смешивай все в кучу - пожалеешь

Удачи.
Как вариант решения, спасибо.
JoLan вне форума Ответить с цитированием
Старый 15.01.2011, 23:45   #13
cosmic_call
Пользователь
 
Аватар для cosmic_call
 
Регистрация: 15.01.2011
Сообщений: 18
По умолчанию

Я тоже не совсем понял. Но если речь идет о том чтобы записать и считать из файла разные структуры данных да еще и которые динамические то это ведь все реализуется с помощью потоков TFileStream.
cosmic_call вне форума Ответить с цитированием
Старый 16.01.2011, 14:49   #14
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

Такое чувство, что не читаете заголовок темы. Я и хочу сохранить в файл обе структуры с помощью потока, только не знаю как.
JoLan вне форума Ответить с цитированием
Старый 16.01.2011, 18:55   #15
cosmic_call
Пользователь
 
Аватар для cosmic_call
 
Регистрация: 15.01.2011
Сообщений: 18
По умолчанию

нет заголовок я прочел. я про то что не особо вник в сами структуры.

можно ведь в файл записать например последовательно
1.кол-во строк
2. строки
3. размеры структуры или тоже там какие то количества этих записей
4. сами записи

а потом последовательно читаете из файла сначала количество потом создаете такие же структуры по размеру и дальше уже считываете саму структуру. если очень постараться то в целях экономии обема можно в файл писать длину каждой строки например и считывать все построчно. думаю если сделать это все грамотно и структурировано все должно ведь получится
cosmic_call вне форума Ответить с цитированием
Старый 16.01.2011, 22:36   #16
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

В этом-то и вопрос: как записать? Хотя бы маленький пример, который натолкнет на остальное решение.
JoLan вне форума Ответить с цитированием
Старый 17.01.2011, 00:34   #17
cosmic_call
Пользователь
 
Аватар для cosmic_call
 
Регистрация: 15.01.2011
Сообщений: 18
По умолчанию

ну вот
объявил вот произвольную запись в программе
Код:
type
  Rec = record
    a:integer;
    b:string[20];
    cc:boolean;
вот процедура например где есть стринглист и массив этих записей и я его записываю в файл:
Код:
var Stream:TFileStream;
    RecArr: array of Rec;
    StrList: TStringList;
    RecCnt, StrCnt: integer;
    Str:string[20];
    i:integer;
begin

//заполняю структуру какой нибудь информацией для примера

StrList:=TStringList.Create;
StrList.Add('ertertret');
StrList.Add('erdsfdsf');
StrList.Add('eqweqweeeeeeqweqwt');
StrList.Add('ertersdsdasdaset');

//пусть будет пять строк и например 2 записи

RecCnt:=2;
SetLength(RecArr, RecCnt);
RecArr[0].a:=54;
RecArr[0].b:='fewfewf';
RecArr[0].cc:=false;
RecArr[1].a:=454;
RecArr[1].b:='4teffewf';
RecArr[1].cc:=false;

//создаю поток для записи
Stream:=TFileStream.Create('c:\lalala.ini', fmOpenWrite or fmCreate);
Stream.Seek(0, soFromBeginning); //указатель в начало
//считаю кол-во строк и записываю их в файл
StrCnt:=StrList.Count;
Stream.Write(strCnt, sizeof(integer));
//вытягиваю строки из тстринглист в обычный массив строк
for i:=0 to StrCnt - 1 do begin
  Str:=StrList.Strings[i];
  //и записываю в файл сами строки
  Stream.Write(Str, 20) end;


//записываю кол-во записей
Stream.Write(RecCnt, sizeof(integer));
//и сами записи
for i:=0 to RecCnt - 1 do Stream.Write(RecArr[i], sizeof(Rec));
//закрываю поток
Stream.Free;
end;
теперь аналогично только все обратно - читаю из файла то же самое не зная заранее сколько там строк и сколько записей в массиве - это все содержится в самом файле

Код:
procedure TForm1.Button2Click(Sender: TObject);
var Stream:TFileStream;
    StrList: TStringList;
    RecCnt, StrCnt: integer;
    RecArr: array of Rec;
    Str:string[20];
    i:integer;
begin
//создаю поток для чтения
Stream:=TFileStream.Create('c:\lalala.ini', fmOpenRead);
Stream.Seek(0, soFromBeginning); //указатель в начало
//читаю из файла кол-во строк
Stream.Read(strCnt, sizeof(integer));
//читаю из файла массив строк и перевожу массив строк в стринглист
StrList:=TStringList.Create;
for i:=0 to StrCnt - 1 do begin
  Stream.Read(Str, 20);
  StrList.Add(Str[i]) end;
//читаю кол-во записей
Stream.Read(RecCnt, sizeof(integer));
//и сами записи
SetLength(RecArr, RecCnt);
for i:=0 to RecCnt - 1 do Stream.Read(RecArr[i], sizeof(Rec));
//закрываю поток
Stream.Free;
end;
вроде ничего сложного - единственное, что, как видите, пришлось поставить ограничение на строку в 20 символов. можно поставить больше с запасом - просто в файл будут писаться пробелы. но лучше всего (и тоже не сложно) усовершенствовать механизм и перед каждой строкой писать еще и ее длину. тогда файл будет оптимальной длины.
cosmic_call вне форума Ответить с цитированием
Старый 17.01.2011, 10:02   #18
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

Спасибо огромное, именно то, что нужно
P.S. А если вписать "4" вместо "sizeof(integer)" быстрей не будет?
JoLan вне форума Ответить с цитированием
Старый 17.01.2011, 11:15   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
быстрей не будет?
Нет. Быстрей не будет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FileStream Read и массив байтов bondik Общие вопросы .NET 5 06.10.2010 22:36
Проблемы с FileStream Gauss Общие вопросы .NET 10 13.09.2010 17:16
В чём различие записей Record от Packed Record? Terran Общие вопросы Delphi 7 08.06.2010 17:14
Record / Packed Record Alex Cones Общие вопросы Delphi 7 11.11.2009 10:43
FileStream ryton Общие вопросы Delphi 9 26.05.2008 13:53