【问题标题】:Save file dialog to save txt from array of numbers保存文件对话框以从数字数组中保存 txt
【发布时间】:2021-12-18 00:18:13
【问题描述】:

我会使用 TSaveTextFileDialog 将我的 2 个整数和浮点数组分别保存到“csv 样式”.txt 文件中。我正在尝试使用 Windows VCL 应用程序在 C++ Builder 中执行此操作。 这是我的尝试:

__fastcall TForm6::TForm6(TComponent* Owner)
    : TForm(Owner)
{
    saveTxtDlg = new TSaveTextFileDialog(this);

    TStrings* encodings = new TStringList();

    encodings->AddObject("UTF8", TEncoding::UTF8);

    saveTxtDlg->Encodings->Assign(encodings);

    saveTxtDlg->Filter = "Text files (*.txt)|*.TXT";
}
void __fastcall TForm6::Button2Click(TObject *Sender)
{
    if (saveTxtDlg->Execute(this->Handle))
    {
        String filename = saveTxtDlg->FileName + ".txt";

        int encIndex = saveTxtDlg->EncodingIndex;

        TEncoding* enc = dynamic_cast<TEncoding*>
            (saveTxtDlg->Encodings->Objects[encIndex]);

        int x[] = {1, 2, 3, 4, 5};
        float y[] = {10.1, 20.5, 30.8, 40.7, 50.2};

        for (int i = 0; i < 5; i++) {
            std::string s = std::to_string(x[i]) + "," + std::to_string(y[i]);
            s.SaveToFile(filename, enc);

        }

    }
}

但是 string 没有“SaveToFile”的成员。请问我怎么解决?提前谢谢你。

【问题讨论】:

  • 您正在泄漏您的TStringList 对象。你需要在Assign()'ing 到对话框之后delete 它。否则,您可以完全摆脱它,而只使用saveTxtDlg-&gt;Encodings-&gt;AddObject(_D("UTF8"), TEncoding::UTF8);

标签: c++ c++builder vcl tsavedialog


【解决方案1】:

对话框仅提供用户选择的文件名。您负责实际打开这些文件并根据需要将数据写入其中。

例如,看看TStringList::SaveToFile()TFile::WriteAllText()/WriteAllLines()TStreamWriter::Write()/WriteLine() 等内容。

试试这样的:

void __fastcall TForm6::Button2Click(TObject *Sender)
{
    if (saveTxtDlg->Execute(this->Handle))
    {
        String filename = saveTxtDlg->FileName;

        int encIndex = saveTxtDlg->EncodingIndex;

        TEncoding* enc = static_cast<TEncoding*>(saveTxtDlg->Encodings->Objects[encIndex]);

        int x[] = {1, 2, 3, 4, 5};
        float y[] = {10.1, 20.5, 30.8, 40.7, 50.2};

        TStringList *txt = new TStringList;

        for (int i = 0; i < 5; ++i) {
            String s = String(x[i]) + _D(",") + String(y[i]);
            txt->Add(s);
        }

        txt->SaveToFile(filename, enc);
        delete txt;
    }
}

或者:

#include <System.IOUtils.hpp>

void __fastcall TForm6::Button2Click(TObject *Sender)
{
    if (saveTxtDlg->Execute(this->Handle))
    {
        String filename = saveTxtDlg->FileName;

        int encIndex = saveTxtDlg->EncodingIndex;

        TEncoding* enc = static_cast<TEncoding*>(saveTxtDlg->Encodings->Objects[encIndex]);

        int x[] = {1, 2, 3, 4, 5};
        float y[] = {10.1, 20.5, 30.8, 40.7, 50.2};

        TStringDynArray txt;
        txt.Length = 5;

        for (int i = 0; i < 5; ++i) {
            String s = String(x[i]) + _D(",") + String(y[i]);
            txt[i] = s;
        }

        TFile::WriteAllLines(filename, txt, enc);
    }
}

或者:

void __fastcall TForm6::Button2Click(TObject *Sender)
{
    if (saveTxtDlg->Execute(this->Handle))
    {
        String filename = saveTxtDlg->FileName;

        int encIndex = saveTxtDlg->EncodingIndex;

        TEncoding* enc = static_cast<TEncoding*>(saveTxtDlg->Encodings->Objects[encIndex]);

        int x[] = {1, 2, 3, 4, 5};
        float y[] = {10.1, 20.5, 30.8, 40.7, 50.2};

        TStreamWriter *txt = new TStreamWriter(filename, false, enc);

        for (int i = 0; i < 5; ++i) {
            String s = String(x[i]) + _D(",") + String(y[i]);
            txt->WriteLine(s);
        }

        txt->Flush();
        delete txt;
    }
}

【讨论】:

  • 非常感谢@Remy Lebeau。这就是我一直在寻找的答案。
猜你喜欢
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多