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

fraed ne čita dobro veće sekvence

[es] :: C/C++ programiranje :: fraed ne čita dobro veće sekvence

[ Pregleda: 3309 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

darkosos
Darko Šoš
Beograd

Član broj: 5053
Poruke: 1131
*.ptt.yu



+64 Profil

icon fraed ne čita dobro veće sekvence07.02.2004. u 08:26 - pre 246 meseci
Code:

unsigned char buffer[2400];
FILE* file = fopen(...);
fread(buffer, 1, 3*640, file);

Kada sa fread čitam malo veće delove nekog fajla, buffer koji sam prosledio je samo u početku napunjen kako treba, a ostatak je onakav kakav je bio kada se buffer inicijalizovao.
Probao sam da menjam veličinu internog stream buffer-a sa setvbuf() i tu je još čudnije : povećam malo buffer, pročita malo više, povećam još - opet se vraća na staro. Na kraju sam stavio da je interni buffer tačno trećina onog što treba da iščitam i onda je prvi put pročitao dobro! (radi se o .bmp fajlu širine 640 sa 24 bita po pixelu - treba da učitam jedan red fajla tj. 3*640 bajtova; stavio sam da je interni buffer 640).
Šta se dešava i kako rešiti generalno?
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.attbi.cable.earthlink.net



+18 Profil

icon Re: fraed ne čita dobro veće sekvence07.02.2004. u 08:58 - pre 246 meseci
Daj malo vise detalja. Izgleda kao da si stigao do kraja fajla.
 
Odgovor na temu

darkosos
Darko Šoš
Beograd

Član broj: 5053
Poruke: 1131
*.ptt.yu



+64 Profil

icon Re: fraed ne čita dobro veće sekvence07.02.2004. u 10:25 - pre 246 meseci
Ma jok brate mili. To je sve : otvorim .bmp fajl, pročitam header - znam širinu, visinu, broj bitova i gde počinje slika. Onda odem na pola slike i pročitam jedan red - tu nema greške jer ono što radim i vizuelizujem (menjam samu sliku), tako da lepo mogu da vidim da je pročitao red otprilike nešto manje od pola a da je ostatak iskulirao - proverio sam i trace-om. Tek kada sam stavio da je stream buffer 640 (to mi je onako palo na pamet, jer je slidža 640x480), pročitao je lepo celu liniju. E sad, ja ne bik da gledam u suljpa kol'ki treba da bude taj njegov buffer da bi se on smilovao.
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.attbi.cable.earthlink.net



+18 Profil

icon Re: fraed ne čita dobro veće sekvence07.02.2004. u 18:54 - pre 246 meseci
Darko, to sto opisujes je stvarno vrlo cudna pojava, pogotovu sto prakticno svi programi koriste fread na ovaj ili onaj nacin. Ako te ne mrzi, zakaci sors ili sliku (ili stavi link), pa da pogledamo.
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.oak.inreach.net



+1001 Profil

icon Re: fraed ne čita dobro veće sekvence07.02.2004. u 19:14 - pre 246 meseci
Darko,

problem najverovatnije nije do fread i fwrite koji su verovatno najbrze,
najstandardnije i najpouzdanije funkcije kojima se pristupa sadrzaju fajlova.

Sta moze da bude problem i kako ga napipati:

1) Proveri vrednost koju fread vraca, sto bi trebalo da bude jednako broju
ocitanih kolicina transfera (drugi argument je sizeof(kolicina) a treci argument je
broj kolicina). Ako fajl ima problema, ovaj broj ce biti manji nego sto treba.

ili

2) Ocitaj sve lepo u bafer, pa sadrzaj bafera upisi u neki temp binarni fajl. Uzmi
hex editor pa uporedi sa sadrzajem originalnog fajla - vidi da li je tacno ocitano
onoliko koliko si zahtevao. Ako jeste, problem je u interpretaciji ocitanih podataka.

Meni se cini da:
3) Imas nepouzdan metod za odredjivanje sta je i koliko ocitano - uzdas se u svoj
program koji crta nesto na ekranu. Ako predpostavimo da si ga potpuno dobro
napisao, ostaje potencijalni problem sto se Windows bitmape javljaju u raznim
formatima, od kojih neki postuju pravilo o 32-bit alignment-u cele linije.

Koliko vidim iz primera, posto ucitavas 3*640 bajtova, podrazumevas da je bitmapa
u formatu RGB888, sto mozda nije slucaj sa fajlom kojeg otvaras.

(prekopao sam svoje beleske, i cini mi se da RGB888 nema 32-bit alignment zahtev,
ali proveri i ti).

Nadam se da sam ti dao dobar putokaz. Javi sta si dalje uradio.
 
Odgovor na temu

darkosos
Darko Šoš
Beograd

Član broj: 5053
Poruke: 1131
*.ptt.yu



+64 Profil

icon Re: fraed ne čita dobro veće sekvence08.02.2004. u 09:25 - pre 246 meseci
Danke na odgovorima. Evo kako stvari stoju:

-100% sam siguran da nije dobro pročitano-prvo zbog onoga što vidim sa slike; evo najjednostavnije situacije: pročitaš liniju, izmeniš buffer koji si dobio i vratiš to u file, koji je još uvek otvoren, na isto mesto-i onda vidiš da je odrađen samo deo posla; takođe u trace-u se lepo vidi ista stvar, tj. da je buffer samo u početku dobar

-'ajd da sam i nešto pogrešio na nekom drugom mestu, ali je sve proradilo onog trenutka kada sam stavio setvbuf(file, NULL, _IOFBF, 640); dakle nije bio problem u ostatku koda, već u samom čitanju iz fajla
(proveriću da li postoji u okolini neki jak izvor polja neverovatnoće)

Pošto sam već rešio na opisani način i nastavio dalje, nemam neki poseban motiv da se vraćam na kod koji ne radi, ali ću se potruditi u čisto naučne svrhe (valjda). Ima još jedna interesantna stvar: kakva je razlika između sledećih poziva (m!=n)
Code:

fread(buffer, m, n, file);
fread(buffer, n, m, file);
fread(buffer, 1, m*n, file);
fread(buffer, m*n, 1, file);
?
(ne mislim na ovu očiglednu, formalnu stranu)
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.adsl.zonnet.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: fraed ne čita dobro veće sekvence08.02.2004. u 10:41 - pre 246 meseci
Citat:
(proveriću da li postoji u okolini neki jak izvor polja
neverovatnoće)


Darko, umesto toga bolje je da proveriš da li u tvom programu postoji
jak izvor polja bagova.

Ti si naravno odmah po čitanju, jel tako, proverio šta vraćaju funkcije
ferror() i feof()? I naravno si proverio da je FILE stream
u redu, pre nego što si ga iskoristio kao argument za fread?
errno naravno ne pokazuje da je pre ulaska u fread nastala greška? Ove
provere moraš da imaš u kodu i da znaš koje vrednosti vraćaju ove
funkcije pre nego što kreneš išta dalje da radiš, nagađaš, povećavaš
bafer i sl.

Citat:
svrhe (valjda). Ima još jedna interesantna stvar: kakva je razlika između sledećih poziva (m!=n)


Ako pročitaš man stranu za fread, videćeš da vraća size_t sa brojem pročitanih slogova. Takođe ako pročitaš man stranu videćeš da fread nigde ne garantuje isporuku baš svih slogova koje si tražio:

Citat:

The fread() function reads into an array pointed to by /*ptr*/
up to /*nitems*/ items of data from /*stream*/, where an item of
data is a sequence of bytes (not necessarily terminated by a
null byte) of length /*size*/. It stops reading bytes if an
end-of-file or error condition is encountered while reading
/*stream*/, or if /*nitems*/ items have been read.


f

 
Odgovor na temu

darkosos
Darko Šoš
Beograd

Član broj: 5053
Poruke: 1131
*.ptt.yu



+64 Profil

icon Re: fraed ne čita dobro veće sekvence08.02.2004. u 16:13 - pre 246 meseci
Hm. zašto tako ironično filmile? Možda loš dan...

Rešio sam misteriju. Stvar je u tome da se file podrazumevano otvara u text modu! Ne znam da li je to tako u svim kompajlerima, ali eto to je rešenje - sve ostalo radi kako valja (čisto zbog zlih jezika). Debelo sam se pomučio da bih to otkrio (jerbo nisam čitao šta piše sitnim slovcima na kraju strane :). Trace-ovao sam fread - ko je to radio zna kako je duboko - i vidim da dobro pročita, ali posle vrši konverziju kao za tekst mod. I naravno, odmah mi je bilo jasno da mu je neko rekao da čita fajl kao tekst, a to nisam bio ja (bar ne namerno)

I za ovo poslednje, čini mi se filmile da nisi razumeo šta sam hteo da kažem: razlika u vraćenom broju pročitanog je očigledna. Mene interesuje implementacija. Dakle izgleda da je praktično sve jedno kako ćeš čitati. Da li se performanse menjaju?
Prikačeni fajlovi
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.adsl.zonnet.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: fraed ne čita dobro veće sekvence08.02.2004. u 18:47 - pre 246 meseci
Citat:
Što ovako oštro? Mislim sa toliko ironije? K'o da sam dirnuo u
neku svetinju... A i nisam baš početnik da bih pravio takve
greške-naravno svima se dešava,


Ao, Darko, nije valjda delovalo tako gadno?!

Sad čitam ponovo i, da, falio bi tu i još neki smajli. S obzirom da smo
nas dvojica razmenili poprilično poruka ovih meseci, oko raznih stvari,
računao sam da smo ovde naši, pa da mogu da zamahnem malo jače a da se
niko ne uvredi. :) Još uvek se nadam da ne grešim? U svakom slučaju
izvinjenje ako je delovalo netaktično — nije bilo s takvom namerom.

Citat:
Pogledaj dobro šta sam napisao - dakle postavljanjem stream buffer-a na
....
može da "ispravi" moj kod, koji je grešan?


Sad, „metodom gledanja u ništa“ :) se malo šta može reći o eventualnoj
grešci pa zato ne budi ti teško baci ovamo link na pokvareni kod pa da
gledamo dalje.

U vezi sa ovim problemom pročitavam evo iksti put man za fread, ali
nigde zaista ne piše da fread, u slučaju da ferror i feof ne vrate
grešku, obavezno vraća baš onoliko slogova koliko si tražio da se
pročita. Ljudi inače obično čitaju tako što postave fread u petlju koja
u svakom prolasku kroz fread oduzme od konačnog broja slogova, nešto poput:
Code:

n = broj_slogova;
while (n > 0) {
n -= fread(...);
}


Hoću da kažem da u slučaju interakcije sa FILE* treba podići koeficijent
cepidlačenja na maksimum :) i tada je obično sve u redu.

Citat:
implementacija. Dakle izgleda da je praktično sve jedno kako ćeš čitati. Da li se performanse menjaju?


Ne držim na disku raspakovan izvorni kod libca, tako da je odgovor - ne znam. Ali uzdam se (između ostalih) u imenjaka koji je već nekoliko puta uskočio sa pravim tumačenjem na pravom mestu.

f

 
Odgovor na temu

darkosos
Darko Šoš
Beograd

Član broj: 5053
Poruke: 1131
*.ptt.yu



+64 Profil

icon Re: fraed ne čita dobro veće sekvence08.02.2004. u 18:52 - pre 246 meseci
Da, delovalo je netaktično pa sam i ja malo bio taki i zato promenih poruku. A tu je i mali .mp3 svojeručno odsvirat u znak pomirenja ;)
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
62.108.111.*



Profil

icon Re: fraed ne čita dobro veće sekvence09.02.2004. u 23:41 - pre 246 meseci
Citat:
darkosos:
Code:

unsigned char buffer[2400];
FILE* file = fopen(...);
fread(buffer, 1, 3*640, file);

Kada sa fread čitam malo veće delove nekog fajla, buffer koji sam prosledio je samo u početku napunjen kako treba, a ostatak je onakav kakav je bio kada se buffer inicijalizovao.
Probao sam da menjam veličinu internog stream buffer-a sa setvbuf() i tu je još čudnije : povećam malo buffer, pročita malo više, povećam još - opet se vraća na staro. Na kraju sam stavio da je interni buffer tačno trećina onog što treba da iščitam i onda je prvi put pročitao dobro! (radi se o .bmp fajlu širine 640 sa 24 bita po pixelu - treba da učitam jedan red fajla tj. 3*640 bajtova; stavio sam da je interni buffer 640).
Šta se dešava i kako rešiti generalno?


BMP je binarni file. Otvori ga sa fopen("xxx.bmp", "rb");
Pogledaj dokumentaciju BMP-a. Mislim da ima padding bajtova na kraju reda,
tako da svaki red pocinje sa offseta koji je deljiv sa 4.

Meni fread nikad nije pravio probleme... Mislim da imas cudan bug u programu.

yooyo

 
Odgovor na temu

darkosos
Darko Šoš
Beograd

Član broj: 5053
Poruke: 1131
*.ptt.yu



+64 Profil

icon Re: fraed ne čita dobro veće sekvence10.02.2004. u 09:29 - pre 246 meseci
Ma da :)
Čudan bug je to što nisam stavio da otvori file kao binarni, a podrazumeva se da ga otvora u text modu (ako ne kažeš 'oću ovako ili onako). Mada je takođe veoma čudno što menja ponašanje u zavisnosti od veličine stream buffer-a, ali to je sad samo kuriozitet ;)
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
62.108.111.*



Profil

icon Re: fraed ne čita dobro veće sekvence10.02.2004. u 09:48 - pre 246 meseci
Citat:
darkosos:
Ma da :)
Čudan bug je to što nisam stavio da otvori file kao binarni, a podrazumeva se da ga otvora u text modu (ako ne kažeš 'oću ovako ili onako). Mada je takođe veoma čudno što menja ponašanje u zavisnosti od veličine stream buffer-a, ali to je sad samo kuriozitet ;)


Nemoj da se cudis... ako se file otvori za citanje u textualnom modu onda
io funkcije menjaju kontrolne sekvence (npr: \n) u odgovarajuce kodove
u zavisnosti od platforme (0x0d 0x0a u windozima). Ako se u tvom bmp fajlu
slucajno pojavi (\n) onda procitani podaci nisu ispravni.

Setvbuff postavlja velicinu read-ahead buffera, tj neku vrstu cache-a.

yooyo
 
Odgovor na temu

[es] :: C/C++ programiranje :: fraed ne čita dobro veće sekvence

[ Pregleda: 3309 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

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