Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение из буфера [D5, Win95/98]


Страницы:   1 2

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]

Если есть возможность положите пожалуста пример на мыло. А то что то так туго.
Спасибо!!!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо