Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.20;
Скачать: CL | DM;

Вниз

Чтение из буфера   Найти похожие ветки 

 
DDDD   (2002-12-05 11:42) [0]

Здаствуйте мастера!
Вопрос наверное детский но не могу победить.
есть файл в котором написаны данные в виде структуры PMyRec = record
i : integer;
Читаю его в буфер. вопрос:
как извлечь получившейся масив из i.
Спасибо.


 
Reindeer Moss Eater   (2002-12-05 11:51) [1]

Никакого массива не должно получиться


 
DDDD   (2002-12-05 11:53) [2]

По идее получается файл в котором каждое i записано в 4 байтах. как можно извлечь поизвольное i.


 
Reindeer Moss Eater   (2002-12-05 12:00) [3]

1. Почтитай про работу с типизированными файлами.
2. Расскажи как данные писались в файл.
3. Объяви переменную типа PMyRec и копируй в нее из буфера SizeOf(PMyRec) байт
4. Много всяких способов есть на самом деле


 
DDDD   (2002-12-05 12:16) [4]

Дело в том что структура сложнее но это не важно. Данные писались в цикле, каждая запись дописывалась в конец файла. Про типизированные файлы я знаю. Интересно как эти данные можно прочитать из буфера


 
Anatoly Podgoretsky ©   (2002-12-05 12:26) [5]

Обратной по сути к записи операцией, если это был какой то Write, то Read


 
DDDD   (2002-12-05 12:56) [6]

Да изпользуется Write, но какой функцией из буфера дастать запись.


 
Reindeer Moss Eater   (2002-12-05 13:48) [7]

Если весь файл считан в буфер, то процедурой Move


 
DDDD   (2002-12-05 14:01) [8]

Спасибо за Move. А перемещение если я хочу считать не первый а к примеру 10 элемент


 
Reindeer Moss Eater   (2002-12-05 14:04) [9]

И что этому конкретно мешает?


 
DDDD   (2002-12-05 14:10) [10]

Незнание. Я только начил посать. Спасибо.


 
DDDD   (2002-12-05 14:14) [11]

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


 
Reindeer Moss Eater   (2002-12-05 14:20) [12]

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:28) [13]

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:32) [14]

1. AllocMem возвращает Pointer
2. Move в качестве параметра не принимает Pointer
3. Что такое str в MyRec?


 
DDDD   (2002-12-05 14:39) [15]

Немного переделал да присваивать начало но все равно пишет Акцес Волуейшен!!!
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:49) [16]

1. Если читешь по одной записи, то зачем вся эта ерунда с копрированием куда-то? Читай прямо в переменную - запись!
2. p:=@Buff это зачем? зачем тебе указатель, указывающий на указатель на память рапределенную AllocMem?



 
DDDD   (2002-12-05 15:03) [17]

>>>>>Если читешь по одной записи, то зачем вся эта ерунда с копрированием куда-то? Читай прямо в переменную - запись!
Это для упращения
>>>>> p:=@Buff это зачем? зачем тебе указатель, указывающий на указатель на память рапределенную AllocMem?
я не когда не работал с памятью. Но если я так пишу то данные хотя бы считаваются а после по выходу из процедуры появляется ошибка.


 
Reindeer Moss Eater   (2002-12-05 15:14) [18]

var
MyRec:PMyRec;
readfile(hand,MyRec,sizeof(MyRec),i,nil);
ListBox1.Items.Add(MyRec.str+" "+MyRec.str1);




 
DDDD   (2002-12-05 15:19) [19]

Хорошо! Это я уже знаю. А если там не 1 MyRec а 1000. Тогда что.


 
Reindeer Moss Eater   (2002-12-05 15:33) [20]

Где там???


 
DDDD   (2002-12-05 15:37) [21]

В файле


 
Reindeer Moss Eater   (2002-12-05 15:53) [22]

Перемести указатель в файле, если не хочешь читать первые 99 записей, или прочитай 99 записей, перед тем как получить заветную сотую


 
DDDD   (2002-12-05 15:55) [23]

1. А как это зделать на API. Это я открыл файл с помощью CreateFile
2. А как ты относишся к потокам TMemoryStream. Там все это делается.
Спасибо!


 
Anatoly Podgoretsky ©   (2002-12-05 16:14) [24]

Так ты же писал, что псоледовательно записывад, так последовательно и читай, только вместо Write, используй Read


 
DDDD   (2002-12-05 16:19) [25]

Огромное спасибо. Наконецто разобрался.
А по поводу потоков! Быстрей с ними работать аль нет!


 
Anatoly Podgoretsky ©   (2002-12-05 16:21) [26]

Зависит от того, правильно или нет


 
DDDD   (2002-12-05 16:25) [27]

Всем спасибо!!!!!!!!!!


 
DDDD   (2002-12-05 16:29) [28]

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;
надеюсь правильно!!!!!!!!!


 
AME   (2002-12-05 17:16) [29]

//Я делал так:
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;



 
AME   (2002-12-05 17:19) [30]

//Правильней будет:
BlockRead(F,AA,SizeOf(MyRecord));
// Я ТАК думаю.
// Хотя работают оба варианта.



Страницы: 1 вся ветка

Текущий архив: 2003.01.20;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.024 c
4-62941
alvin
2002-12-04 12:23
2003.01.20
Tray


4-62919
cult
2002-12-04 13:06
2003.01.20
Где или Как узнать код сообщения?


1-62550
111222
2003-01-10 17:24
2003.01.20
Кнопка остается


1-62474
KoHe4Ho }|{e 6ot
2003-01-09 22:59
2003.01.20
Плиззззз !!!


8-62673
d.romanov
2002-09-28 17:51
2003.01.20
Файл звука маленького размера