Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   C++ ein struct mit fwrite in Datei schreiben (https://www.delphipraxis.net/83899-ein-struct-mit-fwrite-datei-schreiben.html)

PAX 8. Jan 2007 09:49


ein struct mit fwrite in Datei schreiben
 
Grüßt euch, Freunde!

Ich habe eine folgende Struktur:
Delphi-Quellcode:
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;
};
Und diese schreibe ich mit folgendem Quelltext in eine Datei:
Delphi-Quellcode:
                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);
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.
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

Muetze1 8. Jan 2007 12:51

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?

PAX 8. Jan 2007 19:09

Re: ein struct mit fwrite in Datei schreiben
 
hey, der mütze? :)

grüß dich!

habs jetzt mit folgender änderung probiert:
Delphi-Quellcode:
typedef stuct EinstellungsDatei ma;
ma maske;
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.
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;
}

Muetze1 8. Jan 2007 20:43

Re: ein struct mit fwrite in Datei schreiben
 
Zitat:

Zitat von PAX
hey, der mütze? :)

Welcher denn? Oder wie?

So, eben nochmal ausprobiert und klappt bei mir. Folgender Code und Deklarationen:

Code:
//---------------------------------------------------------------------------

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);
  }
}
//---------------------------------------------------------------------------
Die Struktur:

Code:
struct FileStruct {
  int a, b, c, d;
};

PAX 9. Jan 2007 18:56

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:

Muetze1 9. Jan 2007 19:22

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.

PAX 10. Jan 2007 06:31

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:

Muetze1 10. Jan 2007 20:49

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.

Olli 10. Jan 2007 21:03

Re: ein struct mit fwrite in Datei schreiben
 
Zitat:

Zitat von Muetze1
Wieso unschön? nutz doch einfach C++ mit dessen Syntax um die Variablen in ein File zu schieben.

SENF: ... was dann allerdings eher die Stream-Operatoren (operator<< und operator>>) und FileStreams (im STL-Sinne) waeren, aber nicht diese C-Funktionen von oben ... :zwinker:

Muetze1 10. Jan 2007 21:26

Re: ein struct mit fwrite in Datei schreiben
 
Zitat:

Zitat von Olli
Zitat:

Zitat von Muetze1
Wieso unschön? nutz doch einfach C++ mit dessen Syntax um die Variablen in ein File zu schieben.

SENF: ... was dann allerdings eher die Stream-Operatoren (operator<< und operator>>) und FileStreams (im STL-Sinne) waeren, aber nicht diese C-Funktionen von oben ... :zwinker:

Aber habe ich auch nie behauptet. Ich meinte mit meiner Aussage auch diese, schliesslich schrieb ich nicht umsonst C++ und nicht C...

*Ketchup zurückgeb*


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 Uhr.
Seite 1 von 2  1 2      

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