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

O5 binarno ucitavanje fajlova

[es] :: C/C++ programiranje :: O5 binarno ucitavanje fajlova

Strane: 1 2

[ Pregleda: 4657 | Odgovora: 24 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.76.eunet.yu.



+9 Profil

icon O5 binarno ucitavanje fajlova30.08.2005. u 15:18 - pre 226 meseci
U sta da smestim neki otvoreni binarni fajl? Npr, hocu binarno da otorim neki png... pokusao sam tako nesto da smestim u char*, ali to nije to to...znaci, hteo bih da smestim sadrzaj tog fajla negde, a onda da ga upisem binarno opet...i da novi fajl funkcionise bez problema...
Neka ideja?

Hvala unapred.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: O5 binarno ucitavanje fajlova30.08.2005. u 15:43 - pre 226 meseci
U kom jeziku programiras, C ili C++?
Koji kompajler ili biblioteku(e) koristis?

Na C++ jeziku se ista stvar moze uraditi na nekoliko nacina...

Na primer, na C++ Builder-u, tvoj 'problem' bih zapoceo klasama:

TMemoryStream ili
TFileStream

... one opet imaju *skoro sve* sto ti je neophodno za manipulaciju podacima
nad kojima rade.


// NETESTIRANO

Code:

TMemoryStream *MS = NULL;

try
{
   try
   {
      MS = new TMemoryStream;
      MS->LoadFromFile( "C:\\nekifajl.png" );

      // TMemoryStream ima sve sto je neophodno za...
      // manipulaciju podacima: pomera blokove memorije, kopira, uklanja, ...
      // skracuje velicinu buffera, povecava velicinu buffera, pristupa pojedinacnim...
      // elementima... itd ...

      MS->SaveToFile( "C:\\nekifajl.png" );
   
   }
   catch ( const Exception &e )
   {
      // Greska pri otvaranju datoteke...
   }
}
__finally
{
   if ( MS )
      delete MS;
}


... inace sve si to mogao da uradis i preko char*, ali uz mnogo vise muke,
sto se narocito odnosi na povecavanje buffer-a... Dakle, mnoge metode bi
morao da uradis sam - za cije babe zdravlje?

P.S. Sto se tice otvaranja PNG fajla... Ne znam kako PNG format belezi podatke,
ali pazi, neke izmene na jednom mestu mozda moraju i negde drugde da se zabeleze kao nekavi checksum-i i sl..

Zato pogledaj
http://www.wotsit.org
...da proucis prvo format...
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.76.eunet.yu.



+9 Profil

icon Re: O5 binarno ucitavanje fajlova30.08.2005. u 15:51 - pre 226 meseci
Moja greska sto nisam naveo... da C++ je u pitanju, a koristim samo gcc...
E sada, zar se velicina buffera ne odredjuje unapred pre samog punjenja odredjivanjem velicine fajla? Hm..mislio sam da nije toliko bitno da li je PNG ili ma koji izvrsni fajl. Kako bi se to resilo samo sa fstream klasom?
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.76.eunet.yu.



+9 Profil

icon Re: O5 binarno ucitavanje fajlova30.08.2005. u 15:56 - pre 226 meseci
Dakle, evo kako bi to otprilike islo, ali postoji problem...

Code:

long size;
char *buffer;
fstream file("nekiizvrsnifajl",ios::in|ios::binary);
file.seekg(0,ios::end);
size = file.tellg();
file.seekg(0,ios::beg);
buffer = new char[size];
file.read(buffer,size);
file.close();


Medjutim, i posle ovoga buffer nije ispunjen celim sadrzajem i njegova velicina definitivno nije ista kao velicina fajla...

[Ovu poruku je menjao Goran Arandjelovic dana 30.08.2005. u 16:56 GMT+1]
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bowneglobal.com.



+6 Profil

icon Re: O5 binarno ucitavanje fajlova30.08.2005. u 16:14 - pre 226 meseci
Code:
std::vector<unsigned char>

 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: O5 binarno ucitavanje fajlova30.08.2005. u 16:33 - pre 226 meseci
Tvoj kod mi deluje OK, i onako odokativno - siguran sam da sve lepo radi, jedino
ponekad je pametnije smestati podatke u 'unsigned char'...

Zasto mislis da velicina buffer-a ne odgovara velicini fajla?
Jesi li probao sa nekim probnim ispisom na ekran, da uporedis?

Inace TMemoryStream moze da menja velicinu buffer-a i to mu je jedana od
lepsih osobina...

 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.76.eunet.yu.



+9 Profil

icon Re: O5 binarno ucitavanje fajlova30.08.2005. u 16:34 - pre 226 meseci
Aha... ali jel opet treba da kastujem u char*?

Code:

vector<unsigned char>fajl;
file.read((char*)&fajl, size);


ili sam pogresno shvatio...

[Ovu poruku je menjao Goran Arandjelovic dana 30.08.2005. u 17:35 GMT+1]
 
Odgovor na temu

bzero
dev null
europe

Član broj: 5907
Poruke: 371
*.pat-pool.nsad.sbb.co.yu.

Jabber: bzero@elitesecurity.org
Sajt: www.google.com/search?q=b..


Profil

icon Re: O5 binarno ucitavanje fajlova30.08.2005. u 17:00 - pre 226 meseci
Citat:

Code:

long size;
char *buffer;
fstream file("nekiizvrsnifajl",ios::in|ios::binary);
file.seekg(0,ios::end);
size = file.tellg();
file.seekg(0,ios::beg);
buffer = new char[size];
file.read(buffer,size);
file.close();


Medjutim, i posle ovoga buffer nije ispunjen celim sadrzajem i njegova velicina definitivno nije ista kao velicina fajla...


Kako si odredio velicinu buffera i da nije ispunjen celim sadrzajem fajla?
Sta se desi kada odmah ispod gornjeg koda dodas sledece:

Code:

fstream outfile("copy_of_file", ios::out|ios::binary);
outfile.write(buffer,size);
outfile.close();


Trebao bi da dobijes kopiju originalnog fajla. Mozda si koristio neku string funkciju za rad sa buffer-om, kao strlen, sto nece raditi kako treba, jer ce one da rade samo do prvog null karaktera u bufferu.


Never trust an operating system you don't have sources for.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bowneglobal.com.



+6 Profil

icon Re: O5 binarno ucitavanje fajlova30.08.2005. u 17:06 - pre 226 meseci
Ne tako. U stvari, ja bih koristio funkciju get da čitam jedan po jedan bajt i dodajem ga u vektor. Ako se ispostavi da je to sporo, možeš da probaš da čitaš "na komade" sa npr funkcijom readsome pa da kopiraš u vektor.
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.247.EUnet.yu.



+9 Profil

icon Re: O5 binarno ucitavanje fajlova30.08.2005. u 17:47 - pre 226 meseci
Citat:
bzero:
Trebao bi da dobijes kopiju originalnog fajla. Mozda si koristio neku string funkciju za rad sa buffer-om, kao strlen, sto nece raditi kako treba, jer ce one da rade samo do prvog null karaktera u bufferu.


Ne dobija se kopija originalno fajla. Znam da je moglo da se desi nesto sa null karakterom...
Ovaj kod odozgo je sasim ok...ali probaj da ucinis nesto sa binarnim fajlom i videces sta ce se desiti.


@Dragi Tata
Razmisljao sam i ja da to cinim sa get, ali mi je zaista delovalo kao ekstremno sporo resenje...mada ne znam ni kako tacno radi read da bih sa sigurnoscu mogao da tvrdim kolika je razlika u brzini. E sada, mozda malo van teme, ali..mozes mi reci mozda na koji nacin funcionise vector kada se dodaje element...Da li negde tamo brise ceo niz pa pravi niz nove velicine(za jedan veci)...da li to radi u odredjenim koracima od po nekoliko elemenata ili nekako drugacije? Posto bi i to onda eventualno uticalo na brzinu ako su veci fajlovi u pitanju...
 
Odgovor na temu

bzero
dev null
europe

Član broj: 5907
Poruke: 371
*.pat-pool.nsad.sbb.co.yu.

Jabber: bzero@elitesecurity.org
Sajt: www.google.com/search?q=b..


Profil

icon Re: O5 binarno ucitavanje fajlova30.08.2005. u 18:08 - pre 226 meseci
Citat:
Ne dobija se kopija originalno fajla. Znam da je moglo da se desi nesto sa null karakterom...
Ovaj kod odozgo je sasim ok...ali probaj da ucinis nesto sa binarnim fajlom i videces sta ce se desiti.


Probao sam naravno, sledeci kod kopira originalni fajl (sliku, exe, bilo sta):
Code:

#include <iostream>
#include <fstream>

using namespace std;

int main() {
    long size;
    char *buffer;

    fstream file("beep.exe", ios::in|ios::binary);
    file.seekg(0,ios::end);
    size = file.tellg();
    file.seekg(0,ios::beg);
    buffer = new char[size];
    file.read(buffer,size);
    file.close();

    fstream outfile("copy_of_file", ios::out|ios::binary);
    outfile.write(buffer,size);
    outfile.close();
    
    return 0;
}

Never trust an operating system you don't have sources for.
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.247.EUnet.yu.



+9 Profil

icon Re: O5 binarno ucitavanje fajlova30.08.2005. u 18:19 - pre 226 meseci
To je isto kao i ono sto ja napisah gore...pa zaista ne znam..jesi proverio? Taj exe fajl se pokrece bez ikakvih problema?
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.americas.bgsinternal.com.



+6 Profil

icon Re: O5 binarno ucitavanje fajlova30.08.2005. u 18:34 - pre 226 meseci
Citat:
Goran Arandjelovic:  ali..mozes mi reci mozda na koji nacin funcionise vector kada se dodaje element...Da li negde tamo brise ceo niz pa pravi niz nove velicine(za jedan veci)...da li to radi u odredjenim koracima od po nekoliko elemenata ili nekako drugacije? Posto bi i to onda eventualno uticalo na brzinu ako su veci fajlovi u pitanju...


Vektor raste eksponencijalno, a uvek možeš i da udariš jedan reserve na početku da izbegneš nepotrebne realokacije.
 
Odgovor na temu

_VampiR_
Dejan Menges
Sarajevo, BiH

Član broj: 51402
Poruke: 83
217.199.128.*



Profil

icon Re: O5 binarno ucitavanje fajlova31.08.2005. u 11:45 - pre 226 meseci
U prethodnom primjeru jedino sto bih ja jos dodao jeste alociranje buffera na velicinu fajla + 1, prije nego sto se sadrzaj datoteke kopira u buffer, to bi trebalo da radi kako treba, posto sam imao more takvih primjera u praksi.
:: Don't drink contaminated water - drink beer ::
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.40.eunet.yu.



+9 Profil

icon Re: O5 binarno ucitavanje fajlova31.08.2005. u 14:55 - pre 226 meseci
Ma da...ali nije poenta u tome. Tacno je da je mozda neophodno size povecati za jedan zbog \0 karaktera, ali je problem sto ucitavanje ne radi ni tada kako valja...Nisam bas imao vremena, ali probacu onako kako Tata rece, da punim vector bajt po bajt pa cu videti sta se desava...

[Ovu poruku je menjao Goran Arandjelovic dana 31.08.2005. u 15:55 GMT+1]
 
Odgovor na temu

bzero
dev null
europe

Član broj: 5907
Poruke: 371
*.pat-pool.nsad.sbb.co.yu.

Jabber: bzero@elitesecurity.org
Sajt: www.google.com/search?q=b..


Profil

icon Re: O5 binarno ucitavanje fajlova31.08.2005. u 16:07 - pre 226 meseci
Meni samo jos uvek nije jasno sta ne radi kako valja, jer gornji kod radi sigurno sasvim ok (slika je slika, iskopirani exe radi i isti je kao original).
Never trust an operating system you don't have sources for.
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.62.eunet.yu.



+9 Profil

icon Re: O5 binarno ucitavanje fajlova01.09.2005. u 18:23 - pre 226 meseci
Radi...opet sam sve prekucao pazljivo i sada funkcionise, ne znam sta je tacno bio problem. Moracu vise da pazim sledeci put. Moguce da se negde potkrao neki bajt, ali nije sigurno...
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.varmdo.se.

Sajt: dejan.lekic.org


+2 Profil

icon Re: O5 binarno ucitavanje fajlova02.09.2005. u 10:20 - pre 226 meseci
Slike nema smisla "ucitavati" ni u sta drugo osim u nekakav (unsigned) char[] ili u gotovo, alocirano parce memorije (sto se opet svodi na gomilu bajtova (unsigned char)).
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: O5 binarno ucitavanje fajlova02.09.2005. u 10:49 - pre 226 meseci
Da, slike nema smisla "ucitavati" ni u sta drugo osim u nekakav (unsigned) char[] ili
u gotovo, alocirano parce memorije...

Medjutim, ponekad, kada se radi o *ekstremno* velikim fajlovima, kao sto su na
primer video zapisi (>700MB), tada dinamicko alociranje celokupnog sadrzaja po
svoj prilici nece uspeti, jer nema dovoljno RAM-a, a i 'virtuelna' RAM nije
svemoguc...

Tada (umesto TMemoryStream) postoje posebne klase kao na primer kod Borland-a:

TFileStream

... koja je 'rastegljiva', i korisnik nece imati pojma da nije bas sve ucitano, a imaces
mogucnost da menjas velicinu Buffer-a, pomeras/kopiras parcice memorije
levo/desno, itd...

Pretpostavljam da sve ovo moze i sa STL, pa ako neko poznaje ovu oblast neka
baci neki link da procitam...
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.113.eunet.yu.



+9 Profil

icon Re: O5 binarno ucitavanje fajlova02.09.2005. u 16:16 - pre 226 meseci
Jasno... X Files..ne bi bilo lose da se postavi neki link o tome...resenje sa STL-om ako postoji ili neko “from scratch” resenje.

Leka je pomenuo...a ja bih da pitam..da li onda postoje specijalne strukture u koje bi se mogao ucitati neki jpg, png ili nesto drugo.. Drugim recima, kako napraviti sliku ako bi bio poznat samo RGB za jedan piksel..?
 
Odgovor na temu

[es] :: C/C++ programiranje :: O5 binarno ucitavanje fajlova

Strane: 1 2

[ Pregleda: 4657 | Odgovora: 24 ] > FB > Twit

Postavi temu Odgovori

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