- Kod: Zaznacz cały
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 = 0x2588;
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);
}
}
Wczytywanie rzeczywiście przebiega dość szybko. Jak sie okazało u mnie program antywirusowy generował opóźnienie.
Różnica pomiędzy wstring i UnicodeString jest niewielka. Plik 20 MB - wstring = 26,217 sek.; UnicodeString = 26.648 sek.
Jak widać moje wyniki różnią się od waszych, gdyż UnicodeString jest wolniejszy. Są to oczywiście tylko pomiary porównawcze, gdyż w tle pracowały inne programu, które angażowały procesor w około 20 procentach, ale to tylko pokazuje, że nie ma większego znaczenia którego typu się użyje.
Lepsze wyniki uzyskałem stosując funkcję SetTexBuf zamiast SetText - wstring = 25,979 sek.
- Kod: Zaznacz cały
Memo1->SetTextBuf(const_cast<wchar_t*>( wstr.c_str() ));
Jeszcze lepsze wyniki wstring = 22,368 sek. uzyskałem zastępując Memo obiektem RichEdit z WordWrap i PlainText ustawionymi na false.
Co ciekawe samo wykonanie kodu, bez przepisywania do Memo czy RichEdit na pliku 20 MB trwało około 6 sek.