TMemo i wyświetlanie plików binarnych

dział ogólny

TMemo i wyświetlanie plików binarnych

Nowy postprzez Ho88it » niedziela, 10 sierpnia 2008, 21:04

Próbowałem już wszystkiego i nie wiem jak pogodzić Stream z Memo.
Oto kod z moimi wypocinami:

Kod: Zaznacz cały
void __fastcall TForm1::Button2Click(TObject *Sender)  //open file
{
int length;
  char * dane;

ifstream plik;
plik.open("c:\test.txt",ios::binary); // otwieramy plik do odczytu binarnego

  // pobiera długość pliku:
plik.seekg (0, ios::end);

  plik.seekg (0, ios::beg);
   length = plik.tellg();
  // alokowanie pamięci:
  dane = new char [length];

  // odczyt bloku danych:
  plik.read(dane,length);
  plik.close();
  Memo1->Text = dane;
  delete[] dane;


}


Teoretycznie to powinno działać, ale w najlepszym wypadku w okienku Memo1 mam napis MZF i tyle. Pliki tekstowe wyświetla ładnie, ale nie binarki.
Avatar użytkownika
Ho88it
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): niedziela, 10 sierpnia 2008, 20:53
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: Visual Studio 2008
Visual Studio 2010
Gadu Gadu: 0
    NieznanyNieznana

Re: TMemo i wyświetlanie plików binarnych

Nowy postprzez Cyfrowy Baron » niedziela, 10 sierpnia 2008, 22:53

Nie wyświetlisz wartości binarnych w TMemo, gdyż ten obiekt obsługuje tylko kodowanie ANSI, Unicode, Unicode big endian i UTF-8, jeżeli chcesz wyświetlać wartości binarne lub hexadecymalne, to najpierw musisz dokonać konwersji tych wartości na znaki ANSI, czyli pobierasz wartość binarną, a następnie konwertujesz je na znaki ANSI (dla Windows) lub ASCI (dla DOS), czyli masz np. słowo del, jeżeli chcesz je zapisać w postaci hexadecymalnej to musisz pobrać dla każdej litery jej wartość szesnastkową, czyli:64 65 6c.
Obiekt Memo wyświetla tylko zestaw znaków ANSI.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: TMemo i wyświetlanie plików binarnych

Nowy postprzez jabu74 - ekspert » niedziela, 10 sierpnia 2008, 23:00

nie jaze ! tzn. chcialbys wyswietlic fragment tekstu w ascii (np. cyfre 1 jako $31) w Memo ? :mrgreen:
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: TMemo i wyświetlanie plików binarnych

Nowy postprzez Cyfrowy Baron » poniedziałek, 11 sierpnia 2008, 09:13

Mój błąd, nie do końca Ciebie zrozumiałem. Ładuje Ci tylko pierwsze znaki pliku binarnego, ale jak się okazuje Memo tego nie potrafi obsłużyć. Musisz posłużyć się obiektem TRichEdit ustawiając mu właściwość PlainText na true, a potem to już możesz wczytywać plik zwyczajnie:

RichEdit1->Lines->LoadFromFile("plik.bin");

Twój kod nie zadziała z RichEdit prawidłowo, prawdopodobnie nic się w nim nie pojawi.

Zarówno Memo jak i RichEdit nie za bardzo nadają się na edytor binarny czy też hexadecymalny, gdyż nie potrafią wyświetlać znaków binarnych.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: TMemo i wyświetlanie plików binarnych

Nowy postprzez Ho88it » poniedziałek, 11 sierpnia 2008, 12:51

Chodzi w sumie tylko o "wyplucie krzaczków" na ekran w trybie okienkowym (w konsoli mi się udało bez większych problemów). Potem pobieram po kolei pojedynczy znak, rozbijam zapis dziesiętny na binarny i wczytuję do TStringGrid w wierszach po 8 bitów (1 bit = 1 kolumna) i tyle...
Nawet w konsoli nie jest możliwe wyświetlenie plików w sposób typowo binarny, bo najmniejszą adresowaną wielkością jest 1 bajt (czyli te 8 bitów). Mogę mieć problem przy plikach większych od 1Gb, bo nie wiem, czy jakikolwiek komponent to pomieści. :geek:
Ale to zobaczy się później, bo prawdopodobnie jakoś będę musiał robić zrzuty na dysk po przetworzeniu np. 100Mb. Chyba będzie najrozsądniej.

Jak na ten czas cały problem sprowadza się do "wyplucia krzaczków". Sprawdzę TRichEdit jak wrócę do chatki. Tylko mam wrażenie, że takie operacje na tym komponencie mogą być dość "ciężkie" dla procka. Wydawało mi się, że im bardziej spartański komponent tym szybciej podziała. Mam rację czy jestem w błędzie?
Avatar użytkownika
Ho88it
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): niedziela, 10 sierpnia 2008, 20:53
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: Visual Studio 2008
Visual Studio 2010
Gadu Gadu: 0
    NieznanyNieznana

Re: TMemo i wyświetlanie plików binarnych

Nowy postprzez jabu74 - ekspert » poniedziałek, 11 sierpnia 2008, 15:12

ja myslalem, ze chciales pokazac te krzaczki jako kody ASCII w HEX (znalazlem taka prosciutka funkcje i dopisalem prosta petle).

np. AnsiString "01234" zamienia na AnsiString "3031323334", tylko nie wiem jak sie zachowuje z zamiana innych znakow/krzaczkow.

moze sprobuj napisac kod rozbijajacy poszczegolne znaki na ciagi znakow AnsiString "0" i "1" by potem zapisac do memo. wiadomo, ze to bedzie duzo zajmowalo
w pamieci ale pewno sie da ;)
Avatar użytkownika
jabu74 - ekspert
 
    NieznanyNieznana

Re: TMemo i wyświetlanie plików binarnych

Nowy postprzez Cyfrowy Baron » poniedziałek, 11 sierpnia 2008, 20:17

RichEdit też nie wyświetli większości "krzaczków", musisz więc raczej pobrać zawartość do zmiennej typu char bez wyświetlania, zmienna będzie przechowywać wszystkie znaki, potem będziesz te znaki pobierał po kolei z tej zmiennej i będziesz je tłumaczył na znaki kodowane w ANSI. Tak to powinno wyglądać. Wyświetlanie tych "krzaczków" nie ma sensu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: TMemo i wyświetlanie plików binarnych

Nowy postprzez kinio » poniedziałek, 11 sierpnia 2008, 22:00

Witam!
Jezeli koniecznie chcesz krzaki to ten kod powinien dzialac. Komponenty o ktorych wspominales nie wyswietlaja do konca calego pliku poniewaz taka jest natura typu char. Jezeli masz lancuch tekstu jak tablice typu char* to zostanie on wyswietlony do momentu kiedy zostanie napotkany znak NULL. W ponizyszm kodzie jak widac jest on zamieniony na spacje. Możesz go dowolnie zmienic, lub nawet usunac. Tu juz sie liczy inwencja :)

Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     int iFileHandle;
   int iFileLength;
   int iBytesRead;
     int iBytesWrite = 0;
   char *pszBuffer;

   if(OpenDialog1->Execute())
   {
        try
        {
             iFileHandle = FileOpen(OpenDialog1->FileName, fmOpenRead);
             iFileLength = FileSeek(iFileHandle,0,2);
             FileSeek(iFileHandle,0,0);
             pszBuffer = new char[iFileLength+1];
             iBytesRead = FileRead(iFileHandle, pszBuffer, iFileLength);
             FileClose(iFileHandle);

               while(iBytesWrite < iBytesRead)
               {
                    if(pszBuffer[iBytesWrite] == 0)
                         pszBuffer[iBytesWrite] = ' ';
                    iBytesWrite++;
               }

               Memo1->Lines->SetText(pszBuffer);
               delete [] pszBuffer;
        }
        catch(...)
        {
             Application->MessageBox("Can't perform one of the following file operations: Open, Seek, Read, Close.", "File Error", IDOK);
        }
     }
}


Dodatkowo jezeli bys chcial wyswietlic go jako wartosci hex albo binarnie to wystarczy prosta konwersja.
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: TMemo i wyświetlanie plików binarnych

Nowy postprzez Ho88it » środa, 13 sierpnia 2008, 08:58

Cyfrowy Baron twój sposób rozwiązania może być dobry, ale go nie sprawdzałem, ponieważ w przypadku kodu kinia mam większą kontrolę nad działaniem wczytywania pliku. Jak pisałem wcześniej, duże pliki chcę pobierać partiami, a nie do zapełnienia całej pamięci (4,5Gb wolnego Ram'u leży jeszcze poza zasięgiem przeciętnego Kowalskiego).

kinio twój kod działa bez zarzutów, masz wielkiego plusa i na pewno będziesz ujęty na liście "Thanks for support", bo w końcu ruszyłem z projektem. Z tego wszystkiego co zbadałem na obecnym etapie programowania to to, że pliki malutkie (20Kb) ładują się szybciutko, ale plik 1,64Mb ładuje się co najmniej przez 20 sekund. To marny efekt zwracając uwagę, że mam aspiracje na pliki po 4,5Gb. To by zajęło cały dzień.

Jakieś pomysły oprócz wielowątkowości? Może API Wingrozy zadziała sprawniej? Tylko, że w API to nawet okienka nie potrafię stworzyć..

Jak na razie, będę pracował na małych plikach, aby w ogóle zbadać moją koncepcję nowej formy kompresji.

PS: to jest chyba jedyne tak aktywne forum THX Cyfbar za twoje poświęcenie.
Internet Explorer to program, który służy do przeglądania internetu z twojego komputera i na odwrót.
Avatar użytkownika
Ho88it
Homos antropiczny
Homos antropiczny
 
Posty: 63
Dołączył(a): niedziela, 10 sierpnia 2008, 20:53
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: Visual Studio 2008
Visual Studio 2010
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 19 gości

cron