Proč nefunguje BlockRead? – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Proč nefunguje BlockRead? – Delphi – Fórum – Programujte.comProč nefunguje BlockRead? – Delphi – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
25. 8. 2008   #1
-
0
-

Mám následující kód

procedure TForm1.FormCreate(Sender: TObject);

var a,f:file; ar:array of char; s:longint;
begin
AssignFile(f,'bla.MP3');
Reset(f,1);
s:=FileSize(f);
SetLength(ar,s);
AssignFile(a,'neco.n');
Rewrite(a,1);
BlockRead(f,ar,s);
BlockWrite(a,ar,s);
CloseFile(a);
CloseFile(f);
end;

mělo to by zkopírovat obsah jednoho souboru do druhého. Pracuji s amorfnímy soubory a dynamickým polem, do proměnné s načtu velikost prvního souboru, podle toho zvětším dynamické pole, načtu do něj první soubor a zapíši do druhého. Bohužel to ale pořád vyhazuje nějaké chyby hned u příkazu BlockRead, navíc to ten první soubor zcela zruší, smaže jeho obsah. Nevíte někdo, proč to tak dělá?

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
Reklama
Reklama
imcold0
Newbie
25. 8. 2008   #2
-
0
-

Rewrite(f,1) si zmeň na Rewrite(a,1) - zmažeš si súbor a potom sa z neho snažíš čítať ;)

Nahlásit jako SPAM
IP: 85.216.167.–
25. 8. 2008   #3
-
0
-

Aha, to jsem si nevšiml :-), ale tohle byla stejně jen kopie, i když to spravím a napíšu to co tam má být (rewrite(a,1);), hlásí to chybu. Nemaže to teda ten původní, ale nepřekopíruje to. Zahlásí to 'I/O error 998' na tom blockreadu. Pokud to nenačítám do dynamického pole, ale mám cyklus while not(eof(f)) a překopírovávám to po bytech, jede to v pořádku, ale trvá to příšerně dlouho. Jen tak pro upřesnění, první soubor má asi 20 MB.

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
imcold0
Newbie
25. 8. 2008   #4
-
0
-

Mohol by si vyskúšať toto?

procedure TForm1.FormCreate(Sender: TObject);

var
a,f:file;
buffer:pbyte;
s:longint;
begin
AssignFile(f,'bla.MP3');
Reset(f,1);
s:=FileSize(f);
buffer := getmem(s);
AssignFile(a,'neco.n');
Rewrite(a,1);
BlockRead(f,buffer^,s);
BlockWrite(a,buffer^,s);
CloseFile(a);
CloseFile(f);
freemem(buffer);
end;

Nahlásit jako SPAM
IP: 85.216.167.–
25. 8. 2008   #5
-
0
-

Píše to "Incompatible types" na tom alokování paměti pro buffer.

Mimochodem, pbyte je ^byte? Jsem zvyklý používat new(p); a dispose(p);, takovyhle novoty jsou na mě moc :-).

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
imcold0
Newbie
25. 8. 2008   #6
-
0
-

Delphi očividne nie je freepascal :) Takže

getmem(buffer, s);
Áno, pbyte je ^byte. New(buffer) ti alokuje jeden bajt, ak je buffer typu pbyte, iirc - a to nechceme; getmem alokuje súvislú pamäť bajtov, na ktorej začiatok bude ukazovať buffer.

Nahlásit jako SPAM
IP: 85.216.167.–
Jura
~ Anonymní uživatel
634 příspěvků
25. 8. 2008   #7
-
0
-

Zdravím,

pokud ti jde pouze o kopírování a nepotřebuješ nijak dále s tím souborem pracovat, tak se nabizí využití Win API fce CopyFile.
http://msdn.microsoft.com/en-us/library/aa363851(VS.85).aspx

Nahlásit jako SPAM
IP: 85.207.192.–
26. 8. 2008   #8
-
0
-
Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
KIIV
~ Anonymní uživatel
8101 příspěvků
26. 8. 2008   #9
-
0
-

no po bytech to musi byt uzasne rychly... blockread bych radsi pouzil treba jen po usecich 64kB ... nebo podobne..
nemusis se pak starat ani o to dynamicky alokovani.. 64kB v programu nikoho nezabije :D pripadne jeste nejaky vetsi jednotky

Nahlásit jako SPAM
IP: 77.237.136.–
imcold0
Newbie
26. 8. 2008   #10
-
0
-

Vyskúšal si tú obmenu getmem s dvoma parametrami? To ti musí fungovať aj v Delphi.
KIIV: Nie je dôvod používať blockread po takých malých častiach.

Nahlásit jako SPAM
IP: 85.216.167.–
1. 9. 2008   #11
-
0
-

To imcold : Ano, přidělení paměti fungovalo, ale mělo to stejný účinek, jako to SetLength();. Pořád to píše naprosto zhovadilou chybu, našel jsem o tom na netu ještě víc, ale žádny řešení. Nemám důvod používat blockread po konstantnéch částech, když stejně vím, jak je onen soubor velký (co do počtu znaků).

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
KIIV
~ Anonymní uživatel
8101 příspěvků
1. 9. 2008   #12
-
0
-

To Garret Raziel : jenze jakou chybu to haze?

Nahlásit jako SPAM
IP: 80.250.1.–
KIIV
~ Anonymní uživatel
8101 příspěvků
1. 9. 2008   #13
-
0
-

tak sem jen provizorne zkousel a taky mi to padlo ... ale je to proto ze to haze spatnou velikost souboru...
pomohlo dat typ file of char;

procedure TForm1.Button1Click(Sender: TObject);

begin
if ( OpenDialog1.Execute ) then begin
Edit1.Text := OpenDialog1.FileName;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var f1, f2: file of Char;
buf: PChar;
velikost: Integer;
begin
if ( SaveDialog1.Execute ) then begin
AssignFile(f1, Edit1.Text );
Reset(f1);
AssignFile(f2, SaveDialog1.FileName);
Rewrite(f2);

try
velikost := filesize(f1) ;
Memo1.Lines.Append('Velikost souboru: ' + IntToStr(velikost));
GetMem(buf,velikost);
try
Blockread(f1, buf^, velikost);
BlockWrite(f2,buf^,velikost);
finally
FreeMem(buf);
end;
finally
CloseFile(f1);
CloseFile(f2);
end;
end;
end;

Nahlásit jako SPAM
IP: 80.250.1.–
imcold0
Newbie
2. 9. 2008   #14
-
0
-
Nahlásit jako SPAM
IP: 85.216.167.–
2. 9. 2008   #15
-
0
-

Už to začalo fungovat, funguje to

BlockRead(f,buffer^,s);

BlockWrite(a,buffer^,s);

jak psal imcold, já jsem se akorát ve výsledném kódu přepsal, omlouvám se za řešení vyřešeného problému. Zde je tedy můj výsledek: http://sourceforge.net/projects/stickncut

Nahlásit jako SPAM
IP: 83.240.78.–
Podpis: Do podpisu nelze vložit obrázky ani HTML kód. Je podporován nový řádek tagem
.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 22 hostů

Podobná vlákna

Proč to nefunguje — založil Radim Krsička

Proc nefunguje tento kod — založil kucape2

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý