Geggi Geschrieben 23. Mai 2010 Geschrieben 23. Mai 2010 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. Zitieren
lbm1305 Geschrieben 23. Mai 2010 Geschrieben 23. Mai 2010 Moin, ich persönlich würde diese Variablen in einem Objekt zusammenfassen und dieses dann serialisieren. (z.B. XML). Zitieren
Bubble Geschrieben 23. Mai 2010 Geschrieben 23. Mai 2010 bei Java ging das irgendwie mit Openfile(name) und dann Out.println (int); Vom Prinzip her kann man es auch in C# so machen. Es gibt allerdings viele Möglichkeiten, Daten in Dateien zu speichern. Zitieren
BlackyEXT Geschrieben 23. Mai 2010 Geschrieben 23. Mai 2010 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 Zitieren
Mcolli Geschrieben 23. Mai 2010 Geschrieben 23. Mai 2010 (bearbeitet) 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 23. Mai 2010 von Mcolli Zitieren
Bubble Geschrieben 23. Mai 2010 Geschrieben 23. Mai 2010 Ich würde dringend empfehlen das nicht in einer Textdatei zu machen sondern in einer XML Datei. Und eine XML-Datei ist...eine Textdatei. Zitieren
Mcolli Geschrieben 23. Mai 2010 Geschrieben 23. Mai 2010 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. Zitieren
Geggi Geschrieben 25. Mai 2010 Autor Geschrieben 25. Mai 2010 Naja eigendlich würde mir das mit der txt datei reichen. Kann mir das nochmal wer erklären? (andere versteh ich sowieso net^^) Zitieren
lbm1305 Geschrieben 25. Mai 2010 Geschrieben 25. Mai 2010 Naja eigendlich würde mir das mit der txt datei reichen. Kann mir das nochmal wer erklären? (andere versteh ich sowieso net^^) Moin, einfachste Möglichkeit wäre die StreamWriter Klasse zum Schreiben, zum Lesen nutzt die die StreamReader-Klasse. http://www.tsql.de/csharp/csharp_textdatei Zitieren
Geggi Geschrieben 25. Mai 2010 Autor Geschrieben 25. Mai 2010 (bearbeitet) okay, danke aber wie mach ichs das ich int einlese? int fs = c_textdatei.ReadFile(@"c:\text.txt"); mit dem geht das ja nicht. Bearbeitet 25. Mai 2010 von Geggi Zitieren
Geggi Geschrieben 25. Mai 2010 Autor Geschrieben 25. Mai 2010 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.. Zitieren
BlackyEXT Geschrieben 25. Mai 2010 Geschrieben 25. Mai 2010 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 Zitieren
Geggi Geschrieben 25. Mai 2010 Autor Geschrieben 25. Mai 2010 der Zugriff ist nicht erlaubt wegen der sicherheit xD des programm mag den weg also auch net Zitieren
Mcolli Geschrieben 26. Mai 2010 Geschrieben 26. Mai 2010 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"); } Zitieren
Geggi Geschrieben 26. Mai 2010 Autor Geschrieben 26. Mai 2010 Okaay... danke aber wie verwend ich das jetzt? Zitieren
lbm1305 Geschrieben 26. Mai 2010 Geschrieben 26. Mai 2010 Okaay... danke aber wie verwend ich das jetzt? Wie hast Du es denn in Java gemacht? Zitieren
Geggi Geschrieben 26. Mai 2010 Autor Geschrieben 26. Mai 2010 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] Zitieren
Mcolli Geschrieben 26. Mai 2010 Geschrieben 26. Mai 2010 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 .... Zitieren
Geggi Geschrieben 26. Mai 2010 Autor Geschrieben 26. Mai 2010 Java war trotzdem einfacher ;D danke Zitieren
Mcolli Geschrieben 26. Mai 2010 Geschrieben 26. Mai 2010 Java war trotzdem einfacher ;D danke 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(); Zitieren
Geggi Geschrieben 26. Mai 2010 Autor Geschrieben 26. Mai 2010 (bearbeitet) so alles funktioniert ;D Vielen Dank :D Bearbeitet 26. Mai 2010 von Geggi Zitieren
lbm1305 Geschrieben 26. Mai 2010 Geschrieben 26. Mai 2010 Also sehe ich das richtig, dass es sich dabei immer um die gleiche Art und Anzahl an Variablen handelt? Oder ändert sich irgendwas (Anzahl oder Typ) zur Laufzeit? Zitieren
Geggi Geschrieben 26. Mai 2010 Autor Geschrieben 26. Mai 2010 Ne, ändern tut sich da nix. Werden alle Variablen gespeichert. Wenn er die zu diesem Zeitpunkt noch nicht braucht steht hald eine 0 drinen. Zitieren
lbm1305 Geschrieben 26. Mai 2010 Geschrieben 26. Mai 2010 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(); Zitieren
Empfohlene Beiträge
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.