如何在Android应用程序中使用C++生成器写入文件? [英] How can I write to a file using C++ buider in an Android app?

查看:58
本文介绍了如何在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->ItemsTStrings,它有自己的SaveToFile()方法,例如:

ListBox1->Items->SaveToFile(FileName, TEncoding::UTF8);
您只是在重复SaveToFile()已经为您做的事情。因此,您不需要手动编写字符串--尤其是因为您一开始甚至没有正确编写它们!

在C++Builder中StringUnicodeString的别名,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++生成器写入文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆