2016-07-15 78 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