mikrocontroller.net

Forum: PC-Programmierung Array einer Struktur speichern und wieder laden.


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Bernd W. (bw87)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe eine Frage zum FileStream. Ich möchte eine erstellte Struktur 
auf der Festplatte speichern um sie bei erneutem Aufruf des Programms 
wieder laden zu können.
Zur Struktur

public struct konfiguration

{
            public int id;
            public string name;
            public string description;
}
//Die Struktur hat noch weiter Variablen, aber alles int oder string von 
//daher abgekürzt

konfiguration[] neu = new konfiguration[200];
konfiguration[] zwischen = new konfiguration[200];

Nach jedem Eingeben der Werte in Textfeldern wird diese in einem 
FileStream gespeichert.(Datei ist angehangen)

FileStream savedata = new 
FileStream(@"C:\ProgramData\Konfigurationstabelle E-Paper.txt", 
FileMode.Append);
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(savedata, neu[i]);
            savedata.Close();

Um die Datei zu laden habe ich folgendes gemacht:

FileStream readdata = new 
FileStream(@"C:\ProgramData\Konfigurationstabelle E-Paper.txt", 
FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();
            konfiguration zwischen = (konfiguration) 
formatter.Deserialize(readdata);

Meine Frage:
Ich verstehe nicht ganz, was in die Variable "zwischen" gespeichert 
wurde. Ist das der gesamte Inhalt der .txt Datei? Mit dem Befehl
Textfeld1.Text = zwischen.name;

wird mir der Name des ersten Eintrags angezeigt. "neu[0].name" 
sozusagen. Wie kann ich mir neu[1].name usw. anzeigen lassen?

: Bearbeitet durch User
Autor: abcabc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zwischen ist genau ein struct vom Typ konfiguration.
Was du machst ist: du serialisierst alles nach einander und liest nur 
wieder das erste Element ein.

Was du willst: Mach dir ein struct mit dem Array von konfiguration als 
Typ und serialisiere dieses struct.

Und btw. schreib die Typen Namen groß...

Autor: Bernd W. (bw87)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich dich richtig verstehe erstelle ich folgende Struktur:

 [Serializable]
        public struct Speichern
        {
           public Konfiguration[] abspeichern;
        }
Speichern[] save = new Speichern[200];

Werte zuweisen und abspeichen geht dann folgender Maßen?(Habe den 
Fildemode auf "Create" geändert. Datei ist wieder angehangen)

save[i].abspeichern= neu;

            FileStream savedata = new 
FileStream(@"C:\ProgramData\Konfigurationstabelle E-Paper.txt", 
FileMode.Create);
            BinaryFormatter formatter = new BinaryFormatter();

            formatter.Serialize(savedata, save);
            savedata.Close();

Wird dadurch ein Array mit dem Aufbau save[] = {neu[0];neu[1];usw.} 
abgespeichert?

Wenn ich die Datei dann wieder laden möchte bekomme ich die 
Fehlermeldung "Die angegebene Umwandlung ist ungültig"

FileStream readdata = new 
FileStream(@"C:\ProgramData\Konfigurationstabelle E-Paper.txt", 
FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();
             Speichern zwischen = (Speichern) 
formatter.Deserialize(readdata);


Ich habe bisher eher in C programmiert und bin in C# noch recht am 
anfang(ist dir wahrscheinlich schon aufgefallen)

Wenn ich wie oben beschrieben falsch vorgehe wäre ein Code Beispiel 
super. Mit google und den Microsoft Hilfen verstehe ich das recht 
schwer. Da läuft das mehr nach dem Prinzig "Try and Error".

Autor: test (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nut mal nebenbei, das ist keine Textdatei. Die Dateiendung "txt" ist 
hier unschön. Du könntest generisch "bin" nutzen oder auch "cfg" oder 
ähnlich.
Musste ich mal loswerden ;-)


Zum eigentlichen Thema sage ich lieber nix ;-) Serialisieren finde ich 
sehr unschön. Besser ist es (IMHO) Konfiguration im ini oder xml Format 
zu speichern (oder auch in der Registry). Und dann bitte auch an der 
richtigen Stelle.

Ist für ein privates Hobbyprojekt zwar nicht wichtig, aber es schadet 
nich es gleich richtig zu machen.

Autor: Frank E. (Firma: Q3) (qualidat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde da besser eine HashMap verwenden, die kann als Value auch 
Objekte aufnehmen. Statt der Struct machst du ein Objekt mit all den 
Attributen in den versch. Typen. Der Vorteil ist auch, dass man sich bei 
einer HashMap nicht vorher bezüglich der Größe festlegen muss. Speichern 
kann man die HashMap so:
FileOutputStream outStream = new FileOutputStream(fname);
ObjectOutputStream outObj = new ObjectOutputStream(outStream);    
outObj.writeObject(outMap);                      
outObj.flush();                            
outObj.close();                            
outStream.close();                          

Einlesen geht so:
FileInputStream inpStream = new FileInputStream(fname);
ObjectInputStream inpObj = new ObjectInputStream(inpStream);    
inpMap=(HashMap<String,Object>)inpObj.readObject();        
inpObj.close();                            
inpStream.close();

: Bearbeitet durch User
Autor: Frank E. (Firma: Q3) (qualidat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
test schrieb:

> Zum eigentlichen Thema sage ich lieber nix ;-) Serialisieren finde ich
> sehr unschön. Besser ist es (IMHO) Konfiguration im ini oder xml Format
> zu speichern (oder auch in der Registry). Und dann bitte auch an der
> richtigen Stelle.

Java-Programme sollten plattform-Unabängig sein. "Registry" passt da 
nicht ...

Autor: Markus L. (rollerblade)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso Java? Er macht .NET.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.