Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

binarni fajl kao string (Ansi String)

[es] :: Pascal / Delphi / Kylix :: binarni fajl kao string (Ansi String)

[ Pregleda: 3929 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

byTer

Član broj: 10936
Poruke: 1221
*.nat-pool.so.sbb.co.yu.

ICQ: 47761626


Profil

icon binarni fajl kao string (Ansi String)21.10.2004. u 17:07 - pre 236 meseci
Koja je procedura da prebacim binarni fajl u string pošto do sada nisam uspeo ni na jedan način. Znači otvaram fajl ili sa AssignFile ili sa TFileStream.Create. NI na jedan način nisam došao do rešenja. Da li je ovo uopšte moguce i ako jeste kako?
 
Odgovor na temu

bancika
Branislav Stojkovic

Član broj: 24844
Poruke: 631
*.vdial.verat.net.

Sajt: www.diy-fever.com


+1 Profil

icon Re: binarni fajl kao string (Ansi String)21.10.2004. u 19:54 - pre 236 meseci
cekaj, nisi bas jasan, pominjes stringove a pises TFileStream
da otvoris fajl (tekstualni) se koristi
Code:

var f: TextFile
...
AssignFile(F,'c:\autoexec.bat');
Reset(F); //ili Rewrite za upis ili Append za dodavanje na kraj
...
CloseFile(F);

a ako hoces da koristis TFileStream
Code:

var f: TFileStream; 
     s: string;
...
F := TFileStream.Create('C:\test.txt', fmOpenRead);
try
  //obrada
  //F.Seek za pozicioniranje u strimu
  //F.Read za citanje za pozicije
  //F.Write za upis, pogledaj help za sintaxu 
  //za upis u string ide:
  F.Read(s, F.Size);
finally
  F.Free;
end

mozda sam se negde zeznuo u kucanju, ali je princip bitan :)
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
 
Odgovor na temu

Milos D
Beograd

Član broj: 5621
Poruke: 280
*.6.eunet.yu.



+1 Profil

icon Re: binarni fajl kao string (Ansi String)24.10.2004. u 10:25 - pre 236 meseci
Probaj, ja ovo doduse koristim za tekst, a ne binarni sadrzaj.
Code:

function FileToStr (FileName : string): string;
var f : TFileStream;
begin
   result := '';
   if not FileExists(FileName) then exit;
   f := nil;
   try
     f := TFileStream.Create (FileName, fmOpenRead);
     SetLength (result, f.size);
     if f.size>0 then f.read (result[1], f.Size);
   except

   end;
   f.free;
end;
 
Odgovor na temu

byTer

Član broj: 10936
Poruke: 1221
*.nat-pool.so.sbb.co.yu.

ICQ: 47761626


Profil

icon Re: binarni fajl kao string (Ansi String)24.10.2004. u 20:59 - pre 236 meseci
Dobro, ovo sam sam resio. E sad kako da uradim sledece.
String koji dobijem je razlicite velicine. Kako da definisem variant record (javlja mi gresku pri deklarisanju promenljive) da snimim taj string u fajl?
 
Odgovor na temu

bancika
Branislav Stojkovic

Član broj: 24844
Poruke: 631
*.vdial.verat.net.

Sajt: www.diy-fever.com


+1 Profil

icon Re: binarni fajl kao string (Ansi String)24.10.2004. u 23:25 - pre 236 meseci
za snimanje u fajl bih ti preporucio da radis sa XML-om, nekako je mnogo elegantnije nego fajl slogova (uz to, string u slogu mora biti onaj "starovremski", ogranicen na 255 karaktera")
Ride the rainbow, crack the sky

DIY gitare, pojacala i efekti www.diy-fever.com
 
Odgovor na temu

byTer

Član broj: 10936
Poruke: 1221
*.nat-pool.so.sbb.co.yu.

ICQ: 47761626


Profil

icon Re: binarni fajl kao string (Ansi String)25.10.2004. u 11:17 - pre 236 meseci
Ne. Potrebno mi je da taj fajl bude bas binaran, posto sadrzi i zip datoteku ukljucenu u sebe, ne bi islo sa xml-om. A sto se tice recorda mozes napraviti array of chars pa da to sve smestis u takav jedan niz slovo po slovo.

Fora kod mene je sto ne znam nikad kolike ce velicine da bude fajl pa tako ne znam kako da definisem record a da nema mnogo praznog prosora.

Jos jedan problem koji se namece je nemogucnost ucitavanja velikog binarnog fajla u ram. Mozda bi mogo preko pointera da se uradi da se cita sa diska, ali o tom cu razmisljati kasnije.
 
Odgovor na temu

sasas
Saša Slavnić
radim za neke švabe

Član broj: 35478
Poruke: 617
*.zaslon-telecom.si.



Profil

icon Re: binarni fajl kao string (Ansi String)25.10.2004. u 11:38 - pre 236 meseci
Citat:
byTer
napraviti array of chars pa da to sve smestis u takav jedan niz slovo po slovo.

Fora kod mene je sto ne znam nikad kolike ce velicine da bude fajl pa tako ne znam kako da definisem record a da nema mnogo praznog prosora.

Jos jedan problem koji se namece je nemogucnost ucitavanja velikog binarnog fajla u ram. Mozda bi mogo preko pointera da se uradi da se cita sa diska, ali o tom cu razmisljati kasnije.


Kako ucitavas fajl? Ako ga ucitavas u array, koristi VarArrays, nesto ovako:

var c: array of char;

SetLength(c, velicinafajlaubajtima);

ovakav array moze biti veeeeeliki (koliko god memorije imas, mislim).

ne znam koliko ti ovo pomaze...

ss.
When something is hard to do, then it's not worth doing.
 
Odgovor na temu

byTer

Član broj: 10936
Poruke: 1221
*.nat-pool.so.sbb.co.yu.

ICQ: 47761626


Profil

icon Re: binarni fajl kao string (Ansi String)25.10.2004. u 13:04 - pre 236 meseci
Ocigledno nista. Treba mi to kod definisanja recorda... Kako li to rade mysql, kompajleri i ostali programi?!
 
Odgovor na temu

sasas
Saša Slavnić
radim za neke švabe

Član broj: 35478
Poruke: 617
*.zaslon-telecom.si.



Profil

icon Re: binarni fajl kao string (Ansi String)25.10.2004. u 13:19 - pre 236 meseci
Citat:
byTer: Ocigledno nista. Treba mi to kod definisanja recorda...


Sad mi tek nista nije jasno

A da li mozes da posaljes neki sample kood? Ili bar primer sta tacno zelis da uradis?
When something is hard to do, then it's not worth doing.
 
Odgovor na temu

byTer

Član broj: 10936
Poruke: 1221
*.nat-pool.so.sbb.co.yu.

ICQ: 47761626


Profil

icon Re: binarni fajl kao string (Ansi String)25.10.2004. u 13:32 - pre 236 meseci
Code:

type TSize = 0..5;

type Tbackup = record
  source: String[255];
  destination: String [255];
  title: String[255];
  dateCreated: TDateTime;
  noOfObj: integer;
  lastUpdate: TDateTIme;
  noOfUpdates: integer;
  version1: string[2];
  version2: string[2];
  memo: String[255];
  //data: TFileStream;
  // data: array [1..400000] of AnsiChar;
  case size: TSize of
    0: (xsdata: array [0..16384] of AnsiChar); // 16K
    1: (sdata: array[0..163840] of AnsiChar); // 160K
    2: (mdata: array[0..1638400] of AnsiChar); // 1.6M
    3: (ldata: array[0..16384000] of AnsiChar); // 16M
    4: (xldata: array[0..163840000] of AnsiChar); // 160M
    5: (hdata: array[0..1638400000] of AnsiChar); // 1.6G
end;


O ovome se radi. Samo recimo ako imam fajl od 170 k glupo bi bilo da fajl bude 1.6 MB, vec da se to nekako resi. A i ovakav record kod deklarisanja daje 'stack overflow' gresku.
 
Odgovor na temu

broker

Član broj: 2415
Poruke: 8514
212.62.59.*



+11 Profil

icon Re: binarni fajl kao string (Ansi String)25.10.2004. u 14:26 - pre 236 meseci
Ako je datoteka binarna a ne tekstualna onda je tretiraj kao takvu a podatke ciitaj sa BlockRead i pisi sa BlockWrite. Tako nece imati nikakvih ogranicenja i moci ces da baratas sa podacima bilo kakve strukture ili duzine.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
217.119.242.*



+62 Profil

icon Re: binarni fajl kao string (Ansi String)25.10.2004. u 15:20 - pre 236 meseci
E...ovo je toliko nespretno, da nemam reci. Pa sta si ti mislio, da mozes da kazes samo
Code:

  write(anyFile, MyVarRecord);


i da ti on ispise u jednom potezu 1.6 GB u fajl? Kamo srece da je to moguce.
Umesto TBackup recorda napravi TBackup klasu, koja sadrzi sve sto si naveo, plus umesto buffer-a, neka sadrzi STRING (nema boljeg dinamickog buffer-a), plus metode za otvaranje fajla, ispis u njega i zatvaranje istog. Ispis string-buffer-a ces raditi sa BlockWrite (nego kako), koje je uzgred VEOMA brz ispis (nema nikakvih provera tipova ni velicine; takodje DIREKTAN pristup harddisku - ako se dobro secam help-a iz TurboPascal-a). E sad, ako zadas predefinisane velicine tvog stringa (prema onom case-u gore), moguce je pisanje i ucitavanje istog u JEDNOM prolazu (jedan poziv BlockWrite/BlockRead-a); sve sto ti treba je da pozicioniras file pointer na pravu poziciju (Seek). Ali, ako ucitavas/pises one sitne varijable sa BlockRead/BlockWrite, mozda ti i ne treba Seek, jer BlockXXX funkcije same pomeraju pointer po fajlu.
Uh...dosta od mene zasad.

Rajko
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
217.119.242.*



+62 Profil

icon Re: binarni fajl kao string (Ansi String)25.10.2004. u 15:26 - pre 236 meseci
Ajd' jos malo, skoro sam siguran da se neces snaci sa stringom i BlockRead/BlockWrite.
Code:

  // ajmo prvo ucitavanje iz fajla
  SetLength(mystring, AnyBigSize);
  BlockRead(anyFile, mystring[1], AnyBigSize);
  ...
  // ispis u fajl
  BlockWrite(anyFile, mystring[1], length(mystring));


Istini za volju, ovakav ispis je vrlo nesiguran (jer za veliki string ima da TRAJE), tako da je bolje izvesti seriju poziva BlockRead/BlockWrite-a sa manjom kolicinom podataka po pozivu. Na taj nacin, mozes da izvedes da ti aplikacija 'dise', pa cak i da prekines ceo postupak.

Rajko
 
Odgovor na temu

byTer

Član broj: 10936
Poruke: 1221
*.nat-pool.so.sbb.co.yu.

ICQ: 47761626


Profil

icon Re: binarni fajl kao string (Ansi String)25.10.2004. u 15:37 - pre 236 meseci
Pravljenje klase. Sta bih mogao time da postignem. I jel bih mogao objekat klase da smestim u fajla (ako da prenesem / implementiram svojstva save to file itd.)
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
*.196.eunet.yu.



+1 Profil

icon Re: binarni fajl kao string (Ansi String)25.10.2004. u 16:02 - pre 236 meseci
Da su ovako radili u Borlandu, Delphi bi bio na trzistu pola sata, a onda bi uz veliki tresak propao za sva vremena...

U svakom slucaju Rajko je u pravu, koristi BlockWrite/BlockRead, a ja savetujem da radis sa dinamickim uzimanjem memorije (GetMem/FreeMem) sa blokovima podataka razumne velicine. Dobar program je onaj koji se dobro ponasa na razlicito skaliranim masinama, a ne onaj koji u startu trazi cesto nepotrebne kolicine RAM-a/CPU-a/Diska. Naravno, tu ne mislim na softver tipa SQL server, 3DMax i slicno, vec na obicne programe. Sta ako treba da upises 500MB podataka na masini koja ima 128MB ram-a? Dobices obilno koriscenje swap fajla i degradirati performanse do nepodnosljivog nivoa ako primenis svoje resenje. Znaci sve treba deliti u manje blokove koji nece dovesti do manjka slobodnog fizickog RAM-a. Memorija je mnogo brza od diska i to uvek treba imati na umu. Probaj da ucitas u Notepad fajl od 16MB i isti fajl u npr. WinHex editor. Razlika je velika - zasto? Zato sto je WinHex pravljen da izlazi na kraj i sa malim i sa velikim fajlovima citajuci manje blokove po potrebi, dok je Notepad pravljen za citanje malih txt fajlova koji obicno nisu teski vise megabajta, pa je odluceno da ceo sadrzaj ucitava odjednom.

Inace sav upis na disk MORA da ide preko samog windows-a , tu nema pomoci ali tu je vec napravljena toliko dobra optimizacija da ti samo mozes da usporis stvar svojim resenjima, a nikako da popravis vec popravljeno.
 
Odgovor na temu

byTer

Član broj: 10936
Poruke: 1221
*.nat-pool.so.sbb.co.yu.

ICQ: 47761626


Profil

icon Re: binarni fajl kao string (Ansi String)25.10.2004. u 16:29 - pre 236 meseci
do sa block read, bock write mi se ;ini razumnim, ali necu li tao poremetiti strukturu fajla? Ili jedino da kolicina baffera bude tacno koliko i jedno polje iz one promenljive.
Moracu malo da istestiram da vidim kako radi, pa se čujemo opet.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: binarni fajl kao string (Ansi String)

[ Pregleda: 3929 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.