Другие языки программирования и технологии

Проблема с записью в файл в делфи

записываю в файл таким образом:

begin
if SaveDialog1.Execute then
AssignFile(Fi,'itogi.dat');
if (s=0)then rewrite(fi);
Reset(Fi);
EOF(fi);
Student.fam:=fam;
Student.imya:=imya;
Student.otch:=otch;
Student.spec1:=spec1;
Student.spec2:=spec2;
Student.spec3:=spec3;
Student.ball:=ball;
Write(Fi,Student);
seek(Fi,s);
s:=s+8;
CloseFile(Fi);
end;

а открываю вот так:

if OpenDialog1.Execute then
begin
AssignFile(Fi,'itogi.dat');
Reset(Fi);
Repeat
Read(Fi,Student);
Form3.Memo1.Lines.Add(student.fam);
Until EOF(Fi);
CloseFile(Fi);
end;

Student- это запись
в результате, когда вывожу в MEMO, выводится только последнее записанное значение в файл
как сделать, чтобы выводилась и записывалась вся информация?
Внимательно смотрим на написанное

begin
if SaveDialog1.Execute then
AssignFile(Fi,'itogi.dat'); {а если не Execute, то тоже выпонять то, что дальше? (в предыдущей строке после then нет begin)}
if (s=0)then rewrite(fi); {что такое s и почему оно должно равняться нулю? подозреваю, что таки s=0 и файл перезаписывается}
Reset(Fi); {открываем файл и устанавливаем указатель на начало, т. е. на первую запись}
EOF(fi); {вообще не понятно для чего это}
Student.fam:=fam; {здесь все ясно}
Student.imya:=imya;
Student.otch:=otch;
Student.spec1:=spec1;
Student.spec2:=spec2;
Student.spec3:=spec3;
Student.ball:=ball;
Write(Fi,Student); {записали}
seek(Fi,s); {куда-то перешли (чему же все-таки равно s?)}
s:=s+8; {зачем-то инкрементировали s}
CloseFile(Fi); {и закрыли файл в котором возможно всего одна запись}
end;

Во-первых, не понятны пляски с переменной s.
Во-вторых, для чего вам вообще эти заморочки с s, если проверить существование файла можно функцией FileExists(const FileName: string): Boolean;
В-третьих, позиционировать указатель на конец файла нужно так: Seek(F, FileSize(F));
Ну и на всякий случай, в-четвертых. Получить количество записей в типизированном файле можно так

N := FileSize(F);

а процедура Seek(F, N) устанавливает указатель на нужную запись (нумерация начинается с нуля) .

Ухожу на работу, так что вопросы в комментах только вечером или велком в аську 158-419-452 часа через три.
MM
Maksim Meleshov
59 614
Лучший ответ
значит в файле только одна запись

а если так
// Повторное открытие для добавления в конец файла
Append(myFile);
вместо reset()

и ф-ия EOF(F) не устанавливает указатель в конец файла, а только сигнализирует если достигнут конец файла

поменять
if (s=0)then rewrite(fi);
Reset(Fi);
EOF(fi);

на

if (s=0) then rewrite(fi)
else append(fi);

и с seek() что то мутно у вас.
Матвей Дрёмин
Матвей Дрёмин
8 290
Максим Тутункин append только для текстовых файлов. у меня типизированный