FileToMem, howto
19 отговора
363 прегледа
FileToMem, howto
Zdraveite,
Iskam da zaredq edin indexfile v array of Cardinal
Probvah dva nachina:
TextFile - ReadLn s StrToIntDef - zarejda za ~60ms
file of Cardinal - FileStream.Read - zarejda za ~70ms
V dvata sluchq ima array of Cardinal, koito se razshirqva s edin zapis pri prochitane na nov zapis.
Resultatite sa mnogo interesni. Poluchi se, che e po-burzo da imam tekstov fail, koito cheta s ReadLn i konvertiram string-a vuv Cardinal, otkolkoto edin file of Cardinal, koito cheta s FileStream. Tova mi izglejda dosta stranno. Zatova iskah da vi popitam dali nqma sluchaino nqkakuv po durz nachin? Ideqta mi e caliq array of Cardinal da se zaredi napravo ot faila, a ne zapis po zapis. E, moje li ?
Blagodarq predvaritelno, na koito pomognat
by Waz Gaa
[email protected]
Iskam da zaredq edin indexfile v array of Cardinal
Probvah dva nachina:
TextFile - ReadLn s StrToIntDef - zarejda za ~60ms
file of Cardinal - FileStream.Read - zarejda za ~70ms
V dvata sluchq ima array of Cardinal, koito se razshirqva s edin zapis pri prochitane na nov zapis.
Resultatite sa mnogo interesni. Poluchi se, che e po-burzo da imam tekstov fail, koito cheta s ReadLn i konvertiram string-a vuv Cardinal, otkolkoto edin file of Cardinal, koito cheta s FileStream. Tova mi izglejda dosta stranno. Zatova iskah da vi popitam dali nqma sluchaino nqkakuv po durz nachin? Ideqta mi e caliq array of Cardinal da se zaredi napravo ot faila, a ne zapis po zapis. E, moje li ?
Blagodarq predvaritelno, na koito pomognat
by Waz Gaa
[email protected]
Re: FileToMem, howto
Идеята на потоците е да записваш разнообразна информация - а не то4но определена - така, 4е резултатите са напълно разбираеми.
Ако файла ти е с фиксиран формат - го чети със стандартните операции за файл - не тези за потоците - друг въпрос е какво по то4но ще правиш с него след като го прочетеш.
---
Е т'ва е живот!
Ако файла ти е с фиксиран формат - го чети със стандартните операции за файл - не тези за потоците - друг въпрос е какво по то4но ще правиш с него след като го прочетеш.
---
Е т'ва е живот!
Re: FileToMem, howto
Konkretnoto mi pitane e:
Ima li nachin da zapazq chastta ot pametta, kudeto imam array of Cardinal, vuv fail. I sled tova tozi fail da moga da go zaredq v nov array of Cardinal.
Imam index fail na nepromenqshta se baza. Nego go zarejdam v tozi array sus standartnite ReadLn. Ako moje po nqkakuv nachin toq index fail da go durja vuv format napravo kakto e array of Cardinal v pametta, mislq che zarejdaneto shte e oshte po-burzo.
Oshte vednuj:
Da si napravq image file na array of Cardinal, koito sled tova da moga da si zarejdam napravo v pametta.
PS
Mislq che moje da ima problem sus duljinata na array-a. Dori da si kacha faila, moje da ne znam kolko zapisa ima. E, ne znam tochno kak bachka Length. Vsushtnost kato se ima predvid, che zaredeniq array e tochno kopie na predishen, sushtestvuvash, to bi trqbvalo da nqma problem.
No dali e vuzmojna taq istoriq!?
Ako si napravq TIndexFile = array of Cardinal i sled tova polzvam Write/Read(F, TIndexFile); dali nqma da se poluchi tochno tozi efekt !?
by Waz Gaa
[email protected]
Ima li nachin da zapazq chastta ot pametta, kudeto imam array of Cardinal, vuv fail. I sled tova tozi fail da moga da go zaredq v nov array of Cardinal.
Imam index fail na nepromenqshta se baza. Nego go zarejdam v tozi array sus standartnite ReadLn. Ako moje po nqkakuv nachin toq index fail da go durja vuv format napravo kakto e array of Cardinal v pametta, mislq che zarejdaneto shte e oshte po-burzo.
Oshte vednuj:
Da si napravq image file na array of Cardinal, koito sled tova da moga da si zarejdam napravo v pametta.
PS
Mislq che moje da ima problem sus duljinata na array-a. Dori da si kacha faila, moje da ne znam kolko zapisa ima. E, ne znam tochno kak bachka Length. Vsushtnost kato se ima predvid, che zaredeniq array e tochno kopie na predishen, sushtestvuvash, to bi trqbvalo da nqma problem.
No dali e vuzmojna taq istoriq!?
Ako si napravq TIndexFile = array of Cardinal i sled tova polzvam Write/Read(F, TIndexFile); dali nqma da se poluchi tochno tozi efekt !?
by Waz Gaa
[email protected]
Пробвай това - ама внимавай с...
четенето и записа на файл-а - ако е по голям от 64к - го раздели на парчета - май има някакво ограничение ??? - ще проверя и ще ти кажа
var
ToF: file;
B, C:array of Cardinal;
i:integer;
begin
SetLength(b, 10);
for i:=0 to Length(b) do
B[_i_]:=1; // towa da se 4ete bez pod4ertawkite
AssignFile(ToF, 'c:\test.txt');
Rewrite(ToF, 1); { Record size = 1 }
BlockWrite(ToF, B, Length(B));
CloseFile(ToF);
AssignFile(ToF, 'c:\test.txt');
Reset(ToF, 1); { Record size = 1 }
SetLength(C, FileSize(ToF) div sizeof(Cardinal));
BlockRead(ToF, B, FileSize(ToF));
CloseFile(ToF);
end;
---
Е т'ва е живот!
var
ToF: file;
B, C:array of Cardinal;
i:integer;
begin
SetLength(b, 10);
for i:=0 to Length(b) do
B[_i_]:=1; // towa da se 4ete bez pod4ertawkite
AssignFile(ToF, 'c:\test.txt');
Rewrite(ToF, 1); { Record size = 1 }
BlockWrite(ToF, B, Length(B));
CloseFile(ToF);
AssignFile(ToF, 'c:\test.txt');
Reset(ToF, 1); { Record size = 1 }
SetLength(C, FileSize(ToF) div sizeof(Cardinal));
BlockRead(ToF, B, FileSize(ToF));
CloseFile(ToF);
end;
---
Е т'ва е живот!
Редактирано от PhantomAS на
OK 10x
Mdaa, shte go probvam. I sigurno shte stane
Na men mi doide na um samo Read, Write, a tam ima problem s "finalization"na tipa
Blagodarq vi otnovo. Nadqvam se shte vdigne po malko ot 60ms za fail
by Waz Gaa
[email protected]
Na men mi doide na um samo Read, Write, a tam ima problem s "finalization"na tipa
Blagodarq vi otnovo. Nadqvam se shte vdigne po malko ot 60ms za fail
by Waz Gaa
[email protected]
Re: OK 10x
Ako si istinski maj i ne te e sram ot golemi exe-ta mojesh da si kompilirash indeksfajla direktno w exe-to :) taka loadtima ot twoq gledna tochka shte e =0
razgledaj {$I datao.obj}
------------------------------
I got a COMPILER, and I'm not afraid to use it!
razgledaj {$I datao.obj}
------------------------------
I got a COMPILER, and I'm not afraid to use it!
Re: OK 10x
Hehe, tova skoro go mislih za edno failche ot 50 Cardinals, no za 80 000, neshto ne mi haresva :) Togava shte imam problemi s programata ;)
by Waz Gaa
[email protected]
by Waz Gaa
[email protected]
Re: OK 10x
e kwo toklowa mu e strashnoto? nqma i 1Mb i te e strah da go linknesh? taka potrebitelite shte imat da mislqt za edin fajl po-malko. btw ako mojesh da linknesh i samite danni pak sha e dobre edin fajl za sichko kakto bshe na wremeto...
------------------------------
I got a COMPILER, and I'm not afraid to use it!
------------------------------
I got a COMPILER, and I'm not afraid to use it!
Neshto ne stana tova
a ti probval li si go tozi kod!?
Purvo, neznam zashto, Delphi 6 ne iskashe da prieme Rewrite(F, 1). Kazvashe, che imam prekaleno mnogo parametri, a toi posledniq i v help-a si go pishe, che e optional.
Puk i ne mislq, che tova trqbva da e 1. Ne trqbva li record size da e kolkoto array-a mi !? Zashtoto nego go zapisvam.
Kakto i da e shtom rewrite mi praveshe problem, probvah s drugi funkcii i se okaza, che s FileOpen/Write/Read/Close stava. Nqmashe nikakvo zaburzvane, no pone faila e po-maluk
PS Nqkoi bi li mi obqsnil kak chetene na array of Cardinal ot fail s FileRead moje da e ravno po skorost s chetene s ReadLn na tekstov fail (s chislata ot array-a), convertirane vuv Cardinal i dobavqne edno po edno v array-a !!?
by Waz Gaa
[email protected]
Purvo, neznam zashto, Delphi 6 ne iskashe da prieme Rewrite(F, 1). Kazvashe, che imam prekaleno mnogo parametri, a toi posledniq i v help-a si go pishe, che e optional.
Puk i ne mislq, che tova trqbva da e 1. Ne trqbva li record size da e kolkoto array-a mi !? Zashtoto nego go zapisvam.
Kakto i da e shtom rewrite mi praveshe problem, probvah s drugi funkcii i se okaza, che s FileOpen/Write/Read/Close stava. Nqmashe nikakvo zaburzvane, no pone faila e po-maluk
PS Nqkoi bi li mi obqsnil kak chetene na array of Cardinal ot fail s FileRead moje da e ravno po skorost s chetene s ReadLn na tekstov fail (s chislata ot array-a), convertirane vuv Cardinal i dobavqne edno po edno v array-a !!?
by Waz Gaa
[email protected]
Re: Neshto ne stana tova
Ами пробвах го преди да го пратя - вярно, че бе с D7 - но не мисля, че това е проблема - има нещо друго - пусни пълния код - освен това какви са размерите на масива ???
Rewrite(F, 1) - си е нещо което работи от времето на Turbo Pascal 5 - по моите спомени ;-)))
---
Е т'ва е живот!
Rewrite(F, 1) - си е нещо което работи от времето на Turbo Pascal 5 - по моите спомени ;-)))
---
Е т'ва е живот!
Re: Neshto ne stana tova
Не виждам причина за грешка в Rewrite(F, 1).
Не е задължително да се даде размер на записа 1, можеш да дадеш какъвто ти трябва, а можеш и да го пропуснеш, ако F е типизиран (Напр.: var F:file of Cardinal)
Мисля че за BlockRead/Write има пример в Helpa, но оставям на теб удоволствието да натиснеш F1
PS
Пропуснах да отбележа, че в кода на PhantomAS (стар ерген®) 26.10.02 16:31 като че ли има смесване на SizeOf(Cardinal) и SizeOf(Byte)
Не е задължително да се даде размер на записа 1, можеш да дадеш какъвто ти трябва, а можеш и да го пропуснеш, ако F е типизиран (Напр.: var F:file of Cardinal)
Мисля че за BlockRead/Write има пример в Helpa, но оставям на теб удоволствието да натиснеш F1
PS
Пропуснах да отбележа, че в кода на PhantomAS (стар ерген®) 26.10.02 16:31 като че ли има смесване на SizeOf(Cardinal) и SizeOf(Byte)
Редактирано от NDeu на
Re: Neshto ne stana tova
Mi vijte sega, az help-a mislq sum go razgledal dobre (mislq e zaradi 1%, koito vinagi sushtestvuva). Pone v tova otnoshenie pochti vinagi si svurshvam rabotata.
Nachi na men faila mi e beshe:
type
TIndexFile = array of Cardinal;
var
F: file of TIndexFile;
Ideqta mi beshe samo s edno prochitane ot faila da si zaredq celiq array. Nali imam filesize i sizeof(cardinal), ne bi trqbvalo da ima problemi da sus:
SetLength(myindexfile, filesize(f) div sizeof(cardinal))
E da, ama problemi ima. Az ne go muchih mnogo toq Rewrite (i az ne znam tochno kakvo iskashe !?), zashtoto si znam, che promenlivata mi e dosta golqma (array-a de), i osven tova bez da iskam popadnah na File*** funkciite, koito svurshiha sushtata rabota.
Drugata sedmica moje pak da pogledna tova s Rewrite i shte vi pisha, ako popadna na neshto interesno. Moje bi ima nqkakvo ogreanichenie, murzel me beshe da potursq _Rewrite (ili mai ne mojah da go otkriq)...
by Waz Gaa
[email protected]
Nachi na men faila mi e beshe:
type
TIndexFile = array of Cardinal;
var
F: file of TIndexFile;
Ideqta mi beshe samo s edno prochitane ot faila da si zaredq celiq array. Nali imam filesize i sizeof(cardinal), ne bi trqbvalo da ima problemi da sus:
SetLength(myindexfile, filesize(f) div sizeof(cardinal))
E da, ama problemi ima. Az ne go muchih mnogo toq Rewrite (i az ne znam tochno kakvo iskashe !?), zashtoto si znam, che promenlivata mi e dosta golqma (array-a de), i osven tova bez da iskam popadnah na File*** funkciite, koito svurshiha sushtata rabota.
Drugata sedmica moje pak da pogledna tova s Rewrite i shte vi pisha, ako popadna na neshto interesno. Moje bi ima nqkakvo ogreanichenie, murzel me beshe da potursq _Rewrite (ili mai ne mojah da go otkriq)...
by Waz Gaa
[email protected]
Nachi moq kod...
beshe neshto ot sorta na:
var
ToF: file;
B, C:array of Cardinal;
i:integer;
begin
SetLength(b, 10);
for i:=0 to Length(b) do
B[_i_]:=1; // towa da se 4ete bez pod4ertawkite
AssignFile(ToF, 'c:\test.txt');
Rewrite(ToF, Length(B)); {nali zapisut mi e tolkova golqm, a ne edinica !?}
BlockWrite(ToF, B, Length(B));
CloseFile(ToF);
AssignFile(ToF, 'c:\test.txt');
Reset(ToF, FileSize(ToF) div sizeof(Cardinal)); ); { ti kakvo mislish !? }
SetLength(C, FileSize(ToF) div sizeof(Cardinal));
BlockRead(ToF, B, FileSize(ToF));
CloseFile(ToF);
end;
E da no kato si zadam takuv RecordSize i Rewrite mai bugvashe. To mai bugvashe nan kakvoto i da mu zadam :(
A kato mu go mahnah mai sloji samo 1-2 Cardinals
Sujalqvam, no nqmam mnogo dostup do PC-to i ne moga da pisha tochno. Drugata sedmica moje bi shte buda po-konkreten, no naistina imashe problemi s Pascal funkciite za rabota s failove.
by Waz Gaa
[email protected]
var
ToF: file;
B, C:array of Cardinal;
i:integer;
begin
SetLength(b, 10);
for i:=0 to Length(b) do
B[_i_]:=1; // towa da se 4ete bez pod4ertawkite
AssignFile(ToF, 'c:\test.txt');
Rewrite(ToF, Length(B)); {nali zapisut mi e tolkova golqm, a ne edinica !?}
BlockWrite(ToF, B, Length(B));
CloseFile(ToF);
AssignFile(ToF, 'c:\test.txt');
Reset(ToF, FileSize(ToF) div sizeof(Cardinal)); ); { ti kakvo mislish !? }
SetLength(C, FileSize(ToF) div sizeof(Cardinal));
BlockRead(ToF, B, FileSize(ToF));
CloseFile(ToF);
end;
E da no kato si zadam takuv RecordSize i Rewrite mai bugvashe. To mai bugvashe nan kakvoto i da mu zadam :(
A kato mu go mahnah mai sloji samo 1-2 Cardinals
Sujalqvam, no nqmam mnogo dostup do PC-to i ne moga da pisha tochno. Drugata sedmica moje bi shte buda po-konkreten, no naistina imashe problemi s Pascal funkciite za rabota s failove.
by Waz Gaa
[email protected]
Re: Neshto ne stana tova
Като гледам не си чел внимателно ;-)))
Погледни разликите - типизиран файл - и нетипизиран - май това беше побългарения термин - когато имаш F:File - можеш да ползваш Rewrite(F,1) или n на мястото на 1. В другия случай - File of any_type - тогава не можеш да ползваш Rewrite с 2 параметъра.
Така, че не се мъчи да задаваш размер на буфера в Rewrite - нямаш прекалено голяма нужда от оптимизация - ако зареждането на индексния файл - не отнема повече от 3-4 сек.
---
Е т'ва е живот!
Погледни разликите - типизиран файл - и нетипизиран - май това беше побългарения термин - когато имаш F:File - можеш да ползваш Rewrite(F,1) или n на мястото на 1. В другия случай - File of any_type - тогава не можеш да ползваш Rewrite с 2 параметъра.
Така, че не се мъчи да задаваш размер на буфера в Rewrite - нямаш прекалено голяма нужда от оптимизация - ако зареждането на индексния файл - не отнема повече от 3-4 сек.
---
Е т'ва е живот!
Re: Neshto ne stana tova
Помисли върху разликата м/у
type
TIndexFile = array of Cardinal;
var
F: file of TIndexFile;
и
type
TIndexFile = array [0..SizeOfMyArray] of Cardinal;
var
F: file of TIndexFile;
type
TIndexFile = array of Cardinal;
var
F: file of TIndexFile;
и
type
TIndexFile = array [0..SizeOfMyArray] of Cardinal;
var
F: file of TIndexFile;
Редактирано от NDeu на
Re: Nachi moq kod...
Taq tema se wlachi mnoo dalgo ......
btw imam meta simwoli
az pone taka go prawq
------------------------------
I got a COMPILER, and I'm not afraid to use it!
btw imam meta simwoli
[pre] ...polzwajte gi inache koda za load e:
type MyType=cardinal;
const FileName='alabla.dat';
var
f:File;
data:Array of MyType;
cnt:cardinal;
res:integer;
begin
assignfile (f,FileName);
ioresult=0; //cleanup ioresult
{$I-}
reset (f,1);
if ioresult<>0 then begin
Writeln ('File not found!');
exit;
end;
{$I+}
if filesize(f) mod sizeof (MyType)<>0 then begin
Writeln ('Wrong file format');
CloseFile (f);
exit;
end;
cnt:=filesize(f) div sizeof (MyType);
setlength (data,cnt); // Az lichno winagi polzwam pointeri i adresna aritmetika
// koeto nalaga po-dolo da se oswobojdawa i pametta pri greshka
blockread (f,data[0],filesize(f),res);
if res<>filesize(f) then begin
Writeln ('I/O Error');
CloseFile (f);
exit;
end;
CloseFile (f);
///moje da se polzwt danite kato cnt e braoq na zapisite
.....
end.
az pone taka go prawq
------------------------------
I got a COMPILER, and I'm not afraid to use it!
Re: Nachi moq kod... има поне 2 bug-а :)
Цитирам:
Виж и на SDR кода, той е по-добре защитен от грешки, идващи от некоректен файл.
var
ToF: file;
B, C:array of Cardinal;
i:integer;
begin
SetLength(b, 10);
for i:=0 to Length(b) do // -1, ама то е ясно че го знаеш, не се заяждам
B[_i_]:=1; // towa da se 4ete bez pod4ertawkite
AssignFile(ToF, 'c:\test.txt');
Rewrite(ToF, Length(B)); { записът ти трябва да е или 1, или SizeOf(Cardinal) }
BlockWrite(ToF, B, Length(B)); { на BlockRead или BlockWrite трябва да подаваш
B[0], иначе няма да ти сметне вярно адреса.
Виж си в help-а и виж и кода,
който се генерира на асемблер - зарежда се адреса на
локалната променлива B, а не на първия елемент от масива }
CloseFile(ToF);
AssignFile(ToF, 'c:\test.txt');
Reset(ToF, FileSize(ToF) div sizeof(Cardinal)); ); { пак записа = 1 или SizeOf(Cardinal) }
SetLength(C, FileSize(ToF) div sizeof(Cardinal));
BlockRead(ToF, B, FileSize(ToF)); { пак B[0], и за бройката: ако записа = 1, то броя,
който подаваш = FileSize(ToF).
Ако записа ти е SizeOf(Cardinal),
то броя = FileSize(ToF) div sizeof(Cardinal) }
CloseFile(ToF);
end;
Виж и на SDR кода, той е по-добре защитен от грешки, идващи от некоректен файл.
Re: Neshto ne stana tova
hehe, to tuk purvoto nqma da trugne. tova go usetih, no deto vika PhantomAS, ne se seshtam dali sum naglasql file of . Ne bi trqbvalo da sum go tipizziral, tochno zashtoto shte mi izkochi tozi problem s inicializaciqta na tipa.
Po tozi vupros neshto ne sum siguren
by Waz Gaa
[email protected]
Po tozi vupros neshto ne sum siguren
by Waz Gaa
[email protected]
OK 10x
nachi tova e kod ? ;)
begin
hehe
end;
Kakto vidq tuk sum si go pisal, che e netipizaran faila. Nachi problema e bil v tova B[O]. I zatova vuv indexniq fail mi se izpisvaha samo 1-2 bytes. Qvno toi e zapisval adresa na array-a.
Kolkoto do Rewrite(F, Recsize), qvno sum vlagal drug smisul vuv parametura i zatova se poluchava greshkata. Az si misleh che trqbva da mu dam razmera na zapisa, koito shte pravq s BlockRead/Write. To i bez tova mi izlgejdashe tupo i na dvete mesta da se slaga edno i sushto chislo
by Waz Gaa
[email protected]