本文介绍了如何在Android应用程序中使用C++生成器写入文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用Windows 10下的C++Builder(10.3)社区版本来开发一个可以在三星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,"
",2);
}
FileClose(hFile);
}
我是不是漏掉了什么基本的东西?
推荐答案
使用System::Ioutils::TPath
类确定您的应用程序可以访问的各种系统路径。详情请参见Standard RTL Path Functions across the Supported Target Platforms。例如:
String FileName = TPath::Combine(TPath::GetDocumentsPath(), _D("Shopping.lst"));
hFile = FileOpen(FileName, fmOpenWrite);
// or: hFile = FileCreate(FileName);
但FYI,ListBox1->Items
是TStrings
,它有自己的SaveToFile()
方法,例如:
ListBox1->Items->SaveToFile(FileName, TEncoding::UTF8);
您只是在重复SaveToFile()
已经为您做的事情。因此,您不需要手动编写字符串--尤其是因为您一开始甚至没有正确编写它们!
在C++Builder中String
是UnicodeString
的别名,UnicodeString
是UTF-16编码的字符串。它的Length()
指定它包含的WideChar
(Android上是char16_t
)元素的数量,但FileWrite()
只处理原始字节。因此,从sizeof(WideChar)=2
开始,您只写入了每个String
字节的1/2。此外,"
"
也不是有效的换行符。您需要使用"
"
或仅使用"
"
,或者使用RTL的sLineBreak
全局常量。但更糟糕的是,您试图以其原始的UTF-16格式编写String
,但却以8位ANSI/UTF-8格式编写换行符。因此,您最终得到的是一个混合编码文件,许多软件将无法正确读取该文件。
如果您确实想要手动编写String
%s,则它需要更像这样:
int hFile; // File Handle
int ByteCt=0, BytesWritten;
hFile = FileOpen(FileName, fmOpenWrite);
// or: hFile = FileCreate(FileName);
if (hFile > 0)
{
for (int i=0; i < ListBox1->Count; i++)
{
String s = ListBox1->Items->Strings[i];
BytesWritten = FileWrite(hFile, s.c_str(), s.Length() * sizeof(WideChar));
if (BytesWritten < 0) break;
ByteCt += BytesWritten;
BytesWritten = FileWrite(hFile, _D("
"), sizeof(WideChar) * 2);
if (BytesWritten < 0) break;
ByteCt += BytesWritten;
/* alternatively:
UTF8String s = ListBox1->Items->Strings[i];
BytesWritten = FileWrite(hFile, s.c_str(), s.Length());
if (BytesWritten < 0) break;
ByteCt += BytesWritten;
BytesWritten = FileWrite(hFile, "
", 2);
if (BytesWritten < 0) break;
ByteCt += BytesWritten;
*/
}
FileClose(hFile);
}
但是,与其直接使用FileWrite()
,不如考虑使用TStreamWriter
,例如:
int ByteCt=0;
std::unique_ptr<TStreamWriter> File(new TStreamWriter(FileName, TEncoding::UTF8));
// or: auto File = std::make_unique<TStreamWriter>(FileName, TEncoding::UTF8);
for (int i=0; i < ListBox1->Count; i++)
{
String s = ListBox1->Items->Strings[i];
File->WriteLine(s);
ByteCt += (File->Encoding->GetByteCount(s) + File->Encoding->GetByteCount(File->NewLine));
}
这篇关于如何在Android应用程序中使用C++生成器写入文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!