如何在Android应用中使用C ++ buider写入文件?

问题描述 投票:0回答:1

我正在使用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);
}

我错过了一些基本的东西吗?

android file fopen fwrite c++builder-10.3-rio
1个回答
0
投票
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); 是一个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
© www.soinside.com 2019 - 2024. All rights reserved.