【问题标题】:C++, reading text from txt file and append to textbox or append text from edit box to textboxC ++,从txt文件中读取文本并附加到文本框或将文本从编辑框附加到文本框
【发布时间】:2016-07-16 01:02:15
【问题描述】:

对于学校作业,我必须完成一个游戏。我已经差不多完成了,但是最后一个作业让我很难过。

目前我已经弄清楚了当用户得分高时如何从编辑框中获取文本(名称)。

这是通过以下方式完成的:

GetDlgItemText(hDlg, IDC_EDIT1, &Tsaved, 20);//Get text from edit box

我也可以将它附加到一个消息框中:

MessageBox(hDlg, &Tsaved, buff, IDOK == nId);//write text from edit box to message box

我的思路和代码过程是这样的:

目前我正在将获得的文本写入文本文件,因为我无法将获得的文本直接附加到文本框中。有了这个,我就可以在文件中写一些东西了。

我知道 TsavedTCHAR 并且只有 2 个字节,但是为了将其写入使用字符串的文件,我必须将其转换/转换为字符串。有了这个,我只是将获取文本的第一个字母写入文件。

示例: 编辑框输入:“唐”
消息框输出:“Don”
文本文件输出:“D”

这就是我完成转换/转换的方式:

TCHAR Ts = Tsaved;
stringstream ss;
string s;
char c = Ts;
ss << c;
ss >> s;

这就是我将它写入文件的方式:

std::ofstream inputfile("filename.txt");
if (!inputfile)
{
    std::cerr << "Error writing to ..." << std::endl;
}
else
{
    for (int x = 0; x < sizeof(Tsaved)-1; x++)
    {
        int a = sizeof(Ts);
        //inputfile << sizeof(Tsaved) / sizeof(TCHAR) << endl;
        inputfile << s << endl;
        //inputfile << a << endl;
    }
}

如何将获得的编辑框的全部内容写入文本文件?

【问题讨论】:

    标签: c++


    【解决方案1】:

    第一个问题是Tsaved 只有足够的空间来容纳一个字符。您需要分配足够的内存来保存文本框的整个上下文。你可以通过调用GetWindowTextLength()GetWindowText()来做到这一点:

    HWND hEditBox = GetDlgItem(IDC_EDIT1);
    int len = GetWindowTextLength(hEditBox);
    
    TCHAR* text = new TCHAR[len+1]; // need +1 to account for  trailing nullptr
    GetWindowText(hEditBox, text, len);
    

    text 现在应该包含编辑框的全文。您现在可以将其写入文件:

    std::ofstream inputfile("filename.txt");
    inputFile << text;
    

    由于text 是使用new[] 分配的,因此您也需要将其删除:

    delete[] text;
    

    其次,我不知道你的程序是否编译为Unicode,但如果是TCHAR,将被定义为wchar_t而不是char。由于它可以包含非 ASCII 字符,因此您应该使用 std::wofstream 而不是 std::ofstream。这两个类具有相同的 API,但后者可以处理所有 Unicode 字符。

    最后,我不知道您使用的是什么版本的 Visual Studio,但如果是最新版本,您可以将 new[]delete[] 替换为 unique_ptr(这将自动删除分配的内存所以你不必记得这样做):

    std::unique_ptr<TCHAR[]> text = std::make_unique<TCHAR[]>(len + 1);
    GetWindowText(hEditBox, text.get(), len);
    
    inputFile << text.get();
    

    【讨论】:

    • 非常感谢,我会在稍后尝试。我正在使用visual studio 2015 ...还有一个问题,你说它只有一个字符的空间,这是正确的,因为我已经注意到了。但是消息框怎么可能获得完整的文本呢?
    • @D-Antonio 既然你在调用GetDlgItemText() 时说你有20 个字符的空间,它会为你复制所有20 个字符。在您有空间的 1 个字符之后,额外的 19 个字符被写入内存中的任何内容,因此内存已损坏。基本上你很幸运没有覆盖任何重要的内容。
    猜你喜欢
    • 2014-11-05
    • 2020-03-12
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多