2016-07-15 32 views
0

Für eine Schulaufgabe muss ich ein Spiel beenden. Ich habe es fast fertig, aber die letzte Aufgabe macht mir eine harte Zeit.C++, Lesen von Text aus TXT-Datei und Anhängen an Textfeld oder Anhängen von Text aus Bearbeitungsfeld zu Textfeld

Im Moment habe ich herausgefunden, wie man den Text (Name) aus dem Bearbeitungsfeld erhält, wenn der Benutzer eine hohe Punktzahl hat.

Das mit getan wird:

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

bin ich auch mit diesem, es zu einem Meldungsfeld anhängen können:

:

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

Code Mein Denkprozess und Verfahren dies

Im Moment schreibe ich meinen erhaltenen Text in eine Textdatei, weil ich den erhaltenen Text nicht direkt an die Textbox anhängen konnte. Damit kann ich etwas in die Datei schreiben.

Ich weiß, dass Tsaved ist ein TCHAR und nur 2 Bytes, aber um es in eine Datei schreiben, die eine Zeichenfolge verwendet, muss ich es in Zeichenfolge konvertieren/konvertieren. Damit schreibe ich nur den ersten Brief, um Text in die Datei zu bekommen.

Beispiel: Editbox-Eingang: "Don"
Meldungsfeld Ausgabe: "Don"
Textdatei ausgegeben: "D"

Dies ist, wie ich das Casting gemacht/Umwandlung:

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

Und das ist, wie ich es in die Datei schreiben:

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; 
    } 
} 

Wie bin ich Kann ich den gesamten Inhalt der erhaltenen Editbox in die Textdatei schreiben?

Antwort

0

Das erste Problem ist, dass Tsaved nur genug Platz für ein Zeichen enthält. Sie müssen genügend Speicher reservieren, um den gesamten Kontext des Textfelds zu enthalten. Sie können dies tun, indem GetWindowTextLength() und GetWindowText() Aufruf:

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 jetzt sollte den vollständigen Text des editbox enthalten. Sie können nun, dass in die Datei schreiben:

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

Da text zugeteilt wurde mit new[], müssen Sie es auch löschen:

delete[] text; 

Zweitens, ich weiß nicht, ob Ihr Programm kompiliert als Unicode oder nicht, aber wenn es TCHAR ist, wird als wchar_t anstelle von char definiert. Da es Nicht-ASCII-Zeichen enthalten kann, sollten Sie std::wofstream anstelle von std::ofstream verwenden. Die zwei Klassen haben dieselbe API, aber letztere kann alle Unicode-Zeichen verarbeiten.

Schließlich weiß ich nicht, welche Version von Visual Studio Sie verwenden, aber wenn es jüngeren Datums ist, können Sie die new[] und delete[] mit einem unique_ptr (die den zugewiesenen Speicher löscht automatisch ersetzen, so dass Sie nicht tun muss daran denken):

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

inputFile << text.get(); 
+0

Danke dir sehr, viel werde ich es in einer Sekunde versuchen. ich benutze visual studio 2015 ... noch eine frage, du sagtest es hat nur platz für einen charakter, und das ist korrekt, weil ich das bemerkt habe. aber wie ist es möglich, dass das Meldungsfeld in der Lage ist, den vollständig erhaltenen Text zu erhalten? –

+0

@ D-Antonio Da Sie gesagt haben, Sie haben Platz für 20 Zeichen beim Aufruf von 'GetDlgItemText()', hat es alle 20 Zeichen für Sie kopiert. Die zusätzlichen 19 Zeichen wurden in das geschrieben, was sich im Speicher nach dem 1 Zeichen befand, für das Sie Platz hatten, so dass der Speicher beschädigt wurde. Grundsätzlich hattest du Glück, dass nichts Wichtiges überschrieben wurde. – Andy

Verwandte Themen