2016-07-15 76 views
0

对于一个学校任务,我必须完成一个游戏。我已经接近完成了,但最后一项任务让我很难过。C++,从txt文件中读取文本并附加到文本框或从编辑框添加文本到文本框

目前我已经想出了如何在用户获得高分时从编辑框中获得文本(名称)。

这与做:

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 

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

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

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

实施例: 编辑框输入: “唐”
消息框的输出: “唐”
文本文件输出: “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; 
    } 
} 

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

回答

0

第一个问题是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,但是如果它是最近的版本,你可以用和delete[]替换为unique_ptr(它会自动删除分配的内存,所以你不需要必须记得这样做):

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

inputFile << text.get(); 
+0

非常感谢你,我会在一秒钟之内尝试它。我正在使用visual studio 2015 ...还有一个问题,你说它只有一个charachter的空间,这是正确的,因为我已经注意到了。但是消息框怎么能够获得完整的文本? –

+0

@ D-Antonio既然你说你在调用'GetDlgItemText()'时有20个字符的空间,它会为你复制全部20个字符。额外的19个字符在你有空间的1个字符后被写入内存中的任何内容,以致内存被损坏。基本上你很幸运没有重要的东西被覆盖。 – Andy