![]() |
ein struct mit fwrite in Datei schreiben
Grüßt euch, Freunde!
Ich habe eine folgende Struktur:
Delphi-Quellcode:
Und diese schreibe ich mit folgendem Quelltext in eine Datei:
struct EinstellungsDatei { // Format für die Konfigurationsdatei
int AVon, ABis, MFak, MPro, ZeitAuf, ZeitAbf, StatSitz, Addi, Subt, Mult, Div; bool ZeitBe, ZeitDan, ManBe1, ManBe2, ManBe3, ManBe4, ManBe5; };
Delphi-Quellcode:
Das Problem ist, dass nachher beim Einlesen und setzen der Werte innerhalb der Komponenten, die ersten 5 Komponenten die korrekten (gespeicherten) Werte auch wieder tatsächlich bekommen und die restlichen Komponenten bekommen unsinnige zufällige Werte. Des Weiteren ist der Rückgabewerte der fopen() hierbei 0 - folglich trat ein Fehler auf.
benutzerName = "Benutzer\\"+Form2->LabeledEdit1->Text+".cfg";
struct EinstellungsDatei maske; FILE *datei2 = fopen(benutzerName.c_str(), "wb"); //erstmal die GroupBox für die Zahlenbereiche (immer von links nach rechts, oben nach unten) maske.AVon = Form3->Edit1->Text.ToInt(); maske.ABis = Form3->Edit2->Text.ToInt(); ... fwrite(&maske, sizeof(maske), 1, datei2); fclose(datei2); FileSetAttr("Benutzer\\"+Form2->LabeledEdit1->Text+".cfg", faSysFile); Ich kann mir das nur nicht erklären, weil zum Zeitpunkt des Speicherns die Elementvariablen der Struktur richtige Werte besaßen und diese theoretisch auch geschrieben werden sollten. Komisch finde ich hier auch, dass "datei2" offensichtlich ein Zeiger ist. Und müsste man für Zeiger nicht vorher Speicherplatz reservieren? Ich habe die obrige Lösung halt einfach so aus dem Programmierbeispiel aus der Hilfe entnommen. Habt ihr einen Plan, was falsch läuft? Danke, beste grüße und viva los tioz! PAX |
Re: ein struct mit fwrite in Datei schreiben
Ich weiss nicht in wie fern es hier mit reinspielt, aber Strukturen in C++ sind Klassen und das er daher was falsches abspeicherst. Was ist, wenn du dir einfach die Struktur als Typ definierst (typedefine struct ...)? Sollte dann (meinem bescheidenen C++ Wissen nach), dies wieder zu einem reinen Typ werden und keine Klasse mehr sein?
|
Re: ein struct mit fwrite in Datei schreiben
hey, der mütze? :)
grüß dich! habs jetzt mit folgender änderung probiert:
Delphi-Quellcode:
aber es verhält sich immernoch genauso... :| sobald ich die geschriebene datei einlesen möchte, werden die ersten 5 variablen gesetzt und danach scheint der lesevorgang abgebrochen zu werden.
typedef stuct EinstellungsDatei ma;
ma maske; die methode zum einlesen ist im prinzip analog zu dieser schreibmethode. aber es wäre nicht vielleicht möglich, dass man nicht zu viele variablen in das struct packen darf, oder? hättet ihr alternativ eine weitere variante, wie ich meine variablen professionell in eine datei (auf übersichtlicher weise) schreiben kann? möglich wäre auch, sie mit platzhaltern hintereinander einzeln zu schreiben. allerdings ist der quellcode nachher ziemlich umständlich und unübersichtlich. :? bg PAX PS: im programmierbeispiel in der hilfe ist doch kein wesentlicher unterschied zu meinem code, gell?
Delphi-Quellcode:
#include <stdio.h>
struct mystruct { int i; char ch; }; int main(void) { FILE *stream; struct mystruct s; if ((stream = fopen("TEST.$$$", "wb")) == NULL) /* Öffnet Datei TEST.$$$ */ { fprintf(stderr, "Cannot open output file.\n"); return 1; } s.i = 0; s.ch = 'A'; fwrite(&s, sizeof(s), 1, stream); /* write struct s to file */ fclose(stream); /* close file */ return 0; } |
Re: ein struct mit fwrite in Datei schreiben
Zitat:
So, eben nochmal ausprobiert und klappt bei mir. Folgender Code und Deklarationen:
Code:
Die Struktur:
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) { FILE *fp = NULL; FileStruct maske; fp = fopen(ChangeFileExt(Application->ExeName, ".tst").c_str(), "wb"); if (fp) { maske.a = StrToInt(Edit1->Text); maske.b = StrToInt(Edit2->Text); maske.c = StrToInt(Edit3->Text); maske.d = StrToInt(Edit4->Text); if (fwrite(&maske, sizeof(maske), 1, fp) != 1) ShowMessage("file not correctly written!"); fclose(fp); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { FILE *fp = NULL; FileStruct maske; fp = fopen(ChangeFileExt(Application->ExeName, ".tst").c_str(), "rb"); if (fp) { if (fread(&maske, sizeof(maske), 1, fp) != 1) ShowMessage("file not correctly read!"); fclose(fp); Label1->Caption = IntToStr(maske.a); Label2->Caption = IntToStr(maske.b); Label3->Caption = IntToStr(maske.c); Label4->Caption = IntToStr(maske.d); } } //---------------------------------------------------------------------------
Code:
struct FileStruct {
int a, b, c, d; }; |
Re: ein struct mit fwrite in Datei schreiben
na du bist der mütze aus rostock, der zwar auch eine annika kennt, welche allerdings nicht meine schwester ist :)
verdammt! is immer noch... probiers mal wie ich mit 18 integervariablen, vielleicht funktionierts dann bei dir auch nicht. wie gesagt, die ersten 5 variablen können nachher eingelesen werden, danach scheint er nix mehr einzulesen, sprich, die restlichen variablen werden garnicht erst gesetzt - das würde auch ihre zufälligen und äußerst unsinnigen werte erklären. sowas ärgerliches wäre mir in bei delphi bestimmt nicht passiert... :? :cry: |
Re: ein struct mit fwrite in Datei schreiben
Aso, ok, ich weiss wieder.
Ok, zu deinem Problem: Ich habe den struct nun um die Variablen a bis z erweitert und auch diese schreibt er einwandfrei und liest sie auch wieder korrekt aus. Ich kann kein Problem feststellen. |
Re: ein struct mit fwrite in Datei schreiben
dann muss ich mal wieder sagen: it's magic.
wahrscheinlich wurde ich verflucht und nun ärgern mich böse programmiergeister... :angel2: wenn dies, warum auch immer, nicht geht bei mir, dann brauch ich jedoch eine alternative, weil ich sonst nicht wirklich weiterprogrammieren kann. es gäbe noch die variante mit der TIniFile, welche ich aber nicht nehmen kann. wie würdest du 18 variablen sichern? zeilenweise in eine datei schreiben, wäre noch eine möglichkeit, ich finds sie nur unschön. :cry: |
Re: ein struct mit fwrite in Datei schreiben
Wieso unschön? nutz doch einfach C++ mit dessen Syntax um die Variablen in ein File zu schieben. Wenn du den C++Builder nutzt, könntest du gleiches (wie dein Ansatz) mit dem TFileStream erreichen oder zusätzlich mit den TReader und TWriter Klassen der VCL.
|
Re: ein struct mit fwrite in Datei schreiben
Zitat:
|
Re: ein struct mit fwrite in Datei schreiben
Zitat:
*Ketchup zurückgeb* |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz