AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) C++ ein struct mit fwrite in Datei schreiben
Thema durchsuchen
Ansicht
Themen-Optionen

ein struct mit fwrite in Datei schreiben

Offene Frage von "PAX"
Ein Thema von PAX · begonnen am 8. Jan 2007 · letzter Beitrag vom 12. Jan 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von PAX
PAX

Registriert seit: 22. Jun 2003
Ort: Karlsruhe
88 Beiträge
 
Delphi 7 Personal
 
#1

ein struct mit fwrite in Datei schreiben

  Alt 8. Jan 2007, 10:49
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
Andreas
"Wenn man irgendwann mal von allen akzeptiert wird, dann weiß man, dass man irgendwas falsch gemacht hat." Zitat: Herr Weidner

  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: ein struct mit fwrite in Datei schreiben

  Alt 8. Jan 2007, 13:51
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?
  Mit Zitat antworten Zitat
Benutzerbild von PAX
PAX

Registriert seit: 22. Jun 2003
Ort: Karlsruhe
88 Beiträge
 
Delphi 7 Personal
 
#3

Re: ein struct mit fwrite in Datei schreiben

  Alt 8. Jan 2007, 20:09
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;
}
Andreas
"Wenn man irgendwann mal von allen akzeptiert wird, dann weiß man, dass man irgendwas falsch gemacht hat." Zitat: Herr Weidner

  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: ein struct mit fwrite in Datei schreiben

  Alt 8. Jan 2007, 21:43
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;
};
  Mit Zitat antworten Zitat
Benutzerbild von PAX
PAX

Registriert seit: 22. Jun 2003
Ort: Karlsruhe
88 Beiträge
 
Delphi 7 Personal
 
#5

Re: ein struct mit fwrite in Datei schreiben

  Alt 9. Jan 2007, 19:56
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...
Andreas
"Wenn man irgendwann mal von allen akzeptiert wird, dann weiß man, dass man irgendwas falsch gemacht hat." Zitat: Herr Weidner

  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: ein struct mit fwrite in Datei schreiben

  Alt 9. Jan 2007, 20:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von PAX
PAX

Registriert seit: 22. Jun 2003
Ort: Karlsruhe
88 Beiträge
 
Delphi 7 Personal
 
#7

Re: ein struct mit fwrite in Datei schreiben

  Alt 10. Jan 2007, 07:31
dann muss ich mal wieder sagen: it's magic.

wahrscheinlich wurde ich verflucht und nun ärgern mich böse programmiergeister...

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.
Andreas
"Wenn man irgendwann mal von allen akzeptiert wird, dann weiß man, dass man irgendwas falsch gemacht hat." Zitat: Herr Weidner

  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: ein struct mit fwrite in Datei schreiben

  Alt 10. Jan 2007, 21:49
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.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#9

Re: ein struct mit fwrite in Datei schreiben

  Alt 10. Jan 2007, 22:03
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 ...
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: ein struct mit fwrite in Datei schreiben

  Alt 10. Jan 2007, 22:26
Zitat von Olli:
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 ...
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*
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz