Einträge aus einer Listbox in eine Text-Datei schreiben
-
Hallo miteinander.
Bin neu hier und habe schonmal gleich ein kleines Problem.
In unserem Studium haben wir eine Aufgabe bekommen und zwar eine GUI zu programmieren (windows.h). Die Dokumentation hierzu von unserer FH aus is allerdings mehr als nur dürftig. Das meiste bringen wir uns folglich selbst über's MSDN bei, nur leider steht da nicht alles und man stößt auf für den momentanen Kentnissstand noch unlösbare Probleme.Folgendes nun:
Ich möchte, wie der Titel schon sagt, die Einträge einer Listbox in eine Datei speichern.
Folgendes habe ich bisher hinbekommen:
count = (int) GetListBoxInfo (hwndList); fp = fopen(text, "wt+"); for ( i = 0; i < count; i++) { iLength = SendMessage(hwndList, LB_GETTEXTLEN, (WPARAM)i, 0); pstBuffer = (char*) malloc (iLength); SendMessage(hwndList, LB_GETTEXT, (WPARAM)i , (LPARAM) pstBuffer); fprintf(fp, "%s\n", pstBuffer); }; fclose (fp);
iLength ist int, pstBuffer ist char*
Das Problem das nun auftritt ist, dass zwar die ersten zeichen jedes Listeneintrags gespeichert werden, aber eben auch nur die, und der Rest des strings eben nicht. Die Speicherallokierung funktioniert auch, das habe ich über die Adresse und einen sizeof überprüft.Ich habe alternative Methoden ausprobiert wie die "writeFile"-Funktion, allein als auch in Kombi mit der CreateFile, allerdings kam ich damit nicht besonders weit, bzw. habe immer ein FALSE bekommen.
bei der Methode leg ich allerdings auch einen Dateinamen fest, das gestaltet sich für die nächsten Teilaufgaben wiederrum schwierig, weil ich dort noch eine Funktion einbauen soll, die mich den Speicherort selbst wählen lässt und die filenamen sind bei obiger Methode ja im Grunde immer konstant.
Ich sitz da jetz schon Stunden dran und grübel. Alles was ich im Internet so finden kann bezieht sich auf C++ oder VB oder C#. Zu C findet man leider rein gar nichts oder ich war bisher einfach zu blöd mit der Suche.
Ich danke schonmal für Antworten!
-
Die Frage ist im WinAPI-Unterforum sicher besser aufgehoben.
Was ich über LB_GETTEXTLEN gelsen habe:
MSDN schrieb:
Return value
The return value is the length of the string, in TCHARs, excluding the terminating null character. Under certain conditions, this value may actually be greater than the length of the text. For more information, see the following Remarks section.
If the wParam parameter does not specify a valid index, the return value is LB_ERR.
TCHAR kann auch UNICODE (UTF-16) sein.
Platz für die Stringterminierung hast du auch nicht.
Und dasfree
fürmalloc
fehlt auch.
(Kein Check auf Fehler (fopen, LB_GETTEXTLEN, malloc))Wie hast du das
malloc
mitsizeof
überprüft?
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
ok, sry, dass es im falschen Unterforum gelandet ist.
ein free am Ende der Schleife (nicht danach), gibt mir immer einen error aus, dass es in den Bereich nach dem Heap schreiben würde. Dabei ist das für mich die einzige richtige Position für's free. In den sizeof() habe ich immer den pstBuffer reingehaun und man hat mir immer ne 4 zurückgegeben (für jeden Listeneintrag) Ich glaube hier liegt auch das Problem, denn iLength gibt mir Werte mit 8 zurück und die allokierung des speichers müsste da doch dann auch mit 8 Byte stattfinden oder nicht?
Der TCHAR beläuft sich zwar auf einen typedef char (wenn ich das richtig recherchiert habe?) wird aber auch als int ausgelesen, und den als int casten geht leider auch nicht. iLength habe ich so auch mal nach "gemessen" und als %i printen lassen und der sagt mir auch die korrekte Anzahl der Zeichen in dem jeweiligen Listeneintrag, übergibt also wie es aussieht eine gültige Integer-Zahl. Ja die Fehlerabfragen habe ich zur Übersichtlichkeit erstmal rausgemacht, kann die auch gerne noch hinzufügen, aber in die Datei schreibt es ja. wie gesagt nur nicht alle Zeichen.
-
Evtl. passen bei dir die Projekteinstellungen nicht (ASCII<->UNICODE).
Verwende mal testweise "SendMessageA" (also die ASCII-Variante).Und ja, das free mußt du natürlich innerhalb der Schleife durchführen (also am Ende des Blocks).
Hast du denn auch den Hinweis von DirkB bzgl. LB_GETTEXTLEN beachtet?
pstBuffer = (char*) malloc (iLength + 1); // + abschließendes Nullzeichen // evtl. noch pstBuffer[iLength] = '\0';
P.S. Und sizeof(pstBuffer) ist natürlich 4, denn dies ist ja die Größe des Zeigers (auf einem 32bit-System), also "char *pstBuffer".
-
Takeda schrieb:
ein free am Ende der Schleife (nicht danach), gibt mir immer einen error aus, dass es in den Bereich nach dem Heap schreiben würde.
Das hört sich an, als ob du zuwenig Speicher anforderst.
Takeda schrieb:
Dabei ist das für mich die einzige richtige Position für's free.
Ist es auch.
Takeda schrieb:
In den sizeof() habe ich immer den pstBuffer reingehaun und man hat mir immer ne 4 zurückgegeben (für jeden Listeneintrag) Ich glaube hier liegt auch das Problem, denn iLength gibt mir Werte mit 8 zurück und die allokierung des speichers müsste da doch dann auch mit 8 Byte stattfinden oder nicht?
Du kannst mit sizeof nicht die Größe von einem Speicherbereich ermitteln. Die 4 kommt daher, dass ein char* auf 32-Bit Windoes 32-Bit groß ist.
Takeda schrieb:
Der TCHAR beläuft sich zwar auf einen typedef char (wenn ich das richtig recherchiert habe?) wird aber auch als int ausgelesen, und den als int casten geht leider auch nicht.
Und wenn es ein wchar ist?
Wie wäre wes mal mit einem sizeof(TCHAR) in deinem Programm?Takeda schrieb:
iLength habe ich so auch mal nach "gemessen" und als %i printen lassen und der sagt mir auch die korrekte Anzahl der Zeichen in dem jeweiligen Listeneintrag, übergibt also wie es aussieht eine gültige Integer-Zahl.
Sagt dir mittlerweile Nullterminierung etwas? Die braucht auch Platz.
pstBuffer = malloc ((iLength +1) * sizeof(TCHAR));
Ich kenne mich mit den ganzen Nebeneffekten von TCHAR nicht aus.
Wenn es tatsächlich ein char ist, kannst du die normalen Funktionen verwenden.
Wenn es ein wchar ist, musst du umdenken.
-
oh. wow. das iLength + 1 hat's ausgemacht. und zu dem sizeof: da will man fast meinen, nach einem semester Info 1 hat man das drin... peinlich für mich.
Danke für die Hilfe. da hapert es also an so kleinen Sachen manchmal
-
schau dir diesen Beispiel an:
http://www.codeproject.com/Articles/1707/A-Class-to-Save-and-Load-Listbox-Data