【问题标题】:How do I save/load information onto/from my device?如何在我的设备上/从我的设备上保存/加载信息?
【发布时间】:2021-04-08 14:50:59
【问题描述】:

我正在开发一个应用程序,但我需要将其信息保存到计算机上,并在下次打开时从那里加载。

举个最简单的例子:我有一个字符串数组,我想将它们保存为应用程序目录中的 *.txt 文件。并且数组的每个成员都应该在文件的新行上。 我想在打开应用程序时将文件的条目加载到数组中,或者创建一个空的 *.txt 文件(如果不存在)。

注意:如果有更简单的方法可以做到这一点,而不是将它们保存到 *.txt 中,请告诉我。将它们严格保存为 *.txt 格式不是强制性的。

另外,我正在为我的应用程序使用 wxWidgets,如果它会让它变得更容易的话。

【问题讨论】:

  • 您保存了哪些信息?某种配置?窗口/控件的位置/大小?应用数据?
  • 我正在那里保存列表框的成员。用户可以将成员添加到此列表中(或者将能够,只要我弄清楚如何保存/加载这些字符串)
  • 请重新阅读我的问题,然后给出正确答案。再来一次 - 你想保存什么样的信息 - 应用程序数据或某种配置?
  • 我猜是应用程序数据。
  • 你是开发者,所以你应该知道使用了什么样的数据。 ;-) 现在的问题 - 您可以使用 SQLite 保存应用程序数据,然后使用 SELECT... 查询来检索它。您可以使用标准 C++ 流类将字符串保存到磁盘然后读取它 - 网络上有很多示例,这里也有 SO。如果它实际上是您的应用程序的某种配置数据 - 请查看 wxConfig 文档。

标签: c++ wxwidgets


【解决方案1】:
MainFrame::MainFrame() {
    wxFileName f(wxStandardPaths::Get().GetExecutablePath());
    wxString appPath(f.GetPath());

    std::ifstream inputFileStream;
    inputFileStream.open(std::string(appPath.mb_str(wxConvUTF8)) + "data.txt");
    std::string data;
    inputFileStream >> data;
}
MainFrame::~MainFrame()
{
    wxFileName f(wxStandardPaths::Get().GetExecutablePath());
    wxString appPath(f.GetPath());

    std::ofstream outputFileStream;
    outputFileStream.open(std::string(appPath.mb_str(wxConvUTF8)) + "data.txt");
    std::string data = "something";
    outputFileStream << data;
    outputFileStream.close();
}

创建框架后,我获取数据。当框架被破坏时,我保存数据。我不使用 C++ 标准库类,而是使用 wxWidgets 类和方法来支持 UTF-8。 (我没有检查这段代码是否有效——它取自我的旧项目。)

【讨论】:

  • 这行得通,但我认为代码本身过于复杂。我只使用“std::ifstream input("data.txt"); std::string str; std::getline(input, str);”来实现它把我的输入变成一个字符串,然后我可以使用一种算法将它分解成一个数组。我使用“std::ofstream output("data.txt");”保存它。我不知道你建议的版本和我最终使用的版本在功能上是否有任何区别。
  • 我认为在使用某些框架时,您应该主要使用框架的解决方案(类和方法)。此外,这些方法与 wxString 和 wxWidgets + UTF-8 中的其他内容兼容。当然,如果你不使用 UTF-8 并且觉得这太复杂了,那就使用标准库吧。
  • 您肯定不想将用户数据保存到可执行路径。请改用GetDocumentsDir()
  • 同时使用 .mb_str(wxConvUTF8) 是错误的,因为路径不是 UTF-8 格式,例如视窗;因此,如果路径实际上包含任何非 ASCII,它将不起作用。使用 wxString path = f.GetPath() + "data.txt";.open(path.fn_str()) 更有可能按预期工作。
  • @User123,这些类是在 C++ 没有 STL 时创建的。现在在二十一世纪,强烈建议使用 C++/STL 类。 wx 替代品仅用于向后兼容。
猜你喜欢
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 2011-02-12
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
相关资源
最近更新 更多