Форум: "WinAPI";
Текущий архив: 2003.01.20;
Скачать: [xml.tar.bz2];
ВнизЧтение из буфера Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.01.20;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.022 c