Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.017 c
4-62945
Maniak
2002-12-06 15:49
2003.01.20
Как с помощью WinAPI узнать имя компьютера?


14-62760
Pat
2003-01-04 18:05
2003.01.20
Экзамен по информатике. Теория


14-62818
VID
2002-12-30 21:34
2003.01.20
Как на Delphi обратиться к Господу ? ;)


1-62516
arcoant
2003-01-10 17:15
2003.01.20
Buttons


14-62811
boby_g
2002-12-31 12:42
2003.01.20
Вопрос о компонентом TOpenDialog и TGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский