CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Odczytywanie danych z pliku (klasa fstream)

Odczytywanie danych z pliku (klasa fstream)

dział ogólny

Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez moderasura » wtorek, 1 listopada 2011, 11:31

Witam! Baronie mam pytanie odnośnie Twojej porady (Odczytywanie danych z pliku (klasa fstream). Więc tak mam plik który ładnie i pięknie się wczytuje, i wyświetla w obiekcie Memo.
Jak to zrobić by wyświetlić ten plik w Memo, z pominięciem pewnych znaków lub krzaków, przykładowa zawartość pliku TEXTD...............\characters\small_objects\small_objects01.bmp... co by trzeba było zrobić by pomijać te kropki między tekstem i krzaki tak by wyświetlało sam tekst który jest w pliku?

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 char Buf[255];
 ifstream infile;
 infile.open("Test.txt");

 for(int i = 0; i < 10; i++)
 {
   infile.getline(Buf, 255);

   if(((AnsiString)Buf).IsEmpty()) i = 10;
   Memo1->Lines->Add((AnsiString)Buf);

   sprintf(Buf, "%s", "");
 }

 infile.close();
}
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez Cyfrowy Baron » wtorek, 1 listopada 2011, 11:46

Trzeba wczytać plik do pamięci, do zmiennej np. AnsiString lub UnicodeString (zależy od wersji środowiska). Potem trzeba poddać tekst parsowaniu, czyli odsiać to co zbędne. Jedyną znośnym sposobem na parsowanie są regex'y czyli wyrażenia regularne, ale trzeba się najpierw tego poduczyć.

Problem wyrażeń regularnych był poruszany w tym wątku: Jak stworzyć wyrażenie regularne?

moderasura napisał(a):co by trzeba było zrobić by pomijać te kropki między tekstem i krzaki tak by wyświetlało sam tekst który jest w pliku?


Trochę za mało danych podałeś o tym pliku. Gdyby chodziło tylko o te kropki z przykładu, to sprawa byłaby dość prosta, gdyż wystarczyłoby je wyciąć z tekstu za pomocą funkcji SubString, ale piszesz jeszcze o jakichś krzaczkach, a skąd się one wzięły w pliku tekstowym?
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
    Windows XPFirefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez moderasura » wtorek, 1 listopada 2011, 12:13

Plik w zasadzie jest binarny tego nie uwzględniłem.Nie mam pojecia jak to wykombinować :roll: poczytam ten temat co podałeś może tam coś się wyskrobie :oops:
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez Cyfrowy Baron » wtorek, 1 listopada 2011, 12:40

Z plikami binarnymi sprawa nie jest taka prosta. Najpierw musisz to tak przerobić, żeby dało się wyświetlić w Memo, a dopiero potem możesz to parsować.
► patrz serwis: Cyfrowy Baron dział: porady -> TRichEdit & Memo -> Wczytywanie plików binarnych do obiektu Memo - wg. pomysłu kinio.
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
    Windows XPFirefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez moderasura » wtorek, 1 listopada 2011, 22:32

Użyłem ten kod ale powstaje z tego jeden wielki kocioł

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button3Click(TObject *Sender)
{
              int iFileHandle;
       int iFileLength;
       int iBytesRead;
       int iBytesWrite = 0;
       char *pszBuffer;
       wstring wstr;

       locale loc(".ACP");
       const ctype<wchar_t> &ct = use_facet<ctype<wchar_t> >(loc);

        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);

          wstr.reserve(iBytesRead);
          for(unsigned i = 0; i < iBytesRead; ++i)
          {
          wchar_t wc = ct.widen(pszBuffer[i]);
          bool ok = ct.is(ctype<wchar_t>::alpha | ctype<wchar_t>::digit | ctype<wchar_t>::punct,wc);
          if(!ok) wc = ' '; // Spacja
          wstr[i] += wc;
          }

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

       }


wiem ze tu
KOD cpp:     UKRYJ  
if(!ok) wc = 0x2588;
          wstr[i] += wc;
by należało by coś zmienić i tak kombinowałem ale i tak między tekstem wyświetlają sie jakieś dziwne znaki może tu trzeba wpisać jakiś adres który jest odpowiedzialny za te kwadraty czy jak to tam nazwać , bo na to wygląda ze to jakiś offset. Ale jest blisko tego co chcę zrobić.
Ostatnio edytowano czwartek, 3 listopada 2011, 00:33 przez moderasura, łącznie edytowano 1 raz
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez polymorphism » wtorek, 1 listopada 2011, 23:14

KOD cpp:     UKRYJ  
wstr[i] += wc;

A po co to indeksowanie?!

(...) bo na to wygląda ze to jakiś offset.

To nie jest żaden offset, tylko unikodowy kod znaku zapisany szesnastkowo (ów kwadrat).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez Cyfrowy Baron » środa, 2 listopada 2011, 08:28

Nie rozumiem czemu mają służyć Twoje modyfikacje tego kodu, skoro jedynym zadaniem dla niego (kod) jest takie przekonwertowanie kodu binarnego by dało się go wyświetlić w Memo lub pobrać do zmiennej. Dopiero potem powinieneś usuwać z niego to czego nie potrzebujesz.

Jestem również bardzo ciekaw dlaczego chcesz wyświetlić bitmapę jako zwykły tekst.
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
    Windows XPFirefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez moderasura » środa, 2 listopada 2011, 09:54

Nie chce wyświetlać bitmapy tylko jej nazwę jako konkretny identyfikator pliku...
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez polymorphism » środa, 2 listopada 2011, 10:36

No to kod, który podałeś wyżej powinien działać (oczywiście po usunięciu wspomnianego indeksowania).

KOD cpp:     UKRYJ  
pszBuffer = new char[iFileLength + 1];

To jest bufor na dane binarne a nie tekstowe, zatem to "+ 1" jest zupełnie zbędne, szczególnie, że i tak nie zerujesz ostatniego bajta.

p.s. ten plik tekstowy, który podałeś wcale nie wygląda na tekstowy. Skąd ten plik?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez Cyfrowy Baron » środa, 2 listopada 2011, 11:05

polymorphism napisał(a):p.s. ten plik tekstowy, który podałeś wcale nie wygląda na tekstowy.


http://programowanie.cal.pl/forum/posting.php?mode=reply&f=2&t=1553#pr11405
moderasura napisał(a):Plik w zasadzie jest binarny tego nie uwzględniłem.
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
    Windows XPFirefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez polymorphism » środa, 2 listopada 2011, 11:39

Fakt, przeoczyłem to.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez moderasura » środa, 2 listopada 2011, 23:23

Uskrobałem coś takiego dla pliku binarnego TEXTD...............\characters\small_objects\small_objects01.bmp... i udało się wczytać sam tekst bez zbędnych znaków które i tak nie da się ludzkim okiem przeczytać.W zasadzie i tak jest lipa, bo jak będę miał sporą ilość plików to na napisanie programu nie starczy mi życia :shock:


KOD cpp:     UKRYJ  
void __fastcall TForm1::Button3Click(TObject *Sender) {

    char FileName[256];

 String fileName = ExtractFilePath(ParamStr(0)) + "test.bin";

    fstream infile;
    infile.open(fileName.c_str(), ios::in | ios::binary);

    infile.read((char *)&FileName, sizeof(FileName));

// ((FileName[0] =' ') &  //poczatek nagłowka
//(FileName[1] = ' ') &&
//(FileName[2] = ' ') &&
//(FileName[3] = ' ') && //koniec naglowka


(FileName[4] = ' ') && //poczatek smieci
(FileName[5] = ' ') &&
(FileName[6] =' ') &&
(FileName[7] = ' ') &&
(FileName[8] = ' ') &&
(FileName[9] =' ') &&
(FileName[10] = ' ') &&
(FileName[11] = ' ') &&
(FileName[12] =' ') &&
(FileName[13] = ' ') &&
(FileName[14] = ' ') &&
(FileName[15] =' ') &&
(FileName[16] = ' ') &&
(FileName[17] = ' ') &&
(FileName[18] =' ') &&
(FileName[19] = ' ') &&
(FileName[20] = ' ') &&
(FileName[65] = ' ') &&
(FileName[65] = ' ') &&
(FileName[66] = ' ') &&
(FileName[67] = ' ') &&
(FileName[68] = ' ') &&
(FileName[69] = ' ') &&
(FileName[70] = ' '));    //koniec smieci

 Edit1->Text = (String)FileName;


 Memo1->Text = (String)FileName;



    infile.close();

}


To może w pętli trzeba by było zrobić?
Ostatnio edytowano czwartek, 3 listopada 2011, 00:07 przez moderasura, łącznie edytowano 1 raz
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez polymorphism » czwartek, 3 listopada 2011, 00:01

Co Ty kombinujesz?! Przecież miałeś wcześniej kod, który podmieniał znaki, które nie są literami, cyframi lub znakami interpunkcyjnymi. Jak Ci się kwadrat nie podobał (0x2588), to było podmienić go na spację lub cokolwiek innego. A tak to jakieś dziwolągi tworzysz - ten if to jakaś głupota. Pytałem się, co to za plik, skąd go wziąłeś. Oczywiście odpowiedzi nie ma.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez moderasura » czwartek, 3 listopada 2011, 00:13

polymorphism napisał(a): Pytałem się, co to za plik, skąd go wziąłeś.

Pliki pochodzą z pewnej gry do której nie ma żadnych programów edytorów itp.Oczywiście to tylko jeden i bardzo mało waży.Staram sie zrobić taki identyfikator tych plików by nie babrać sie z tymi plikami w Hex edytorach.Chcę to dodać do mojego kontenera tak by po wczytaniu pliku wiadome było co się wczytało lub zapisało.
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez polymorphism » czwartek, 3 listopada 2011, 00:36

Staram sie zrobić taki identyfikator tych plików by nie babrać sie z tymi plikami w Hex edytorach.

Tego nie rozumiem. Jaki identyfikator?

Chcę to dodać do mojego kontenera tak by po wczytaniu pliku wiadome było co się wczytało lub zapisało.

Nie rozumiem, przecież każdy plik jak rozumiem ma jakąś nazwę, więc chyba powinno być wiadomo, co wczytujesz do kontenera (a stąd łatwo do tego, żeby było wiadomo, co się z niego czyta).

czyli (0xi co dalej)?

0x20 lub po prostu L' '. Czy tak trudno podejrzeć w hex edytorze jakiś plik tekstowy lub nawet zajrzeć do jakiejś tablicy kodów ASCII?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • 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 11 gości

cron