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

Odczytywanie danych z pliku (klasa fstream)

dział ogólny

Re: Odczytywanie danych z pliku (klasa fstream)

Nowy postprzez Cyfrowy Baron » czwartek, 3 listopada 2011, 08:52

moderasura napisał(a):Uskrobałem coś takiego


Przecież kod podany na stronie ► patrz serwis: Cyfrowy Baron porady -> TRichEdit & Memo -> Wczytywanie plików binarnych do obiektu Memo - wg. pomysłu kinio. usuwa wszystkie śmieci zamieniając je na spację, a odpowiada za to ten fragment kodu:

KOD cpp:     UKRYJ  
pszBuffer[iBytesWrite] = ' ';


Spację można podmienić na cokolwiek. Kod zaproponowany przez polymorphism zamieniał śmieci na kwadraty.

Dlaczego tak skomplikowałeś swój kod? Po co ten łańcuszek zmiennych ze spacjami? Co jest nie tak z tymi gotowymi kodami? Dlaczego nie skorzystałeś z tych gotowych kodów bez ich przerabiania po swojemu?

Wczytywanie plików binarnych do obiektu Memo - wg. pomysłu kinio
KOD cpp:     UKRYJ  
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);
  }
 }
}
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 » czwartek, 3 listopada 2011, 09:37

Kod Kinio jak najbardziej się nadaje do tego co chcę zrobić ale nadal wczytuje mi jakieś śmieci. Po prostu muszę poświęcić na to więcej czasu. Ten kod co podałem jest może jakimś dziwolągiem ale po skompilowaniu robi dokładnie to samo ale wtedy kiedy mu na sztywno podam co ma wczytać a czego ma nie wczytywać, ale to rozwiązanie jest bardzo kiepskie i zostaje przy kodzie Kinio.
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 » czwartek, 3 listopada 2011, 09:56

Fakt! Kod wg. kinio nie działa jak tego można oczekiwać, ale polymorphism wcześniej podał link do wątku z poprawnym kodem:

KOD cpp:     UKRYJ  
#include <memory>
#include <string>
#include <locale>

using namespace std;

TStrings *GetBinFile(String FileName)
{
  auto_ptr<TStringList> Result (new TStringList());


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


     try
      {
           iFileHandle = FileOpen(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 = ' ';//0x2588;
      wstr += wc;
      }

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

 return Result.release();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 if( OpenDialog1->Execute() )
  Memo1->Lines = GetBinFile( OpenDialog1->FileName );

}


Problem w tym, że w pliku który tutaj zamieściłeś nigdzie nie ma wyrażenia TEXTD...............\characters\small_objects\small_objects01.bmp... Jak więc mam przeprowadzać testy skoro w pliku nie ma poszukiwanej wartości?!
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 » czwartek, 3 listopada 2011, 10:04

Trochę zrobiłem zamieszania z tymi plikami ale wydaje mi sie ze to nie robi wielkiej różnicy skoro ma wczytać jakiś konkretny tekst podam jakiś mniejszy plik by było łatwiej na nim operować
Widzę że tu podałeś jeszcze jakiś inny kod? To ten Kinio po Twoich modyfikacjach ?
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 » czwartek, 3 listopada 2011, 10:27

Za pomocą tego kodu udało mi się odsiać wszystkie śmieci i wyświetlić zawartość pliku (tego pierwszego) w wierszach:

kod poprawiony:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <memory>
#include <string>
#include <locale>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

using namespace std;

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
TStrings *GetBinFile(String FileName)
{
  auto_ptr<TStringList> Result (new TStringList());


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


     try
      {
           iFileHandle = FileOpen(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 = 0xD;//0x2588;
      wstr += wc;
      }

          Result->SetText( const_cast<wchar_t*>( wstr.c_str() ) );

          Result->Sorted = true;

          for(int i = Result->Count - 1; i >= 0; i--)
          {
                if( Result->Strings[i].IsEmpty() )
                {
                 Result->Delete(i);
                 continue;
                }

                String sTest = Result->Strings[i].Trim();
                int x = sTest.LastDelimiter(".");
                if(x <= 1  || sTest.Length() < 4)
                {
                 Result->Delete(i);
                 continue;
        }
      }

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

 return Result.release();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 if( OpenDialog1->Execute() )
  Memo1->Lines = GetBinFile( OpenDialog1->FileName );

}
//---------------------------------------------------------------------------


uzyskałem wynik:

KOD text:     UKRYJ  
Characters\ammo_belt\ammo_belt.ASR
Characters\ammo_belt\Anims\ammo_belt_rest.ASR
Characters\ammo_dp28\ammo_dp28.ASR
Characters\ammo_dp28\Anims\ammo_dp28_rest.ASR
Characters\ammo_drum\ammo_drum.ASR
Characters\ammo_drum\Anims\ammo_drum_rest.ASR
Characters\ammo_mp40\ammo_mp40.ASR
Characters\ammo_mp40\Anims\ammo_mp40_rest.ASR
Characters\ammo_pistol\ammo_pistol.ASR
Characters\ammo_pistol\Anims\ammo_pistol_rest.ASR
Characters\ammo_rifle\ammo_rifle.ASR
Characters\ammo_rifle\Anims\ammo_rifle_rest.ASR
Characters\bandage\Anims\bandage_rest.ASR
Characters\bandage\bandage.ASR
Characters\Binoculars\Anims\Binoculars_prone_sling.ASR
Characters\Binoculars\Anims\Binoculars_prone_unsling.ASR
Characters\Binoculars\Anims\Binoculars_rest.ASR
Characters\Binoculars\Anims\Binoculars_sling.ASR
Characters\Binoculars\Anims\Binoculars_unsling.ASR
Characters\Binoculars\Binoculars.ASR
Characters\bormann\bormann.asr
Characters\dogtag\Anims\dogtag_rest.ASR
Characters\dogtag\dogtag.ASR
Characters\dp28\Anims\dp28_discard.ASR
Characters\dp28\Anims\dp28_prone_discard.ASR
Characters\dp28\Anims\dp28_prone_sling.ASR
Characters\dp28\Anims\dp28_prone_unsling.ASR
Characters\dp28\Anims\dp28_rest.ASR
Characters\dp28\Anims\dp28_sling.ASR
Characters\dp28\Anims\dp28_unsling.ASR
Characters\dp28\dp28.ASR
Characters\FaustRocket\Anims\faustrocket_rest.ASR
Characters\FaustRocket\FaustRocket.ASR
Characters\gore_entry_small\Anims\gore_entry_small_rest.ASR
Characters\gore_entry_small\gore_entry_small.ASR
Characters\Knife\Anims\knife_prone_sling.ASR
Characters\Knife\Anims\knife_prone_unsling.ASR
Characters\Knife\Anims\knife_rest.ASR
Characters\Knife\Anims\knife_sling.ASR
Characters\Knife\Anims\knife_unsling.ASR
Characters\Knife\Knife.ASR
Characters\luger\Anims\luger_discard.ASR
Characters\luger\Anims\luger_prone_discard.ASR
Characters\luger\Anims\luger_prone_sling.ASR
Characters\luger\Anims\luger_prone_unsling.ASR
Characters\luger\Anims\luger_rest.ASR
Characters\luger\Anims\luger_sling.ASR
Characters\luger\Anims\luger_unsling.ASR
Characters\luger\Luger.ASR
Characters\machgun\Anims\machgun_discard.ASR
Characters\machgun\Anims\machgun_prone_discard.ASR
Characters\machgun\Anims\machgun_prone_sling.ASR
Characters\machgun\Anims\machgun_prone_unsling.ASR
Characters\machgun\Anims\machgun_rest.ASR
Characters\machgun\Anims\machgun_sling.ASR
Characters\machgun\Anims\machgun_unsling.ASR
Characters\machgun\machgun.ASR
Characters\mauser\Anims\mauser_discard.ASR
Characters\mauser\Anims\mauser_prone_discard.ASR
Characters\mauser\Anims\mauser_prone_sling.ASR
Characters\mauser\Anims\mauser_prone_unsling.ASR
Characters\mauser\Anims\mauser_rest.ASR
Characters\mauser\Anims\mauser_rest_prone.ASR
Characters\mauser\Anims\mauser_sling.ASR
Characters\mauser\Anims\mauser_sling_slow.ASR
Characters\mauser\Anims\mauser_unsling.ASR
Characters\mauser\mauser.ASR
Characters\mauser_scope\Anims\mauser_scope_cut_5e_agent1.ASR
Characters\mauser_scope\Anims\mauser_scope_cut_5e_player1.ASR
Characters\mauser_scope\Anims\mauser_scope_cut_5e_player2.ASR
Characters\mauser_scope\Anims\mauser_scope_discard.ASR
Characters\mauser_scope\Anims\mauser_scope_prone_discard.ASR
Characters\mauser_scope\Anims\mauser_scope_prone_sling.ASR
Characters\mauser_scope\Anims\mauser_scope_prone_unsling.ASR
Characters\mauser_scope\Anims\mauser_scope_rest.ASR
Characters\mauser_scope\Anims\mauser_scope_rest_corpse.ASR
Characters\mauser_scope\Anims\mauser_scope_rest_prone.ASR
Characters\mauser_scope\Anims\mauser_scope_sling.ASR
Characters\mauser_scope\Anims\mauser_scope_sling_slow.ASR
Characters\mauser_scope\Anims\mauser_scope_unsling.ASR
Characters\mauser_scope\mauser_scope.ASR
Characters\MG42\Anims\MG42_discard.ASR
Characters\MG42\Anims\MG42_prone_discard.ASR
Characters\MG42\Anims\MG42_prone_sling.ASR
Characters\MG42\Anims\MG42_prone_unsling.ASR
Characters\MG42\Anims\MG42_rest.ASR
Characters\MG42\Anims\MG42_sling.ASR
Characters\MG42\Anims\MG42_unsling.ASR
Characters\MG42\MG42.ASR
Characters\MP40\Anims\mp40_discard.ASR
Characters\MP40\Anims\mp40_prone_discard.ASR
Characters\MP40\Anims\mp40_prone_sling.ASR
Characters\MP40\Anims\mp40_prone_unsling.ASR
Characters\MP40\Anims\mp40_rest.ASR
Characters\MP40\Anims\mp40_sling.ASR
Characters\MP40\Anims\mp40_unsling.ASR
Characters\MP40\mp40.ASR
Characters\nagan\Anims\nagan_discard.ASR
Characters\nagan\Anims\nagan_prone_discard.ASR
Characters\nagan\Anims\nagan_prone_sling.ASR
Characters\nagan\Anims\nagan_prone_unsling.ASR
Characters\nagan\Anims\nagan_rest.ASR
Characters\nagan\Anims\nagan_rest_prone.ASR
Characters\nagan\Anims\nagan_sling.ASR
Characters\nagan\Anims\nagan_sling_slow.ASR
Characters\nagan\Anims\nagan_unsling.ASR
Characters\nagan\nagan.ASR
Characters\nagan_scope\Anims\nagan_scope_discard.ASR
Characters\nagan_scope\Anims\nagan_scope_prone_discard.ASR
Characters\nagan_scope\Anims\nagan_scope_prone_sling.ASR
Characters\nagan_scope\Anims\nagan_scope_prone_unsling.ASR
Characters\nagan_scope\Anims\nagan_scope_rest.ASR
Characters\nagan_scope\Anims\nagan_scope_rest_corpse.ASR
Characters\nagan_scope\Anims\nagan_scope_rest_prone.ASR
Characters\nagan_scope\Anims\nagan_scope_sling.ASR
Characters\nagan_scope\Anims\nagan_scope_sling_slow.ASR
Characters\nagan_scope\Anims\nagan_scope_unsling.ASR
Characters\nagan_scope\Anims\nagent_cut_3e_agent1.ASR
Characters\nagan_scope\Anims\nagent_cut_3e_agent2.ASR
Characters\nagan_scope\Anims\nagent_cut_3e_agent3.ASR
Characters\nagan_scope\Anims\nagent_cut_3e_player4.ASR
Characters\nagan_scope\Anims\nagent_cut_3e_player5.ASR
Characters\nagan_scope\nagan_scope.ASR
Characters\P38\Anims\P38_prone_sling.ASR
Characters\P38\Anims\P38_prone_unsling.ASR
Characters\P38\Anims\P38_rest.ASR
Characters\P38\Anims\P38_sling.ASR
Characters\P38\Anims\P38_unsling.ASR
Characters\P38\p38.ASR
Characters\Panzerfaust\Anims\panzerfaust_discard.ASR
Characters\Panzerfaust\Anims\panzerfaust_prone_discard.ASR
Characters\Panzerfaust\Anims\panzerfaust_prone_sling.ASR
Characters\Panzerfaust\Anims\panzerfaust_prone_unsling.ASR
Characters\Panzerfaust\Anims\panzerfaust_rest.ASR
Characters\Panzerfaust\Anims\panzerfaust_sling.ASR
Characters\Panzerfaust\Anims\panzerfaust_slung_move.ASR
Characters\Panzerfaust\Anims\panzerfaust_unsling.ASR
Characters\Panzerfaust\Panzerfaust.ASR
Characters\panzerschreck\Anims\panzerschreck_cut_3a_rest.ASR
Characters\panzerschreck\Anims\panzerschreck_discard.ASR
Characters\panzerschreck\Anims\panzerschreck_prone_discard.ASR
Characters\panzerschreck\Anims\panzerschreck_prone_sling.ASR
Characters\panzerschreck\Anims\panzerschreck_prone_unsling.ASR
Characters\panzerschreck\Anims\panzerschreck_rest.ASR
Characters\panzerschreck\Anims\panzerschreck_sling.ASR
Characters\panzerschreck\Anims\panzerschreck_unsling.ASR
Characters\panzerschreck\panzerschreck.ASR
Characters\Pineapple\Anims\Default.ASR
Characters\Pineapple\Anims\pineapple_discard.ASR
Characters\Pineapple\Anims\pineapple_prone_discard.ASR
Characters\Pineapple\Anims\pineapple_prone_sling.ASR
Characters\Pineapple\Anims\pineapple_prone_unsling.ASR
Characters\Pineapple\Anims\pineapple_rest.ASR
Characters\Pineapple\Anims\pineapple_sling.ASR
Characters\Pineapple\Anims\pineapple_unsling.ASR
Characters\Pineapple\Pineapple.ASR
Characters\Player\anims\human_special_crouch_wounded_death.asr
Characters\Player\anims\human_special_fidget_smoking.asr
Characters\Player\anims\human_special_hostage_victim_rest.asr
Characters\Player\anims\human_special_interrogated_rest.asr
Characters\Player\anims\human_special_interrogated_slump.asr
Characters\Rock\Anims\Rock_rest.ASR
Characters\Rock\Rock.ASR
Characters\schreckrocket\Anims\schreckrocket_rest.ASR
Characters\schreckrocket\schreckrocket.ASR
Characters\scientist2\scientist2.asr
Characters\smallmedkit\Anims\smallmedkit_rest.ASR
Characters\smallmedkit\smallmedkit.ASR
Characters\smokegrenade\Anims\smokegrenade_discard.ASR
Characters\smokegrenade\Anims\smokegrenade_prone_discard.ASR
Characters\smokegrenade\Anims\smokegrenade_prone_sling.ASR
Characters\smokegrenade\Anims\smokegrenade_prone_unsling.ASR
Characters\smokegrenade\Anims\smokegrenade_rest.ASR
Characters\smokegrenade\Anims\smokegrenade_sling.ASR
Characters\smokegrenade\Anims\smokegrenade_unsling.ASR
Characters\smokegrenade\smokegrenade.ASR
Characters\springfield\Anims\springfield_discard.ASR
Characters\springfield\Anims\springfield_prone_discard.ASR
Characters\springfield\Anims\springfield_prone_sling.ASR
Characters\springfield\Anims\springfield_prone_unsling.ASR
Characters\springfield\Anims\springfield_rest.ASR
Characters\springfield\Anims\springfield_rest_corpse.ASR
Characters\springfield\Anims\springfield_rest_prone.ASR
Characters\springfield\Anims\springfield_sling.ASR
Characters\springfield\Anims\springfield_sling_slow.ASR
Characters\springfield\Anims\springfield_unsling.ASR
Characters\springfield\springfield.ASR
Characters\stickgrenade\Anims\stickgrenade_discard.ASR
Characters\stickgrenade\Anims\stickgrenade_prone_discard.ASR
Characters\stickgrenade\Anims\stickgrenade_prone_sling.ASR
Characters\stickgrenade\Anims\stickgrenade_prone_unsling.ASR
Characters\stickgrenade\Anims\stickgrenade_rest.ASR
Characters\stickgrenade\Anims\stickgrenade_sling.ASR
Characters\stickgrenade\Anims\stickgrenade_unsling.ASR
Characters\stickgrenade\stickgrenade.ASR
Characters\tbomb\Anims\tbomb_countdown.ASR
Characters\tbomb\Anims\tbomb_discard.ASR
Characters\tbomb\Anims\tbomb_prone_discard.ASR
Characters\tbomb\Anims\tbomb_prone_sling.ASR
Characters\tbomb\Anims\tbomb_prone_unsling.ASR
Characters\tbomb\Anims\tbomb_rest.ASR
Characters\tbomb\Anims\tbomb_sling.ASR
Characters\tbomb\Anims\tbomb_unsling.ASR
Characters\tbomb\tbomb.ASR
Characters\tnt\Anims\tnt_discard.ASR
Characters\tnt\Anims\tnt_hold.ASR
Characters\tnt\Anims\tnt_place1.ASR
Characters\tnt\Anims\tnt_place2.ASR
Characters\tnt\Anims\tnt_place3.ASR
Characters\tnt\Anims\tnt_prone_discard.ASR
Characters\tnt\Anims\tnt_prone_sling.ASR
Characters\tnt\Anims\tnt_prone_unsling.ASR
Characters\tnt\Anims\tnt_rest.ASR
Characters\tnt\Anims\tnt_sling.ASR
Characters\tnt\Anims\tnt_unsling.ASR
Characters\tnt\tnt.ASR
LevelExportTemp\mp_08d.asr
LevelExportTemp\mp_08d.cut
LevelExportTemp\mp_08d.efx
LevelExportTemp\mp_08d.ent
LevelExportTemp\mp_08d.lit
LevelExportTemp\mp_08d.mod
LevelExportTemp\mp_08d.nav
LevelExportTemp\mp_08d.shp
LevelExportTemp\mp_08d.sky
LevelExportTemp\mp_08d.snd
LevelExportTemp\mp_08d.snv
LevelExportTemp\mp_08d.svt
OtherShp.shp


Z drugim plikiem nic nie wyszło, gdyż to plik tekstowy, a kod jest przystosowany do plików binarnych i tekstowych nie parsuje.

Obyło się b bez wyrażeń regularnych.


Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
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 » czwartek, 3 listopada 2011, 10:39

Baron, popraw to cholerne indeksowanie:
KOD cpp:     UKRYJ  
wstr[i] += wc;

To jest błąd, jego tam nie powinno być.




moderasura, tu masz inną, uproszczoną i nieco racjonalniejszą wersję kodu:
KOD cpp:     UKRYJ  
char    buffer[1024];
wstring wstr;
locale  loc("");

const ctype<wchar_t> &ct = use_facet<ctype<wchar_t> >(loc);

ifstream is("test.txt", ios::binary);

while(is.read(buffer, 1024).gcount() > 0)
{
        for(unsigned i = 0; i < is.gcount(); ++i)
        {
                wchar_t wc = ct.widen( buffer[i] );
                bool ok = ct.is(ctype<wchar_t>::alpha | ctype<wchar_t>::digit | ctype<wchar_t>::punct, wc);
                if(!ok) wc = L' ';
                wstr += wc;
        }
}

/* wyświetlenie zawartości w konsoli. Tą część sobie dostosuj do VCL-owskich kontrolek */
wcout.imbue(loc);
wcout << wstr << L'\n';
 
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 » czwartek, 3 listopada 2011, 10:53

Fakt! Przepisałem kod i go nie analizowałem.

zamiast: wstr[i] += wc; należy zrobić:wstr += wc;
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 Cyfrowy Baron » czwartek, 3 listopada 2011, 11:07

Kod zaproponowany przez polymorphism jest bardziej optymalny, ale jedyne co robi to wczytuje plik binarny do Memo i nie odsiewa go ze zbędnych - z Twojego punktu wiedzenia - śmieci.
Tutaj masz pełny kod dający wynik taki jak wcześniej to pokazałem:

KOD cpp:     UKRYJ  
#include <memory>
#include <string>
#include <locale>
#include <fstream.h>

using namespace std;

//---------------------------------------------------------------------------
TStrings *GetBinFile2(String FileName)
{
  auto_ptr<TStringList> Result (new TStringList());

  char    buffer[1024];
  wstring wstr;
  locale  loc("");

  const ctype<wchar_t> &ct = use_facet<ctype<wchar_t> >(loc);

  ifstream is(FileName.c_str(), ios::binary);

  while(is.read(buffer, 1024).gcount() > 0)
  {
        for(unsigned i = 0; i < is.gcount(); ++i)
                {
                wchar_t wc = ct.widen( buffer[i] );
                bool ok = ct.is(ctype<wchar_t>::alpha | ctype<wchar_t>::digit | ctype<wchar_t>::punct, wc);
                                if(!ok) wc = 0xD;
                                wstr += wc;
                }
  }

  Result->SetText( const_cast<wchar_t*>( wstr.c_str() ) );

  Result->Sorted = true;

  for(int i = Result->Count - 1; i >= 0; i--)
  {
        if( Result->Strings[i].IsEmpty() )
        {
                 Result->Delete(i);
                 continue;
        }

        String sTest = Result->Strings[i].Trim();
        int x = sTest.LastDelimiter(".");

        if(x <= 1  || sTest.Length() < 4)
        {
                 Result->Delete(i);
                 continue;
        }
  }

  return Result.release();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 if( OpenDialog1->Execute() )
  Memo1->Lines = GetBinFile2( OpenDialog1->FileName );
}
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 » czwartek, 3 listopada 2011, 19:42

Dzięki chłopaki za odpowiedz i przykładowe kody 8-) muszę to teraz wszystko ogarnąć do kupy, i zrobić kilka testów na plikach, być może jeszcze wam zawrócę gitarę :x w tym temacie. Na szybko obadałem kody tu zamieszczone, i widać ze to będzie coś z tego, tylko muszę to jeszcze dostosować do kliku innych plików, ale to w swoim czasie jeszcze raz dzięki ;)
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

Poprzednia 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 14 gości

cron