[ miksin @ 26.04.2007. 14:39 ] @
Trebam da prebacim podatke iz tekstualnog fajla u jedan memo radi dalje obrade, ali problem je sto taj tekstualni fajl ima 5000+ redova

ja sam koristio sledeci kod:

Code:
ifstream Baza;
Baza.open("Baza.xml",ios::in);
int i;
char string[150];
Memo1->Clear();
for(i=0;i<5000;i++){
        Baza.getline(string,149);
        Memo1->Lines->Add(string);
        if(Memo1->Lines->IndexOf("</Disc>")!=-1) {
                brojac=i;
                break;
        }
}


Ali ucitavanje traje izmedju 50 i 60 sekundi sto je puno.
A posto meni ne treba da ucitavam liniju po liniju, predpostavljam da bi islo brze ako bih koristio neku drugu funkciju, a ne getline(). Idealno bi bilo da postoji funkcija koja celokupan text iz fajla prebacuje u memo. Da li takvo nesto postoji?
[ itf @ 26.04.2007. 14:48 ] @
Memo1->Lines->LoadFromFile("nekifajl.txt");

iako za rad s većim datotekama svakako preporučujem korištenje RichEdit-a...
[ X Files @ 26.04.2007. 21:54 ] @
Ne znam šta tačno podrazumevaš pod optimizacijom, ali u tvom slučaju deo koda:
Citat:

Code:

if(Memo1->Lines->IndexOf("</Disc>")!=-1) {
        brojac=i;
        break;
}


... je jako loš.

Koliko vidim ti hoćeš da prekineš upis kada naiđeš na "</Disc>". U tvom primeru, korišćenje
IndexOf() metode inicira ponovnu pretragu od prve do poslednje linije, iako si već proveravao
prethodne linije. To je jako veliki gubitak i otuda toliko utrošeno vreme.

Taj deo koda zameni na primer ovim /netestirano/:
Code:

if ( Memo1->Lines->Strings[i].AnsiPos( "</Disc>" ) != 0 )
{
   brojac=i;
   break;
}


Dalje, ukoliko ti je potrebno da neki fajl učitaš u NE-VIZUELNU kontrolu radi lakše naknadne pretrage
i sl, možeš upotrebiti i TStringList klasu:

Code:

TStringList *SL = new TStringList;
SL->LoadFromFile( /* neki fajl */ );

// ovde možeš po želji da prrolaziš kroz listu, modifikuješ, brišeš i sl.

delete SL;

... i kasnije to možeš da pridružiš nekom TMemo objektu na način koji ti je već poznat u prethodnom
tvom pitanju.

Dalje, velika količina Add()-ova u TMemo objekat takođe može da 'jede' vreme. Tada se koristi:

Code:

Memo1->BeginUpdate();

// ovde tvoja petlja koja dodaje linije...

Memo1->EndUpdate();

ili još bolje /malo modernije i sigurnije/:
Code:

--- H ---
class RAII_MemoEditLock
{
private:
   TMemo *ME;
public:

   RAII_MemoEditLock( TMemo *me ) : ME( me )
   {
      if ( ME )
         ME->Lines->BeginUpdate();
   }

   ~RAII_MemoEditLock()
   {
      if ( ME )
         ME->Lines->EndUpdate();
   }
};

--- CPP ---
void TForm1::FunkcijaKojaDodajeLinije()
{
   RAII_MemoEditLock Lock( Memo1 );

   // ovde tvoja petlja koja dodaje linije...

}

[ miksin @ 27.04.2007. 14:46 ] @
@itf to je odradilo posao. Ucita ga za 1 sekund. Hvala.
@X Files hvala na super objasnjenju, sad mi je mnogo jasnije
Kad sam pisao kod nisam znao za Strings[] tako da mi je IndexOf() jedino pao na pamet, sad kapiram tacno sta IndexOf() radi.