Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Удаление записи из типизированного файла


Автор: delphi1user 8.11.2010, 08:35
Доброго времени суток! 
Ребят, пишу программу-тестер которая записывает вопросы с ответами в тип.файл, хочу добавить возможность удалять вопросы из теста, Вопрос - как это сделать?? Подскажите пожалуйста...перешарил весь гугл вдоль и поперек уже, ничего дельного найти не могу, вот мой код
так я организовываю вопросы, ответы в тесте:

Код

.....................
const
NQ=100;//максимальное число вопросов
NA=3;//максимальное число ответов
 type
 t_Test=record
 QW:array[1..NQ] of String[200]; //массив вопроса
 An:array[1..NQ,1..NA] of String[100];//ответы двумерный массив
 Ra:array[1..NQ] of integer;//правильный ответ
 Bb:array[1..NQ]of integer;// балл за правильный ответ
 zapis_K:byte; //запись общего кол-ва вопросов
 zapis_B_vsego:byte;//запись общего кол-ва  баллов
 Res:array [1..NQ] of integer;//результат
 end;


var
 Test:t_Test;
   FTest:File of  t_Test; //файл для создания теста
   n:byte;    //текущий вопрос
   k:byte;     //количество вопросов
   ball:integer;     //баллы
   FileName:String;
...............................
   //пытался удалять при помощи временного файла
   tempTest:t_test;   //файл для удаления записи
   f,fa:integer;


собственно процедуры записи-чтения

Код

 procedure WriteTest;
 begin
     //создание файла  при записи
AssignFile(FTest,FileName+'.dat');// связь файловой переменной с файлом на диске
Rewrite(FTest);//Создание файла
Write(FTest,Test);//записываем тест в файл
CloseFile(FTest);
 end;

procedure ReadTest;
  begin
AssignFile(FTest, FileName);// связь файловой переменной с файлом на диске
Reset(FTest);
Read(FTest,Test);//читаем тест из файла
CloseFile(FTest);
 end;


С этим проблем у меня нету.

Пробовал сам 2 варинта удаления:

1 Вариант - при помощи временного файла temрTest
Код

procedure DelZap;  //удаление записи
begin
fa:=1;
 FillChar(tempTest, SizeOf(t_Test),0);
for f:=1 to NQ do
begin
if f <> n{вопрос который надо удалить} then
begin
 tempTest.QW[fa]:=Test.QW[f];
 inc(fa);
end;
end;

for f:=1 to NQ do
 Test.QW[f]:=tempTest.QW[f];

end;




Результат - ничего не происходит вообще=(((((

2 вариант - Насоветовали на delphisorces при помощи функции seek  и truncate - перемещение записи вопроса в конец файла с последующим его отсечением
Код

begin
//n = номер удаляемой записи, начиная с 0
seek(ftest, filesize(ftest) - 1);
readtest
seek(ftest, n - 1);
writetest
//когда запись уже находиться в конце файла, я ее отсекаю
seek(ftest, filesize(ftest) - 1);
truncate(ftest)


Результат - ошибка I/O =(((


В общем жду любой помощи

Автор: cfb 8.11.2010, 10:53
В первом варианте имеет ли значение переменная NQ? И второе, не забыли-ли Вы случайно записать полученное значение переменной Test в конечный файл?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)