Code:
void CUTestGridControl::Test1L() -В функции возможен сброс,
соблюдаем соглашение об именовании
{
TBool DialogResult;
TBuf16<20> sName; - используем TBuf вместо TBuf16
TPoint TextPoint;
TBuf16<20> sHeroesName;
TBuf8<20> sName1,sT;
RFs fsSession;
RFile Ft;
С литеры i начинаются только члены класса,
не соблюдаете соглашение об именовании
TInt iErr,iCount;
TFileName sFullFileName;
Не обязательно переменные стаскивать в одну кучу, это же не паскаль
TextPoint.iX = 20;
TextPoint.iY = 30;
_LIT(KDefaultDirCName,"C:\\test.txt");
CAknFileNamePromptDialog* NameDlg = CAknFileNamePromptDialog::NewL();
NameDlg->SetTitleL(_L("Enter Your Name:"));
NameDlg->SetRightSoftkeyL(_L("Cancel"));
NameDlg->SetLeftSoftkeyL(_L("Save"));
_LIT(KUserName,"No Name");
sName.Zero(); -бессмысленно
DialogResult = NameDlg->ExecuteL(sName);
утечка памяти, NameDlg не уничтожен (это же ExecuteL, а не ExecuteLD)
if (sName.Length()>12)
{
sName = sName.Mid(0,12);
}
sHeroesName.Zero(); -бессмысленно
sHeroesName.Copy(sName);
if (sHeroesName.Length()>12)
{
sHeroesName = sHeroesName.Mid(0,12);
} -бессмысленно
// Первый вывод
iBgc->DrawText(sHeroesName, TextPoint);
User::LeaveIfError(fsSession.Connect());
CleanupStackPushL(fsSession);
iErr = Ft.Replace(fsSession,KDefaultDirCName,EFileWrite);
CleanupStackPushL(Ft);
if(iErr == KErrNone)
{
sName1.Zero();
-Вот здесь происходит копирование из TBuf16 содержащего 2-х байтовые
символы в TBuf8, содержащий однобыйтовые. Как это происходит?
Да просто отбрасывается 1 байт в каждом символе.
Для латиницы это ничего так как там один байт нулевой,
остальные языки карёжит.
sName1.Copy(sHeroesName);
User::LeaveIfError(Ft.Write(sName1));
User::LeaveIfError(Ft.Flush()); // Commit data
CleanupStack::PopAndDestroy();//Ft -закрываем файл
Это не нужно, файл закрыт, сессию оставляем открытой
Ft.Close();
fsSession.Close();
}
//не нужно
fsSession.Connect();
iErr = Ft.Open(fsSession,KDefaultDirCName,EFileRead);
CleanupStackPushL(Ft);
Ft.Size(iCount);
User::LeaveIfError(Ft.Read(sT,iCount)); вот здесь бы iCount = 12,
или хотя бы 20
User::LeaveIfError(Ft.Flush()); // Commit data Не нужен flush,
вы ничего не пишете, только читаете
CleanupStack::PopAndDestroy(2);//Закрываем файл и сессию
не нужно:
Ft.Close();
fsSession.Close();
TextPoint.iY += 30;
sHeroesName.Zero(); -бессмысленно
sHeroesName.Copy(sT);
if (sHeroesName.Length()>12)
{
sHeroesName = sHeroesName.Mid(0,12);
}
// второй вывод
iBgc->DrawText(sHeroesName, TextPoint);
}
Reply With Quote
Читаем FAQ по дескрипторам и Советы по дескрипторам в wiki.
Что делать? Либо писать данные TBuf16 в файл с помощью TFileText и отказаться от работы с TBuf8 вообще. Либо по-человечески выполнять конверсию содержимого TBuf16 в ASCII и копировать полученное в TBuf8