Форум по 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,096
Версия 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.
Тогда пришлось написать инструментарий.
Не шедевр (по текстам), но рабочий вариант.
Может кому-то пригодится.
================================
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
{Дополнить запись в конец файла}
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
По умолчанию Как используется

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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, время: 11:36.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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