Zum Inhalt springen

C# Variablen speichern


Geggi

Empfohlene Beiträge

Moin,

Ich wollte wissen wie man Variablen in einer txt datei speichert.

Also z.B. sollte man im Programm auf speichern drücken, dann soll das programm einige int, strings in die txt datei speichern, die ich dananch wieder auslesen kann wenn man auf laden drückt.

bei Java ging das irgendwie mit Openfile(name) und dann Out.println (int);

Vielleicht kann mir einer Helfen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nabend!

Du könntest auch über die Projekteigenschaften-> Einstellungen

die Erforderlichen Einstellungen anlegen.

Im Code dann einfach per

Properties.Settings.Default.*EINSTELLUNGSNAME*;
zugreifen und ändern. Und mit
 Properties.Settings.Default.Save();

speichern.

Um alles andere (zB Berechtigungen) brauchst du dir dann keine Sorgen mehr machen ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde dringend empfehlen das nicht in einer Textdatei zu machen sondern in einer XML Datei.

Nichts desto trotz habe ich für beide Fälle dir einen Sample Code geschrieben der in form einer txt Datei beiliegt .... ja ich bin zu faul die einrückungen hier zu machen :)

Bei der Methode die das schreiben von Variablen in eine XML Datei verdeutlicht fehlt das Lesen dieser erzeugten Datei .... aber das kriegste schon hin ist voll einfach..... das Lesen der Variablen ist auch der Grund für die Empfehlung das in einer XML Datei zu machen .... Du kannst die XML Tags, die den Namen der Variablen als Namen und den Wert der Variablen als InnerText beinhalten , mit Atributen versehebn die aufschluss über den Typ der Variable geben :)

Wenn Du die Daten Serialisieren willst habe ich unter

dem Post hier

einen tollen Sample Code gepostet der das verdeutlicht .... Aber Du musst halt eine Sammelklasse erezguen in der Variablen gespeichert wetrden und die dann von ISerializeable erben lassen ....

FileOutput.txt

Bearbeitet von Mcolli
Link zu diesem Kommentar
Auf anderen Seiten teilen

Und eine XML-Datei ist...eine Textdatei. ;)

naja eine XML ist eine spezielle Text-Datei..... der Metagehalt meiner Aussage war "nicht in irgendeiner Textdatei". Eine XML Datei mag ja auch z.B. utf-8 Codiert sein, aber dennoch gibt es für XML bestimmte Konventionen die es ermöglichen eine XML-Datei strukturiert auszulesen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

scheint mir doch ein bischen kompliziert zum auslesen..

die Text datei sollte so aussehen wenn man gespeichert hat

15

12

13

16

17

.

.

.

(ca. 20 variablen)

auslesen sollte dann so irgendwie gehen:

int x = In.readInt();

int y = In.readInt();

// also er soll das erste nehmen (aus der txt datei) und auf x zuweisen und dann die zweite zeile und

// das auf y zuweisen;

// so ging das ca. bei Java..

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich halte das für einen großen Umweg, gerade da es ja schon managed settings gibt...

Aber hier wäre deine Lese-Lösung:


using System.IO;

.

.

.

private StreamReader reader;

private int readInt()

{

try

{

if(reader==null){

reader=new StreamReader("variablen.txt");

}

return Convert.ToInt32(reader.ReadLine());

}

catch

{

//Speichern in Textdateien ist unsicher und unkomfortabel!

//Bei Fehler 0 ausgeben

return 0;

}

}

Aufruf:

int x = readInt();//1. Zeile

int y = readInt();//2. Zeile

.

.

.

reader.Close();

usw. Schreiben:

private StreamWriter writer;

private void speichern(int x, int y){

writer = new StreamWriter("variablen.txt");

writer.WriteLine(x.ToString());

writer.WriteLine(y.ToString());

writer.Flush();

writer.Close();

}


Aufruf:


speichern(x,y);

Trotzdem kann ich dir nur raten XML oder die eingebaute settings-Funktion zu nutzen!

PS: Code nicht getestet, mein Compiler weigert sich so nen Umweg zu kompilieren :D:P

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich schreib hier nochmal passgerecht die beiden Methoden, die ich bereits oben gepostet habe hin. Diese klappen 100% ... Wenn Du einzelene Code Passagen nicht verstehst frag dann bitte konkret nach.

Grundsätzlich ist das aber sein triviales Problem was Du hast und die bereits von andern oder auch mir geposteten Lösung sollten alle mal reichen.

Nichts desto trotz:


/// <summary>

        /// Speichert die angebene Variable in einer XMLDatei. Ist die XML Datei bereits vorhanden

        /// wird der Variable dort hinzugefügt bzw. wenn schon vorhanden der Wert ersetzt.

        /// </summary>

        /// <param name="varName"></param>

        /// <param name="varValue"></param>

        /// <param name="?"></param>

        private static void saveVar(string varName, object varValue, string pathXML)

        {

            String pfadOrdner = pathXML.Substring(0, pathXML.LastIndexOf(@"\"));

            // Prüfen ob der Ordner bereits existiert / wenn nicht anlegen

            if (!System.IO.Directory.Exists(pfadOrdner))

            {

                System.IO.Directory.CreateDirectory(pfadOrdner);


            }

            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();

            try

            {

                using (System.IO.FileStream fs = new System.IO.FileStream(pathXML, FileMode.Open, FileAccess.ReadWrite))

                {

                    doc.Load(fs);

                    System.Xml.XmlNode root = doc.FirstChild;

                    bool ersetzt = false;

                    // Nachschauen ob eine Variable mit dem Namen schon gespeichert ist.

                    foreach (System.Xml.XmlNode varNode in root.ChildNodes)

                    {

                        if (varNode.Name.Equals(varName))

                        {

                            // Wenn eine Variable mit dem Namen der abzuspeichernden Variable bereits existiert

                            // muss überprüft werden ob auch der angegebene Typ der Variablen übereinstimmt.

                            foreach (System.Xml.XmlAttribute varType in varNode.Attributes)

                            {

                                if (varType.Name.Equals("Type") && varType.InnerText.Equals(varValue.GetType().ToString()))

                                {

                                    // Wenn Typ und Name der in der XML Datei bereits gerspeicherten variablen übereinstimmt

                                    // wird der Wert geändert und markiert das eine änderung vorgenommen wurde

                                    varNode.InnerText = varValue.ToString();

                                    ersetzt = true;

                                }


                            }

                        }


                    }

                    // Wenn nix in der XML Datei ersetzt wurde wird ein neuer Node erzeugt.

                    if (!ersetzt)

                    {

                        System.Xml.XmlNode node = doc.CreateElement(varName);

                        System.Xml.XmlAttribute type = doc.CreateAttribute("Type");

                        type.InnerText = varValue.GetType().ToString();

                        node.Attributes.Append(type);

                        node.InnerText = varValue.ToString();

                        root.AppendChild(node);


                    }


                }

                File.Delete(pathXML);

                doc.Save(pathXML);


            }

            // Wenn der versuch das Document zu öffnen fehlschlug wird ein neues erzeugt.

            catch

            {

                // Erzeugen eines neuen Documentes (öffnen würde an der Stelle auch gehen

                doc = new System.Xml.XmlDocument();

                doc.CreateXmlDeclaration("1.0", "UTF-8", "yes");

                System.Xml.XmlNode root = doc.CreateElement("root");

                doc.AppendChild(root);

                System.Xml.XmlNode node = doc.CreateElement(varName);

                System.Xml.XmlAttribute type = doc.CreateAttribute("Type");

                type.InnerText = varValue.GetType().ToString();

                node.Attributes.Append(type);

                node.InnerText = varValue.ToString();

                root.AppendChild(node);

                doc.Save(pathXML);


            }


        }



        /// <summary>

        /// Sucht in der angegeben XML Datei nach der entsprechenden Variablen. Die Suche ist

        /// Typ und Namen genau. Wenn nix gefunden wird gibts ne Arguemnt exception

        /// </summary>

        /// <param name="varName">Name der Variablen</param>

        /// <param name="varType">Type der Variablen</param>

        /// <param name="pathXML">XML Datei wo die Variable mutmaßlich gespeichert ist</param>

        /// <returns>Die ausgelsene Variable</returns>

        private static object getVar(string varName, Type varType, string pathXML)

        {

            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();

            using (System.IO.FileStream fs = new System.IO.FileStream(pathXML, FileMode.Open, FileAccess.Read))

            {

                doc.Load(fs);

                System.Xml.XmlNode root = doc.FirstChild;

                // Nachschauen ob eine Variable mit dem Namen gespeichert ist.

                foreach (System.Xml.XmlNode varNode in root.ChildNodes)

                {

                    if (varNode.Name.Equals(varName))

                    {

                        // Wenn eine Variable mit dem Namen existiert

                        // muss überprüft werden ob auch der angegebene Typ der Variablen übereinstimmt.

                        foreach (System.Xml.XmlAttribute typeAttribute in varNode.Attributes)

                        {

                            if (typeAttribute.Name.Equals("Type") && typeAttribute.InnerText.Equals(varType.ToString()))

                            {

                                // Unschön aber einfach man könnte auch mittels der Activator Klasse

                                // an der stelle das ganze dynamisch erzeugen aber da raucht Dir der Kopf ab

                                if (varType == typeof(int))

                                {

                                    return Convert.ToInt32(varNode.InnerText);


                                }

                                else if (varType == typeof(string))

                                {


                                    return varNode.InnerText;

                                }

                                else if (varType == typeof(double))

                                {

                                    return Convert.ToDouble(varNode.InnerText);


                                }

                                else if (varType == typeof(decimal))

                                {

                                    return Convert.ToDecimal(varNode.InnerText);


                                }

                                else if (varType == typeof(DateTime))

                                {

                                    return Convert.ToDateTime(varNode.InnerText);


                                }

                                // Weitere Type Converts musste selber machen Wenn Du eigene Komplexe Klassen

                                // als Variablen hast die du abspeichern willst kommst du um eine

                                // serialisierung nicht drum rum!!!!ELF

                            }


                        }

                    }


                }

            }

            throw new ArgumentException("Variable nicht gefunden");


        }

Link zu diesem Kommentar
Auf anderen Seiten teilen

 Out.open("save.txt");
Out.println(klassenwahl);
Out.println(lp);
Out.println(ep);
Out.println(mana);
Out.println(gold);
Out.println(questNumber);
Out.println(lvl);
Out.println(stärke);
Out.println(intelligenz);
Out.println(geschicklichkeit);
Out.println(ausdauer);
Out.println(rezzgold);
Out.println(needep);
Out.close();
break;


In.open("save.txt");
klassenwahl = In.readChar();
lp =In.readInt ();
ep =In.readInt();
mana =In.readInt();
gold =In.readInt();
questNumber =In.readInt();
lvl =In.readInt();
stärke = In.readInt();
intelligenz =In.readInt();
geschicklichkeit =In.readInt();
ausdauer =In.readInt();
rezzgold =In.readInt();
needep =In.readInt ();
In.close();


[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Raus Kopieren und Einfügen ;)

hier mal ne Test main Methode:


// Variable zum speichern

            int bubble = 255;

            // Variable speichern

            saveVar("Bubble", bubble, @"C:\TestXML\var.xml");

            // Wert neu setzen

            bubble = 0;

            // Alten wert wieder holen

            bubble = (int)getVar("Bubble", bubble.GetType(), @"C:\TestXML\var.xml");

            // nochmla neu setzten

            bubble = 5;

            // neuen wert speichern (hier wird der alte wert überschrieben da ja schon mal gespeichert wurde

            saveVar("Bubble", bubble, @"C:\TestXML\var.xml");

            // speichern einer Variable gleichen namens aber andern Typs 

            String bubbleString = "Inhalt jetzt hier";

            saveVar("bubbleString", bubbleString, @"C:\TestXML\var.xml");

            bubbleString = "";

            bubbleString = (String)getVar("bubbleString", bubbleString.GetType(), @"C:\TestXML\var.xml");

            // Expception da Variable nicht vorhanden (case sensitiv)

            bubbleString = (String)getVar("buBBleString", bubbleString.GetType(), @"C:\TestXML\var.xml");

Schau Dir auch mal die XML Datei an die Du erzeugst (z.b. im Notepad oder Visual Studio oder so).

Der Code von mir soltle recht robust sein ....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Java war trotzdem einfacher ;D

danke :D

naja aber auch ********ener .... Du musst halt die Variablen in der richtigen reihen folge ablegen und auslesen. mein Code kann dir auch eine bestimmte Variable raus holen egal welchen Typs und an welcher stelle. die readInt Methode da macht auch nix anders als eine Zeile zu lesen und dann nach int zu Convertieren :

Text datei:

3

Hallo

auslsen

Stream reader = new StreamReader(..........)

int a = Convert.ToInt32(reader.ReadLine());

string b = reader.ReadLine();

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann finde ich das Beispiel von Mcolli sehr aufgebläht.


// Klasse, die die Variablen hält


[Serializable]

public class TestObject

{

    public string Var1 { get; set; }

    public string Var2 { get; set; }

    public int Var3 { get; set; }

}


// Der eigentliche Code, nicht ganz sauber :-)

TestObject to = new TestObject();

to.Var1 = "Hallo";

to.Var2 = "Welt";

to.Var3 = 123;


 // Speichern

var outStream = File.Open("test.xml", FileMode.OpenOrCreate);

XmlSerializer serializer = new XmlSerializer(typeof(TestObject));

serializer.Serialize(outStream, to);


outStream.Flush();

outStream.Close();



TestObject to2 = new TestObject();


// Lesen

var inStream = File.Open("test.xml", FileMode.Open);

to2 = serializer.Deserialize(inStream) as TestObject;


inStream.Close();


Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...