Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.05.2009, 18:16
insidefuture insidefuture вне форума
Прохожий
 
Регистрация: 04.05.2009
Сообщения: 5
Репутация: 10
Стрелка типизированный файл - помогите

Привет,

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

я делаю так:

Цитата:
type

skaicius = record
pirmas : integer;
end;
.....

procedure TForm1.Button1Click(Sender: TObject);
var F : file of integer;
n : skaicius;
begin


assignfile(F, 'taspats.tts');
rewrite(F);

Edit1.Text:=IntToStr(StrToInt(Edit1.Text)+1);
n.pirmas:=StrToInt(Edit1.Text);
write(F, n.pirmas);
closefile(F);

end;
Ответить с цитированием
  #2  
Старый 05.05.2009, 18:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

см процедуру seek.

Из хелпа:
Цитата:
To expand a file, seek one component beyond the last component; that is, the statement Seek(F, FileSize(F)) moves the current file position to the end of the file.
Ответить с цитированием
  #3  
Старый 05.05.2009, 19:18
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

1. Вообще если быть точным то файл у вас не типа интеджер, а типа skaicius.
2. Для записи в уже существующий файл надо применять Reset а не Rewrite;
3. Для добавления данных в конец файла, после его открытия надо установить указатель в конец файла, как советует lmikle.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 05.05.2009, 19:27
insidefuture insidefuture вне форума
Прохожий
 
Регистрация: 04.05.2009
Сообщения: 5
Репутация: 10
По умолчанию

Спасибо уже оазобрался
Ответить с цитированием
  #5  
Старый 07.05.2009, 17:16
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию Поздновато, наверное, но может кому-то пригодиться ...

Когда-то пришлось писать базу данных в Pascal for DOS.
Тогда пришлось написать инструментарий.
Не шедевр (по текстам), но рабочий вариант.
Может кому-то пригодится.
================================
Код:
{Дополнить запись в конец файла}
function AppendRecToFile(NameF : String;
                         Var PBuf : Pointer;
                         SizeRec : LongInt) : LongInt;
{Записать запись в файл}
function PutRecToFile(NameF : String;
                      Var PBuf : Pointer;
                      NumRec,SizeRec : LongInt) : Boolean;
{Прочитать запись из файла по номеру}
function GetRecFromFile(NameF : String;
                        Var PBuf : Pointer;
                        NumRec,SizeRec : LongInt) : Boolean;



implementation


function GetFAttrWithNameFile(NameF : String;Var A : integer) : Boolean;
{Прочитать атрибуты файла}
{
faReadOnly  $00000001  Read-only files
faHidden    $00000002  Hidden files
faSysFile   $00000004  System files
faVolumeID  $00000008  Volume ID files
faDirectory $00000010  Directory files
faArchive   $00000020  Archive files
faAnyFile   $0000003F  Any file
}
begin
  Result:=false;
  A:=0;
  if FileExists(NameF) then begin
     A:=FileGetAttr(NameF);
     if A=128 then A:=0;
     if A>0 then begin
        Result:=true;
     end;
  end;
end;


function SetFAttrWithNameFile(NameF : String;A : integer) : Boolean;
{Записать атрибуты файла}
begin
  Result:=false;
  if FileExists(NameF) then begin
     Result:=true;
     if FileSetAttr(NameF,A)<0 then Result:=false;
  end;
end;


function CountRecInFile(NameF : String; SizeRec : LongInt) : LongInt;
{Количество записей в файле}
Var
  A : integer;
  Yes : Byte;
  CCC999 : LongInt;
  Ok99 : Boolean;
  FF : file of byte;
begin
  {SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX);}
  Result:=-1;
  if SizeRec>0 then begin
     Yes:=0;
     CCC999:=0;
     if  GetFAttrWithNameFile(NameF,A) then begin
        if  SetFAttrWithNameFile(NameF,0) then begin
           AssignFile(FF,NameF);
           {$I-} reset(FF) {$I+};
           Ok99:=(IoResult=0);
           if Ok99 then begin
              {$I-} CCC999:=FileSize(FF) {$I+};
              Ok99:=(IoResult=0);
              if Ok99 then begin
                 Yes:=1;
              end;
              {$I-} CloseFile(FF) {$I+};
              Ok99:=(IoResult=0);
           end;
           if Yes>0 then begin
               Result:=trunc(CCC999/SizeRec);
           end;
        end;
        SetFAttrWithNameFile(NameF,A);
     end;
  end;
end;


function CreateFile(NameF : String) : Boolean;
{Создать файл}
Var
  Ok99 : Boolean;
  FF : file of byte;
begin
  {SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX);}
  Result:= False;
  AssignFile(FF,NameF);
  {$I-} rewrite(FF) {$I+};
  Ok99:=(IoResult=0);
  if Ok99 then begin
     {$I-} CloseFile(FF) {$I+};
     Ok99:=(IoResult=0);
     Result := True;
  end;
end;


function GetFromFile0(NameF : String;
                      Var PBuf : Pointer;
                      StartByte, Count : LongInt) : Boolean;
{Прочитать количество байт из файла}
Var
  A : integer;
  Res : LongInt;
  Yes:byte;
  CountRec : LongInt;
  Ok99 : Boolean;
  FF : file;
  NumRead : Integer;
  NumWritten: integer;
  i : word;

begin
  {SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX);}
  Yes:=0;
  Result := False;
  if (StartByte>=0) and (Count>0) then begin
     AssignFile(FF,NameF);
     if GetFAttrWithNameFile(NameF,A) then begin
        if SetFAttrWithNameFile(NameF,0) then begin
           {$I-} reset(FF,1) {$I+};
           Ok99:=(IoResult=0);
           if Ok99 then begin
              {$I-} CountRec:=FileSize(FF) {$I+};
              Ok99:=(IoResult=0);
              if Ok99 then begin
                 if (StartByte+Count-1) <= CountRec then begin
                    {$I-} seek(FF,StartByte) {$I+};
                    Ok99:=(IoResult=0);
                    if Ok99 then begin
                       {$I-} BlockRead(FF, PBuf^, Count, NumRead) {$I+};
                       Ok99:=(IoResult=0);
                       if Ok99 then begin
                          if Count= NumRead then begin
                             Yes:=1;
                          end;
                       end;
                    end;
                 end;
              end;
              {$I-} CloseFile(FF) {$I+};
              Ok99:=(IoResult=0);
           end;
           if Yes>0 then Result := True;
        end;
        SetFAttrWithNameFile(NameF,A);
     end;
  end;
end;


function PutToFile0(NameF : String;
                    Var PBuf : Pointer;
                    StartByte,Count : LongInt) : Boolean;
{Записать количество байт в файл}
Var
  A : integer;
  Res : LongInt;
  Yes:byte;
  CountRec : LongInt;
  Ok99 : Boolean;
  FF : file;
  NumRead : integer;
  NumWritten: integer;
  i : word;

begin
  {SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX);}
  Yes:=0;
  Result := False;
  if (StartByte>=0) and (Count>0) then begin
     AssignFile(FF,NameF);
     if GetFAttrWithNameFile(NameF,A) then begin
        if SetFAttrWithNameFile(NameF,0) then begin
           {$I-} reset(FF,1) {$I+};
           Ok99:=(IoResult=0);
           if Ok99 then begin
              {$I-} CountRec:=FileSize(FF) {$I+};
              Ok99:=(IoResult=0);
              if Ok99 then begin
                 if (StartByte+Count-1) <= CountRec then begin
                    {$I-} seek(FF,StartByte) {$I+};
                    Ok99:=(IoResult=0);
                    if Ok99 then begin
                       {$I-} BlockWrite(FF, PBuf^, Count, NumRead) {$I+};
                       Ok99:=(IoResult=0);
                       if Ok99 then begin
                          if Count = NumRead then begin
                             Yes:=1;
                          end;
                       end;
                    end;
                 end;
              end;
              {$I-} CloseFile(FF) {$I+};
              Ok99:=(IoResult=0);
           end;
           if Yes>0 then Result := True;
        end;
        SetFAttrWithNameFile(NameF,A);
     end;
  end;
end;


function AppendToFile0(NameF : String;
                       Var PBuf : Pointer;
                       Count : LongInt) : Boolean;
{Дополнить количество байт в конец файл}
Var
  A : integer;
  Res : LongInt;
  Yes:byte;
  CountRec : LongInt;
  Ok99 : Boolean;
  FF : file;
  NumRead : integer;
  NumWritten: integer;
  i : word;

begin
  {SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX);}
  Yes:=0;
  Result := False;
  if (Count>0) then begin
     AssignFile(FF,NameF);
     if GetFAttrWithNameFile(NameF,A) then begin
        if SetFAttrWithNameFile(NameF,0) then begin
           {$I-} reset(FF,1) {$I+};
           Ok99:=(IoResult=0);
           if Ok99 then begin
              {$I-} CountRec:=FileSize(FF) {$I+};
              Ok99:=(IoResult=0);
              if Ok99 then begin
                 {$I-} seek(FF,CountRec) {$I+};
                 Ok99:=(IoResult=0);
                 if Ok99 then begin
                    {$I-} BlockWrite(FF, PBuf^, Count, NumRead) {$I+};
                    Ok99:=(IoResult=0);
                    if Ok99 then begin
                       if Count= NumRead then begin
                          Yes:=1;
                       end;
                    end;
                 end;
              end;
              {$I-} CloseFile(FF) {$I+};
              Ok99:=(IoResult=0);
           end;
           if Yes>0 then Result := True;
        end;
        SetFAttrWithNameFile(NameF,A);
     end;
  end;
end;




function GetRecFromFile(NameF : String;
                        Var PBuf : Pointer;
                        NumRec,SizeRec : LongInt) : Boolean;
{Прочитать запись из файла по номеру}
begin
  Result := GetFromFile0(NameF,PBuf,NumRec*SizeRec,SizeRec);
end;

function PutRecToFile(NameF : String;
                      Var PBuf : Pointer;
                      NumRec,SizeRec : LongInt) : Boolean;
{Записать запись в файл}
begin
   Result := PutToFile0(NameF,PBuf,NumRec*SizeRec,SizeRec);
end;

function AppendRecToFile(NameF : String;
                         Var PBuf : Pointer;
                         SizeRec : LongInt) : LongInt;
{Дополнить запись в конец файла}
Var
  Yes : byte;
begin
  Result := -1;
  Yes:=1;
  if not FileExists(NameF) then begin
     if not CreateFile(NameF) then Yes:=0;
  end;
  if Yes>0 then begin
     if AppendToFile0(NameF,PBuf,SizeRec) then begin
        Result := CountRecInFile(NameF,SizeRec);
     end;
  end;
end;



end.

Ответить с цитированием
  #6  
Старый 07.05.2009, 17:18
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию Как используется

Код:
Type
  PRec = ^TRec;
  TRec = record
           TabNum : integer;
           FIO    : string[64];
           Oklad  : real;
         end;


procedure TForm1.Button1Click(Sender: TObject);
//Добавить запись в файл
Var
  PMyRec   : PRec;     //буфер для записи в файл
  TabNum   : integer;
  FileName : string;   //имя файла
begin

  FileName:=MainDir+'MyFile.dat';
  ListBox1.Items.Add('CountRec before: '+IntToStr(CountRecInFile(FileName, SizeOf(TRec))));

  //------------------------------------------------
  //блок подготовки данных для записи в файл
  TabNum:=CountRecInFile(FileName, SizeOf(TRec));
  if TabNum<0 then TabNum:=0;
  TabNum:=TabNum+1;
  //------------------------------------------------

  NEW(PMyRec); //Создаем дин.переменную
  TRY
     //-----------------------------------------
     //Записываем данные в буфер
     PMyRec^.TabNum := TabNum;
     PMyRec^.FIO    := 'FIO_'+IntToStr(TabNum);
     PMyRec^.Oklad  := TabNum*100+0.75;
     //-----------------------------------------
     AppendRecToFile(FileName,  POINTER(PMyRec), SizeOf(TRec)); //Сохраняем буфер в файл
  FINALLY
     Dispose(PMyRec);  //освобождаем ресурсы
  END;
  ListBox1.Items.Add('CountRec after: '+IntToStr(CountRecInFile(FileName, SizeOf(TRec))));
end;

procedure TForm1.LoadClick(Sender: TObject);
//Прочитать содержимое файла
Var
  PMyRec   : PRec;     //буфер для записи в файл
  iRec,CountRec : integer;
  FileName : string;   //имя файла
begin
  FileName:=MainDir+'MyFile.dat';
  CountRec:=CountRecInFile(FileName, SizeOf(TRec)); //определим кол-во записей в файле
  if CountRec>0 then begin
     ListBox1.Items.Clear; //сюда будем выводить данные
     NEW(PMyRec); //Создаем дин.переменную
     TRY
       for iRec:=0 to (CountRec-1) do
        begin
          GetRecFromFile(FileName, POINTER(PMyRec), iRec, SizeOf(TRec)); //Читаем из файла в буфер
          //--------------------------
          //Что-то делаем с этими данными
          ListBox1.Items.Add(IntToStr(iRec) + '.  '+IntToStr(PMyRec^.TabNum)+'  '+trim(PMyRec^.FIO)+'  '+FloatToStr(PMyRec^.Oklad));
          //--------------------------
       end;
     FINALLY
       Dispose(PMyRec);  //освобождаем ресурсы
     END;
  end;
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:32.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025