我正在使用Windows 10下的C ++构建器(10.3)社区版本来开发可在Samsung Galaxy A40上运行的应用程序。
我似乎无法正常工作的一件事是将TListBox的内容保存到文件中。
作为Android的新手,我不确定该文件应显示在何处以及需要哪些权限。
我已经尝试过使用以下功能将列表框的内容保存到文件,但是似乎无法打开要写入的文件。它总是返回-1:
int hFile; // File Handle
int ByteCt=0;
hFile = FileOpen("Shopping.lst", fmOpenWrite);
if (hFile > 0)
{
for (int i=0; i<ListBox1->Count; i++)
{
ByteCt+=FileWrite(hFile,ListBox1->Items[i].Text.c_str(),
ListBox1->Items->Strings[i].Length());
ByteCt+=FileWrite(hFile,"\n\r",2);
}
FileClose(hFile);
}
我错过了一些基本的东西吗?
但是仅供参考,String FileName = TPath::Combine(TPath::GetDocumentsPath(), _D("Shopping.lst"));
hFile = FileOpen(FileName, fmOpenWrite);
// or: hFile = FileCreate(FileName);
是一个ListBox1->Items
,它具有自己的ListBox1->Items
方法,例如:
TStrings
您正在复制TStrings
已经为您完成的工作。因此,您无需手动编写字符串-特别是因为您甚至一开始都没有正确编写字符串!
SaveToFile()
在C ++ Builder中是SaveToFile()
的别名,它是UTF-16编码的字符串。它的ListBox1->Items->SaveToFile(FileName, TEncoding::UTF8);
指定了它包含的SaveToFile()
(在Android上为String
)元素的数量,但是UnicodeString
仅处理原始字节。因此,自Length()
以来,您只写入每个WideChar
的1/2字节。而且,char16_t
也不是有效的换行符。您将需要使用FileWrite()
或仅使用String
,或使用RTL的sizeof(WideChar)=2
全局常量。但是更糟糕的是,您试图以原始的UTF-16格式写入"\n\r"
,但以8位ANSI / UTF-8格式写入换行符。因此,您最终得到一个混合编码的文件,许多软件将无法正确读取该文件。如果您真的想手动编写
"\r\n"
,则它看起来应该更像这样:
"\n"
但是,不是直接使用sLineBreak
,而是考虑使用String
,例如:
String