Wczytywanie paru bajtów

0

Mam takie dość proste pytanie lecz ja mam z nim problem :/ Jak z jakiegoś pliku (np graficznego) wczytać np dziesiąty bajt licząc od początku ?? Szukałem już na forum ale nic co by mi pomogło rozwiązać problem nie znalazłem :/ Aha zapomniałem dodać ze chce dany bajt wyświetlic jako hex

Próbowałem za pomocą TFileStream ale mi nie wyszło :/

0

jest kilka mozliwosci... ja bym to zrobil tak...
otworzyl plik fopen
potem zrobilbym fseek na poczatek pliku
a potem pokombinowalbym albo fread'em albo fsetpos'em ... i skakl co 10 bajtow ewentualnie odczytywalbym od razu 10 jako tablice liczb a potem ten ostatni konwertowalbym itoa i podal jako baze 16...
nie wiem moze jest jakis prostszy sposob... ale ja lubie kombinowac.. :-)

0

najlepiej przez ustawienie wskaznika pozycji pliku na ten bajt funkcja fseek(), odczytanie go np. getc()

hmm. ktos byl szybszy - a skasowac swego nie moge bo Kojot blad wywala

0

Jeśli jesteśmy w BCB, to najprościej tak:

TFileStream file = new TFileStream("e:\\ds.doc", fmOpenRead);
int howmany = file->Size / 10;
unsigned char
buf = new char[howmany];

for (int i = 0; i < howmany; i++) {
file->Read(&buf[i], 1);
file->Position += 9;
};

file->Free();

W tablicy buf masz wartości co 10-go bajta. Jeśli chcesz wyświetlić liczbę całkowitą jako HEX, użyj funckji globalnej HexToInt.

0

lawyer - co to za bezsensowny kod tu prezentujesz??

Bru2s - jeśli koniecznie chcesz za pomocą strumieni, to przyjrzyj się w pomocy TStream::Seek

0

fseek(plik,10,SEEK_SET); //skocz do 10 bajtu
fread(&bajt,1,1,plik); //odczytaj ten bajt - mozesz uzyc fgetc

0

Marooned - co u licha chcesz od tego kodu?! Nie lubisz TFileStream, czy co?

0

Marooned - co u licha chcesz od tego kodu?! Nie lubisz TFileStream, czy co?

Chodzi o odczytywanie bajt po bajcie (no, kilka bajtow). Po co tak, skoro az do 10 bajtu informacje go nie obchodza. Lepiej uzyc juz jakiejs wersji seek'a.
Ja bym uzyl metody cepy, tylko od razu te 2 bajty odczytal:
unsigned int slowo;//mam nadzieje, ze na tej platformie ma rozbmiar 2 bajtow :P
fseek(plik,10,SEEK_SET); //skocz do 10 bajtu
fread(&slowo,sizeof(int),1,plik);//odczyta 1 slowo, czyli u nas 2 bajty
printf("%x", slowo);//wyswietli w postaci szesnastkowej

0

Wrrrrr, dobra teraz widzę: przeczytałem pytanie Bru2sa jako "co 10 bajt", a nie "np 10 bajt"; i do takiego pytania napisałem BARDZO SENSOWNY kod. Ale w takim razie powinno być:

TFileStream *file = new TFileStream("e:\\ds.doc", fmOpenRead);
file->Position = 10;
...i odczytać przez file->Read(...

Można też użyć Seek - wyjdzie na to samo, ale Position jest jakby bardziej czytelne.

A żeby było już całkiem ściśle: 10-ty z kolei bajt (porządkowo) ma jednak numer 9, więc Position należy wstępnie ustawić na 9.

0

Wrrrrr, dobra teraz widzę: przeczytałem pytanie Bru2sa jako "co 10 bajt", a nie "np 10 bajt"; i do takiego pytania napisałem BARDZO SENSOWNY kod. Ale w takim razie powinno być:

TFileStream *file = new TFileStream("e:\\ds.doc", fmOpenRead);
file->Position = 10;
...i odczytać przez file->Read(...

Można też użyć Seek - wyjdzie na to samo, ale Position jest jakby bardziej czytelne.

Z Position moze byc problem. Position powinno byc uzywane praktycznie tylko do odczytu pozycji. Strumien w pamieci przechowuje jedynie fragment pliku. Jezeli uzyjemy Seek, to do bufora strumienia zostanie zaladowany odpowiedni fragment pliku od wskazanej pozycji. Jezeli natomiast uzyjemy Position wskazujac na fragment, ktorego nie ma jeszcze w buforze, to mozemy miec blad (chociaz pewnie implementacja Position jest na tyle bystra, ze sama doladuje brakujacy fragment). Inna sprawa, jezeli position przestawi wskaznij juz w biezacym buforze. Jezeli ustawi np. na koniec bufora, to przy probie odczytu zaistnieje koniecznosc wczytania fragmentu pliku, co wiaze sie z opoznieniami. Stosujac Seek w wolnej chwili, mozna zwiekszyc odrobine wydajnosc.
Oczywiscie tutaj od razu po Seek/Position mamy Read, wiec nie ma to wiekszego znaczenia, ale chcialem zaznaczyc, ze to, czy cos jest bardziej czytelne czy mniej zalezy od czytajacego i kierowac sie nalezy predzej wydajnoscia (oczywiscie w jakims zastosowaniu lepsze byloby Position).

//no to Kuba okazał się moim prawnikiem (lawyer) :) - o to właśnie mi chodziło - m.M

0

Dzięki wam :) Użyłem metody cepy i działa super :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1