![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение из буфера [D5, Win95/98]
DDDD © (2002-12-05 11:42:00)Здаствуйте мастера!
Вопрос наверное детский но не могу победить.
есть файл в котором написаны данные в виде структуры PMyRec = record
i : integer;
Читаю его в буфер. вопрос:
как извлечь получившейся масив из i.
Спасибо.
AME (2002-12-05 17:19:00) [1]//Правильней будет:
BlockRead(F,AA,SizeOf(MyRecord));
// Я ТАК думаю.
// Хотя работают оба варианта.
AME (2002-12-05 17:16:00) [2]//Я делал так:
type MyRecord = record
i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12:Integer;
end;
function Write(sPath:String):XXXX;
var F:File;
AA:MyRecord
begin
AssignFile(F,sPath);
Rewrite(F,1);
AA.i1:=10;
AA.i2:=20
// и т.д.
BlockWrite(F,AA,SizeOf(AA));
CloseFile(F);
end;
function Read(sPath:String):Integer;
var F:File;
AA:MyRecord
begin
AssignFile(F,sPath);
Reset(F,1);
BlockRead(F,AA,SizeOf(AA));
result:=AA.i1;
CloseFile(F);
end;
DDDD (2002-12-05 16:29:00) [3]procedure TForm1.Button1Click(Sender: TObject);
begin
Memory.Seek(0,soFromBeginning);
while Memory.Position <> Memory.Size do
begin
Memory.Read(Myrec,sizeof(PMyRec));
ListBox1.Items.Add(MyRec.str+" "+MyRec.str1);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memory := TMemoryStream.Create;
Memory.LoadFromFile("d:\dat.dat"); // это он!!
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i : integer;
begin
Memory.Seek(0,soFromBeginning);
for i:=1 to 100 do
begin
MyRec.i:=i;
MyRec.str:="ffffff";
MyRec.str1:="rrrrrrr";
MyRec.dat:=strtodate("11.11.22");
Memory.Write(MyRec,sizeof(MyRec));
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Memory.SaveToFile("d:\dat.dat");
Memory.Free;
end;
надеюсь правильно!!!!!!!!!
DDDD (2002-12-05 16:25:00) [4]Всем спасибо!!!!!!!!!!
Anatoly Podgoretsky (2002-12-05 16:21:00) [5]Зависит от того, правильно или нет
DDDD (2002-12-05 16:19:00) [6]Огромное спасибо. Наконецто разобрался.
А по поводу потоков! Быстрей с ними работать аль нет!
Anatoly Podgoretsky (2002-12-05 16:14:00) [7]Так ты же писал, что псоледовательно записывад, так последовательно и читай, только вместо Write, используй Read
DDDD (2002-12-05 15:55:00) [8]1. А как это зделать на API. Это я открыл файл с помощью CreateFile
2. А как ты относишся к потокам TMemoryStream. Там все это делается.
Спасибо!
Reindeer Moss Eater (2002-12-05 15:53:00) [9]Перемести указатель в файле, если не хочешь читать первые 99 записей, или прочитай 99 записей, перед тем как получить заветную сотую
DDDD (2002-12-05 15:37:00) [10]В файле
Reindeer Moss Eater (2002-12-05 15:33:00) [11]Где там???
DDDD (2002-12-05 15:19:00) [12]Хорошо! Это я уже знаю. А если там не 1 MyRec а 1000. Тогда что.
Reindeer Moss Eater (2002-12-05 15:14:00) [13]var
MyRec:PMyRec;
readfile(hand,MyRec,sizeof(MyRec),i,nil);
ListBox1.Items.Add(MyRec.str+" "+MyRec.str1);
DDDD (2002-12-05 15:03:00) [14]>>>>>Если читешь по одной записи, то зачем вся эта ерунда с копрированием куда-то? Читай прямо в переменную - запись!
Это для упращения
>>>>> p:=@Buff это зачем? зачем тебе указатель, указывающий на указатель на память рапределенную AllocMem?
я не когда не работал с памятью. Но если я так пишу то данные хотя бы считаваются а после по выходу из процедуры появляется ошибка.
Reindeer Moss Eater (2002-12-05 14:49:00) [15]1. Если читешь по одной записи, то зачем вся эта ерунда с копрированием куда-то? Читай прямо в переменную - запись!
2. p:=@Buff это зачем? зачем тебе указатель, указывающий на указатель на память рапределенную AllocMem?
DDDD (2002-12-05 14:39:00) [16]Немного переделал да присваивать начало но все равно пишет Акцес Волуейшен!!!
PMyRec = record
i : integer;
str : string[20];
str1 : string[15];
dat : TDateTime;
end;
var
p : pointer;
buf : PChar;
i:=0;
Buf := AllocMem(sizeof(MyRec) + 1);
p:=@Buf;
readfile(hand,buf,sizeof(MyRec),i,nil);
move(p^,MyRec,sizeof(Myrec));
ListBox1.Items.Add(MyRec.str+" "+MyRec.str1);
FreeMem(Buf);
Reindeer Moss Eater (2002-12-05 14:32:00) [17]1. AllocMem возвращает Pointer
2. Move в качестве параметра не принимает Pointer
3. Что такое str в MyRec?
DDDD (2002-12-05 14:28:00) [18]var
Buf : PChar;
i:=0;
Buf := AllocMem(sizeof(MyRec) + 1);
readfile(hand,buf,sizeof(MyRec),i,nil);
move(buf,MyRec,sizeof(Myrec));
ListBox1.Items.Add(MyRec.str+" "+MyRec.str1);
Пишет ошибку! И ни чего не присваивает.
Reindeer Moss Eater (2002-12-05 14:20:00) [19]var
p:PByte;
OffSet:integer;
Rec:PMyRec;
p:=<Адрес буфера с содержимым файла>;
OffSet:=1 + SizeOf(PMyRec) * <номер элемента>;
Inc(p,OffSet);
Move(P^,Rec,SizeOf(PMyRec));
DDDD (2002-12-05 14:14:00) [20]Если есть возможность положите пожалуста пример на мыло. А то что то так туго.
Спасибо!!!