owl1n
@owl1n
fullstack developer

Как в Delphi сохранять данные в типизированный файл, а также считывать информацию из него?

Требуется сохранять данные в типизированный файл, а также считывать информацию из него.
Вот структура записи:
type
  phonebook=record
    firstname:string[255];
    lastname:string[255];
    phonenumber:string[255];
    adress:string[255];
end;

Ну и описание:
var
  Form1: TForm1;
  pb:phonebook;
  F:File of phonebook;
  i,j,n,k:integer;


Имеется сохранение в файл:
AssignFile(F, 'pbook.dat');
  Rewrite(f);
  n:=0;
    for i:=1 to StringGrid1.RowCount do
    begin
        pb.firstname:=StringGrid1.Cells[1,i];
        pb.lastname:=StringGrid1.Cells[2,i];
        pb.phonenumber:=StringGrid1.Cells[3,i];
        pb.adress:=StringGrid1.Cells[4,i];
      Write(F,pb);
      n:=n+1;
      Seek(F,n);
    end;
  CloseFile(F);


А также чтение и заполнение StrngGrid'а данными:
AssignFile(F, 'pbook.dat');
Reset(F);
n:=0;
while not eof(F) do
begin
  for i:=1 to StringGrid1.RowCount do
  begin
    with pb do
    begin
      Seek(F,n);
      Read(F,pb);
      StringGrid1.Cells[1,i]:=firstname;
      StringGrid1.Cells[2,i]:=lastname;
      StringGrid1.Cells[3,i]:=phonenumber;
      StringGrid1.Cells[4,i]:=adress;
      StringGrid1.RowCount:=StringGrid1.RowCount+1;
      inc(n);
    end;
  end;
end;


А проблема заключается в том, что не работает заполнение, да и мне кажется, что считывание тоже, хотя проверял без цикла, в ручную, то в текстбокс все выводилось, а тут не хочет. Также, выводит ошибку на Read(F,pb); - непредвиденный конец файла, хотя стоит проверка. Что я делаю не так?
  • Вопрос задан
  • 13731 просмотр
Пригласить эксперта
Ответы на вопрос 2
@M_PRO
А зачем постоянно делать Seek? Кстати записи с 0 нумеруются.
Если память не изменяет при работе с записями Rewrite принимает два значения.
Если есть заголовки тогда
for i:=1 to StringGrid1.RowCount - 1 do
В чтении вообще непонятно что написано.
Там два цикла. И в одном из них попытка модифицировать ограничение счётчика (кстати работать скорее всего тоже не будет). То есть если у нас в файле 10 записей, первым проходом мы считаем одну, вторым - две, и.т.д., до 11 прохода, когда мы попробуем считать 11 записей, то есть больше чем есть в файле.

Я бы рекомендовал посмотреть чужие примеры.
Ответ написан
toxicdream
@toxicdream
Дружелюбный и доверчивый социопат
Сохранение в файл:
AssignFile(F, 'pbook.dat');
  Rewrite(f);
  for i:=1 to StringGrid1.RowCount-1 do
  begin
      pb.firstname:=StringGrid1.Cells[1,i];
      pb.lastname:=StringGrid1.Cells[2,i];
      pb.phonenumber:=StringGrid1.Cells[3,i];
      pb.adress:=StringGrid1.Cells[4,i];
      Write(F,pb);
  end;
  CloseFile(F);

Зачем вам были нужны n и Seek? Почему выходите за границы StringGrid-а?
Чтение:
AssignFile(F, 'pbook.dat');
  Reset(F);
  StringGrid1.RowCount := FileSize(F) + 1; // Точно не помню
  Seek(F, 0); // Может быть не нужен
  i := 1;
  while not eof(F) do
  begin
     with pb do
     begin
        Read(F,pb);
        StringGrid1.Cells[1,i]:=firstname;
        StringGrid1.Cells[2,i]:=lastname;
        StringGrid1.Cells[3,i]:=phonenumber;
        StringGrid1.Cells[4,i]:=adress;
        Inc(i);
      end;
    end;

Прочитайте еще раз про циклы и как они работают. Про свойства объектов и нумерацию массивов.
Учитесь "читать код" - прокручивать в голове выполнение алгоритма.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы