sonderzeichen in file??? -> absturz :(
-
Ich hab bereits in einem anderen Thread von dir ein Code-Schnipsel gepostet, das den Text eines Edit Controls holt. Also hier nochmal:
int nLen = SendMessage(hwndEdit, WM_GETTEXTLENGTH, 0, 0); TCHAR *pText = new TCHAR[nLen +1]; pText[nLen] = 0; // Macht wahrscheinlich auch das Control selber, aber wir gehen am besten sicher SendMessage(hwndEdit, WM_GETTEXT, (WPARAM)nLen+1, (LPARAM)pText); delete[] pText; //löschen nicht vergessen
-
pixartist schrieb:
filesave funktion:
void SaveToFile(char *pFilename, char *pBuffer, int nSize) { FILE *file; if(!(file= fopen(pFilename, "w"))) fseek(file, 0, SEEK_SET); //fwrite(pBuffer, nSize, nSize, file); fprintf(file, "%s", pBuffer); fclose(file); }Die if-Bedingung ist falsch (genau invertiert -- bitte nochmal versuchen die Logik nachzuvollziehen). Das fseek ist überflüssig. Und ich würde fwrite oder fputs gegenüber fprintf bevorzugen. BTW, warum übergibst du nSize, benutzt es aber nicht?
case WM_COMMAND: [...] if(LOWORD(wParam)==2) { char toSave = NULL; char Content = NULL; GetWindowText(loadEdit, &toSave, 255); GetWindowText(textField, &Content, 255); MessageBox(NULL, &Content, &toSave, 0); SaveToFile(&toSave, &Content, sizeof(&Content)); } return 0;wenn in loadEdit oder textField sonderzeichen wie z.B. "." oder auch enter oder leerzeichen enthalten sind stürtzt des prog ab
hilfääääMich würde mal interessieren, wie du zu dieser Beobachtung gekommen bist, eigentlich müsste es fast immer abstürzen, unabhängig von der Art der Zeichen. Ich zähl nur kurz auf, was dort passiert.
- toSave ist eine char-Variable, also 1 Byte groß. Sofern loadEdit mehr als 1 Zeichen enthält, schreibst du unkontrolliert in den Speicher. Content genauso. Geh die Logik mal von Hand durch.
- sizeof(&Content) == sizeof(char*) == 4. Glaube nicht dass das gewollt ist.
-
Aziz schrieb:
Ich hab bereits in einem anderen Thread von dir ein Code-Schnipsel gepostet, das den Text eines Edit Controls holt. Also hier nochmal:
int nLen = SendMessage(hwndEdit, WM_GETTEXTLENGTH, 0, 0); TCHAR *pText = new TCHAR[nLen +1]; pText[nLen] = 0; // Macht wahrscheinlich auch das Control selber, aber wir gehen am besten sicher SendMessage(hwndEdit, WM_GETTEXT, (WPARAM)nLen+1, (LPARAM)pText); delete[] pText; //löschen nicht vergessenja aber wie kriege ich denn die textlänge ohne ne neue nachricht abzuschicken? ich hab das ganze jetzt gemacht indem ich die vars mit new initialisiere...geht eigentlich ganz gut...nur am ende des geladenen textes hängen manchmalm ungewollte textstücken dran, das lös ich noch...das mit der textlänge muss mir jetzt nich weiner sagen, dann isses fertig.
edit: mit der variable...die länge der chars kann ich ja erst bestimmen wenn ich die länge des feldinhaltes bestimmen kann.
-
ja aber wie kriege ich denn die textlänge ohne ne neue nachricht abzuschicken? ich hab das ganze jetzt gemacht indem ich die vars mit new initialisiere...geht eigentlich ganz gut...nur am ende des geladenen textes hängen manchmalm ungewollte textstücken dran, das lös ich noch...das mit der textlänge muss mir jetzt nich weiner sagen, dann isses fertig.
Ich verstehe deine Frage ehrlich gesagt nicht ganz. Du willst die Textlänge erhalten ohne eine "neue" Nachricht zu schicken? Ist die Textlänge etwa konstant? Oder ist das so eine philosophische Frage ähnlich wie "Wie kann man programmieren ohne zu programmieren?"

-
NEIN ich meine ohne den Send Message befehlt! ich dachte in etwas so: GetTextLength(HWND hWnd, int length);
????
-
Achsooo

Es gibt leider keine andere Möglichkeit die Textlänge eines Edit-Controls zu erhalten.
Wenn du willst kannst du dir aber eine hübsche inline Funktion schreiben, z.B.:
inline int GetEditTextLength(HWND hWnd) { SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0); }
-
inline?
wieso nennst du die nicht inline skater() ^^
nein :D, was heisst denn inline? gibt die die länge zurück oder wie erhalti ich die int? muss ich das per switch/case WM_GETTEXTLENGTH abfangen oder krieg ich das einfach aus der funktion raus?
thx für die hilfe btwedit: deine funktion braucht ein return ^^ sagt mein compiler zumindest!
-
Das Schlüsselwort inline bewirkt bei den Compilern (die es unterstützen), dass der Inhalt der Funktion an der Stelle des Funktionsaufrufes ausgebreitet wird. Das kann man sich so wie eine einfache Textersetzung vorstellen. Der Vorteil ist, dass der Overhead der bei einem Funktionsaufruf entsteht vermieden wird, weil der Funktionscode direkt an der Aufrufstelle ausgeführt wird, und dadurch keine Parameter auf den Stack gepushed bzw. keine Rücksprungadresse gespeichert werden müssen. Der Nachteil hingegen, ist, dass der Programmcode sich dementsprechend aufbläht aber der intelligente Compiler entscheidet ohnehin ob es sinnvoll ist die Funktionen auszubreiten oder nicht (man kann es mit einem speziellen Schlüsselwort jedoch erzwingen).
Ich habe übrigens einen schlimmen Fehler in meiner Funktion gemacht, hab' nämlich das 'return' vergessen.
inline int GetEditTextLength(HWND hWnd) { return SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0); }
-
Aziz schrieb:
Das Schlüsselwort inline bewirkt bei den Compilern (die es unterstützen), dass der Inhalt der Funktion an der Stelle des Funktionsaufrufes ausgebreitet wird. Das kann man sich so wie eine einfache Textersetzung vorstellen. Der Vorteil ist, dass der Overhead der bei einem Funktionsaufruf entsteht vermieden wird, weil der Funktionscode direkt an der Aufrufstelle ausgeführt wird, und dadurch keine Parameter auf den Stack gepushed bzw. keine Rücksprungadresse gespeichert werden müssen. Der Nachteil hingegen, ist, dass der Programmcode sich dementsprechend aufbläht aber der intelligente Compiler entscheidet ohnehin ob es sinnvoll ist die Funktionen auszubreiten oder nicht (man kann es mit einem speziellen Schlüsselwort jedoch erzwingen).
Ich habe übrigens einen schlimmen Fehler in meiner Funktion gemacht, hab' nämlich das 'return' vergessen.
inline int GetEditTextLength(HWND hWnd) { return SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0); }jo dankee klappt..n kleiner tipp noch ;):
inline int GetEditTextLength(HWND hWnd) { return SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0)+1; }achja wenn mir schon grad n profi fragen beantwortet
:
wieso hab ich am textende sowas: ýýýý oder auch sowas: ýýýýÝÝÝÝÝÝî? , wenn ich was lade?ladefunktion:
char *LoadFileToObj(char* file) { FILE *topen; if((topen = fopen(file, "rb")) != NULL) { int fileSize; fseek(topen, 0, SEEK_END); fileSize = ftell(topen); if(fileSize!=0) { char *buffer; buffer = new char[fileSize]; fseek(topen, 0, SEEK_SET); fread(buffer, 1, fileSize, topen); fclose(topen); return buffer; } } return "File is empty or does not exist!"; }aufruf:
if(LOWORD(wParam)==1) { toLoad = new char[GetEditTextLength(loadEdit)]; GetWindowText(loadEdit, toLoad, GetEditTextLength(loadEdit)); SetWindowText(textField, LoadFileToObj(toLoad)); }danke!
-
Kannst du natürlich machen. Aber für gewöhnlich geben solche Funktionen die Textlänge exklusive des NULL-Zeichens zurück...Du ersparst dir kurzläufig zwar das +1 beim allozieren von Textspeicher aber es könnte dir irgendwann passieren, dass du ständig 1 von der Länge abziehen musst...
-
achja wenn mir schon grad n profi fragen beantwortet :
wieso hab ich am textende sowas: ýýýý oder auch sowas: ýýýýÝÝÝÝÝÝî? , wenn ich was lade?Hmm, das könnte vielleicht daran liegen, dass du diese Zeichen auch tatsächlich in der Datei drinnen stehen hast (also falls wir davon ausgehen, dass deine Funktion richtig funktioniert). Andererseits kann's daran liegen, dass du den String einer Funktion übergibst, die einen null-terminierten String erwartet (es läuft dann so lange im Speicher wild herum bis es eine Null gefunden hat, denn dann weiß er: "Aha! Hier hört der String auf."). Ich hab deine Funktion mal verbessert:
char *LoadFileToObj(char* file) { FILE *topen; if((topen = fopen(file, "rb")) != NULL) { int fileSize; fseek(topen, 0, SEEK_END); fileSize = ftell(topen); if(fileSize!=0) { char *buffer; buffer = new char[fileSize+1]; buffer[fileSize] = 0; // Wichtig: String null-terminieren fseek(topen, 0, SEEK_SET); fread(buffer, 1, fileSize, topen); fclose(topen); return buffer; } } return NULL; // Am besten du gibst NULL bei Zeigern zurück wenn es einen Fehler gab }
-
oder deinen Speicher (falls du mehr reserviert hast, als du nachher reinliest) vorher mit ZeroMemory initialisieren bzw. nach dem Einlesen eben entsprechend der Anzahl der eingelesenen Zeichen das 0-Zeichen reinsetzen.
-
aziz hatte recht, flenders nicht ^^ ich hab mit zero memory nach dem initialisieren von buffer allen inhalt von buffer auf 0 gesetzt, fehler trotzdem da...aziz' funktion klappt!
wie kann ich n int in nen char* umwandeln?
char *lol = char(sizeof(toLoad));
so gehts nich
btw.: danke nochmal für die nette hilfe hier

-
flenders hatte eigentlich nur meine Worte ergänzt. Er hatte nicht in Frage gestellt ob ich Recht habe oder nicht...
-
Mit itoa() kannst du einen Integer in einen String umwandeln.
-
war ja nicht bös gemeint

danke!
-
pixartist schrieb:
war ja nicht bös gemeint

danke!Das nahm ich auch nicht an

-
wo wir so schön dabei sind...wie heisst die msg um die schriftart eines textedits zu ändern?
thx

-
Die heißt WM_PIXARTIST_MUSS_ERSTMAL_EIN_C++_TUTORIAL_DURCHLESEN, gefolgt von WM_PIXARTIST_MUSS_ERSTMAL_EIN_WINAPI_TUTORIAL_DURCHLESEN
-
ich bin mal nicht so gemein - WM_SETFONT

Aber der von Hepi vorgeschlagene Weg ist sicher der langfristig bessere.
