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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2010, 22:23   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Записать несколько одинаковых типов в один файл

Всем доброго времени суток!

Вопрос:
Допустим есть:
Код:
Type
  Tsmth= packed record
  Name:string;
  Author:string;
  4islo:integer;
  blabla:TdateTime;
   end;
как данный тип записать несколько раз подряд в один файл, но каждый раз в структуре разные значения?

Человек_Борща вне форума Ответить с цитированием
Старый 21.12.2010, 05:55   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ручками.
Я бы использовал TFileStream.
Сто раз курил эту шнягу, ничего универсального придумать не смог. Выдрать инфу можно только из свойств объектов (RTTI). Поля - это темная лошадка.
Sibedir вне форума Ответить с цитированием
Старый 21.12.2010, 09:02   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) я бы крайне настоятельно рекомендовал packed убрать и вместо string использовать string[Длина]
Код:
Tsmth= record
  Name:string[90];
  Author:string[90];
...
2)
Цитата:
как данный тип записать несколько раз подряд в один файл, но каждый раз в структуре разные значения?
Это как?!!! o_O !

var f : file of Tsmth;

записываете одно.
А потом каждый раз при чтении получаете РАЗНЫЕ значения?
Так НЕ ДОЛЖНО БЫТЬ!
Или Вы внутри файла по F3 (в HEX) смотрите, и там разный мусор видите?
Так это правильно. В начале строки пишется её длина, после этого в оставшейся памяти может быть всё что угодно (мусор), но это никак не влияет на чтение записей из файла!

3) в принципе, согласен с Sibedir - если условия задачи позволяют - то лучше использовать TFileStream
впрочем, тут от конкретных условия задачи многое зависит. У типизированных файлов есть много преимуществ...


p.s. перечитал тему... А что значит - несколько типов в один файл? может я неправильно понял, что Вам надо?!

Последний раз редактировалось Serge_Bliznykov; 21.12.2010 в 09:06.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.12.2010, 15:08   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

такое только руками, как сохранять string в файл я показывал не один раз.

напиши один раз процедуру сохранения и пользуйся на здоровье.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.12.2010, 18:37   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
p.s. перечитал тему... А что значит - несколько типов в один файл? может я неправильно понял, что Вам надо?!
Допустим я знаю что нужно использовать TfileStram для этого. Проблема вот в чем, допустим у нас есть заполненная структура разными данными:
Код:
type
Tsmth = record
Name:string[255]; //Петр
Author:string[150]; //Пётр Васильков
end;
и

Код:
type
Tsmth = record
Name:string[255]; //Женя
Author:string[150]; //Женя Борецкий
end;

Можно конечно создавать jenya.dat и petr.dat записав в каждый файл, данный тип но с разными данными. Но я ищу способ по проще, а именно забить все в один файл.
Человек_Борща вне форума Ответить с цитированием
Старый 21.12.2010, 18:42   #6
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Можно конечно создавать jenya.dat и petr.dat записав в каждый файл, данный тип но с разными данными. Но я ищу способ по проще, а именно забить все в один файл.
Так уже ответили на вопрос.
_Engine_ вне форума Ответить с цитированием
Старый 21.12.2010, 18:48   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

пиши последовательно, сначало одни данные потом другие.
(если ты вечно переоткрываешь файл(с очисткой), то естественно будут только последние данные)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.12.2010, 22:39   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Человек_Борща, у тебя не "несколько одинаковых типов", один тип и несколько переменных этого типа. Это разные вещи.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  f: file of Tsmth;
  fs: TFileStream;
  a: array of Tsmth;
  i: Integer;
  FileName: String;
begin
  // ЗАПИСЬ
  SetLength (a, 3);
  a[0].Name := '1';
  a[0].Author := '111';
  a[1].Name := '2';
  a[1].Author := '222';
  a[2].Name := '3';
  a[2].Author := '333';

  // Вариант 1
  FileName := '1.dat';
  AssignFile (f, FileName);
  Rewrite(f);
  for i := 0 to Length(a)-1 do
    Write (f, a[i]);
  CloseFile(f);

  // Вариант 2
  FileName := '2.dat';
  fs := TFileStream.Create (FileName, fmCreate);
  fs.Write (Pointer(a)^, Length(a) * SizeOf(Tsmth));
  fs.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  f: file of Tsmth;
  fs: TFileStream;
  a: array of Tsmth;
  i: Integer;
  FileName: String;
begin
  // ЧТЕНИЕ

  // Вариант 1
  FileName := '1.dat';
  AssignFile (f, FileName);
  Reset(f);
  SetLength (a, FileSize(f));
  for i := 0 to Length(a)-1 do
    Read (f, a[i]);
  CloseFile(f);

  // Вариант 2
  FileName := '2.dat';
  fs := TFileStream.Create (FileName, fmOpenRead);
  SetLength (a, (fs.Size div SizeOf(Tsmth)));
  fs.Read (Pointer(a)^, fs.Size);
  fs.Free;
end;
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Собрать несколько dbf в один Эксель файл. Elpis Microsoft Office Excel 47 16.01.2015 05:29
Как скопировать один и тот же файл сразу в несколько папок? GvR Общие вопросы Delphi 7 08.11.2013 22:32
Как правильно объединить несколько одинаковых стилей CSS в один файл? -=ButCheR=- HTML и CSS 1 30.10.2010 08:21
При переносе функций в один файл, возникает несовместимость типов.. Человек_Борща Общие вопросы Delphi 5 30.07.2010 20:08
Записать весь record в один файл Alex Cones Общие вопросы Delphi 8 29.10.2009 01:35