C# StreamReader Problem beim Einlesen von .txt

PeterParty

Lt. Junior Grade
Registriert
Aug. 2008
Beiträge
282
Schönen Abend @ ALL

Ich bin dabei mir einen Serial Speicher zu Erstellen.
Dazu benutze ich den StreamReader und den StreamWriter.

StreamWriter:

Code:
StreamWriter writer = new StreamWriter("Serials.txt", true, System.Text.Encoding.Default);
                    writer.WriteLine(textBox3.Text);
                    writer.WriteLine("{");
                    writer.WriteLine(textBox1.Text);
                    writer.WriteLine(textBox2.Text);
                    writer.WriteLine("}");
                    writer.Close();
                    textBox1.Clear();
                    textBox2.Clear();
                    textBox3.Clear();
                    MessageBox.Show("Save successfully");

Er Speichert nun die eingegebenen Serials in der Serials.txt ab.
z.B.
Code:
Name vom Produkt
{
E-MAIL ADRESSE
SERIEN NUMMER
}

So jetzt zu meinem eigentlichen Problem...Wie schaffe ich es das Textdokument wieder einzulesen ?
Der Name Soll in einer ComboBox aus gegeben werden wenn man dan auf "get serial" klickt sollen E-Mail und Die Serien Nummer in textbox1 und textbox 2 erscheinen.


Ich hoffe mir kann jemand helfen.

Mfg

Peter
 
Hi,
Wollte das erstmal mit .txt Testen, weil ich mit XML noch gar keine Erfahrung habe.

Mein Code sieht so aus:
Code:
StreamReader reader = new StreamReader("Serials.txt");
                while (reader.EndOfStream == false)
                {
                    string a = reader.ReadLine();
                    List<string> list = new List<string>();
                    list.Add(a);
                    comboBox1.Items.Add(a);
                    
                }
                reader.Close();

Wie kann ich es jetzt machen das Der Name in die ComboBox zum auswählen erscheint und der Rest in den {} zur E-Mail und zur Serial ?


Mfg

Peter
 
Nun, es wäre wesentlich einfacher das mit XML zu machen als das alles selbst zu schreiben.
 
Okay.. Wäre es den so Schwehr in einer .txt umzusetzen ?
Eigendlich müsste man jetzt die List Sortieren und auswerten oder ?

mfg

peter
 
Eigentlich ist das nicht richtig was du erzählst.
Und wenn dir erfahrene Leute sagen das es in XML einfacher für dich wäre, warum bist du so erpicht darauf es in .txt zu machen?
Dann setzt dich eben hin und bring dir XML selber bei ;)
 
Okay.. Ich dachte nur weil ich ja das mit in die .txt schreiben ja schon fertig habe etc...
Dan werd ich mir jetzt mal das mit XML anschauen.

Mfg
peter
 
Fertig hattest du da noch rein garnichts, wenn du dir eine so tolle Struktur ausdenkst musst dir auch gedanken machen wie du das ganze wieder parsen tuest wenn du es einließt und deine Versuche sind ja kläglich gescheitert.
Deshalb haben wir die XML ans Herz gelegt, weil es für geschachtelte Strukturen die Lösung ist ;)
 
toeffi schrieb:
Fertig hattest du da noch rein garnichts, wenn du dir eine so tolle Struktur ausdenkst musst dir auch gedanken machen wie du das ganze wieder parsen tuest wenn du es einließt und deine Versuche sind ja kläglich gescheitert.
Deshalb haben wir die XML ans Herz gelegt, weil es für geschachtelte Strukturen die Lösung ist ;)

Ja, XML ist sicher das einfachere, denoch finde ich es sinnvoll ihm zu helfen seinen ersten Gedanken fertig zu denken, anstatt ihm einfach eine verbale Breitseite zu geben. Immerhin hat er sich getraut sein scheitern einzusehen und hat hier um hilfe gefragt.
Abgesehen davon, das es noch genug Text-Dateien zum einlesen gibt, es leigen laengst nicht alle Daten als XML vor.

PeterParty schrieb:
Okay.. Wäre es den so Schwehr in einer .txt umzusetzen ?
mfg

peter

Schwer ist es nicht, nur dein Dateiformat ist leider nicht besonders geeignet zum Einlesen viea Streamreader aber es geht. (Allerdings lege ich dir ein zwei aenderungen nahe, die dir das leben leichter machen beim einlesen)

So wurde ich z.B. das speichern anders machen.

Code:
StreamWriter writer = new StreamWriter("Serials.txt", true, System.Text.Encoding.Default);
                    writer.WriteLine(textBox3.Text + "|" +textBox1.Text+ "|" +textBox2.Text);
                    writer.Close();
                    textBox1.Clear();
                    textBox2.Clear();
                    textBox3.Clear();
                    MessageBox.Show("Save successfully");
das einlesen geht dann so:
Code:
  List<FooBar> list = new List<FooBar>();
StreamReader reader = new StreamReader("Serials.txt");
                while (reader.EndOfStream == false)
                {
                    string a = reader.ReadLine();
                    // nun splite den eingelesenen string
                   // dann hast du 
                    string[] werte = a.Split('|');
                      // nun ist die frage, am besten du baust dir eine Klasse
// die alle drei werte speichern kann, diese Klasse nenne ich mal FooBar
                    FooBar fooBar =  new FooBar();
                    fooBar.ProgramName = werte[0];
                     fooBar.emailAdresse = werte[1];
                     fooBar.serienNummer = werte[2];

                    list.Add(fooBar);


                }
                reader.Close();
               comboBox1.Items.Add(list); // nun nur nach das databinding machen
// das geliche fuer deine Textboxen (Das Databinding, meine ich.)
// dann ist es auch nicht mehr sonderlich schwer das auf eine XML struktur umzubauen.

Ich denke das hilft dir weiter, mir ist kalr das Du vermutlich nun noche ein paar fragen hast, versuche denoch es ersteinmal alleine zu loesen und zu verstehen...

lg

oli
 
Ok ich entschuldige mich für mein Verhalten von gestern, hatte nicht so einen guten Tag.

An den Threadsteller: Was ich dir noch ans Herz legen will wegen den StreamReadern.

Benutz dort bitte die using-Direktive
 
toeffi schrieb:
Ok ich entschuldige mich für mein Verhalten von gestern, hatte nicht so einen guten Tag.
Passiert den besten ;)

toeffi schrieb:
An den Threadsteller: Was ich dir noch ans Herz legen will wegen den StreamReadern.

Benutz dort bitte die using-Direktive

Das ist ein sehr guter hinweis, bitte immer verwenden wenn moeglich , sprich wenn ein Object IDisposable implementiert.
 
Mike Lowrey schrieb:
Wo wir schon beim optimieren sind ;)

Sowas macht man mit dem StringBuilder....

Naja, bei 5 strings, die direkt in eine Datei geschrieben werden, streite ich ob stringbuilder oder ned.

eher nehm ich dann noch das string format

Code:
writer.WriteLine(string.Format("{0}|{1}|{2}",textBox3.Text,textBox1.Text,textBox2.Text));
hier wird intern der Stringbuilder genutzt, ich spare mir aber die initalisierung und das toString am schluss...
aber seis drum, hoffentlich schaut sichs der TE noch an...
 
Zuletzt bearbeitet:
Ich bezweifle das es bei bei einem Serial (=5 strings) bleiben wird ;)

Wie er den StringBuilder benutzt ist ja jedem selbst überlassen, dass string.Format damit arbeitet ist mir auch klar - es ging aber ja um die grundsätzliche Verwendung :)
 
Mike Lowrey schrieb:
Ich bezweifle das es bei bei einem Serial (=5 strings) bleiben wird ;)

? verstehe nun leider nciht wann das sein wird. Er will objekte serialisieren und wieder deserialisieren, und diese dann zeilenweise in einer datei speichern. Im besten Fall muss er ohnehin nur die .ToString() methode ueberschreiben, dann braucht er es ned manuel zusammen zustueckeln.

Mike Lowrey schrieb:
- es ging aber ja um die grundsätzliche Verwendung

Und wann ein StringBuilder grundsatslich zu verwenden ist , das ist in den meisten faellen geschamckssache. So ist es in meinen augen, hier eben zuviel den stringbuilder zu verwenden einfach weil zwei (drei) Lines (initialisierung und auslesen) (neuinitialisierung oder clear) mehr zu schreiben sind.

Wie gesagt, das sind schon feinheiten -> der TE hat schon so genug zu tun...
 
Nabend..@ALL
Eigentlich wollte ich Grade eine frage zu XML Datei stellen,aber jetzt nachdem mir so viel nochmal geholfen wurde.. muss ich mir das erstmal alles durchlesen und "olampl" seinen Code anschauen, Ich melde mich zu späterer Stunde noch einmal.

Danke für die vielen Antworten


Mfg

Peter
Ergänzung ()

Okay...So nun meine erste Frage:mad:

Hier ist meine Klasse:

Code:
class FooBar
    {
        string m_ProgramName;
        string m_emailAdresse;
        string m_serienNummer;
    

        public FooBar()
        { }

        public void Load(string reader)
        {
            string[] werte = reader.Split('|');
            m_ProgramName  = werte[0];
            m_emailAdresse = werte[1];
            m_serienNummer = werte[2];
        }


Und hier meine Versuche es wieder einzulesen:

Code:
List<FooBar> list = new List<FooBar>();
                StreamReader reader = new StreamReader("Serials.txt");
                while (reader.EndOfStream == false)
                {                                                     
                    FooBar fooBar = new FooBar();                    
                    fooBar.Load(reader.ReadLine());
                    list.Add(fooBar);                  

                }
                reader.Close();
                comboBox1.Items.Add(list[0]);

Mein Problem ist das in der ComboBox was ganz anders angezeigt wird, wo ist das Problem?

Ich freu mich über Hilfe


Mfg

Peter
 
Ich würde mal raten, dass in deiner Combobox dann "FooBar" drin steht?!

Wenn ja dann ganz einfach. Die ComboBox nimmt als Werte der Liste Objekte jeglichen Typs an. Um diese dann auch in der Anzeige zu repräsentieren, wird intern von der ComboBox die ToString() Methode, die übrigens jede Klasse hat, verwendet um einen String von dem Objekt zu ermitteln. Standard wäre der Klassenname. Alternativ kann man diese ToString() Methode überschreiben, sodaß dann ein beliebiger Text von ToString() zurück gegeben wird. Füge mal folgenden Text zu deiner FooBar Klasse dazu:

Code:
public override string ToString()
{
  return this.m_ProgramName;
}

Viel Erfolg!

Edit: Um auch mal meinen Senf zum optimieren noch dazu geben zu können, hier meine Lösung:
Code:
writer.WriteLine(string.Concat(textBox3.Text, "|", textBox1.Text, "|", textBox2.Text));

Warum? Weil String.Concat() im Kern die gleichen Codes, wie StringBuilder verwendet, aber nicht den Overhead von StringBuilder hat. Ebenso wird hier kein Search and Replace für den Format String ausgeführt, was dann auch mal wieder 2 Nanosekunden spart... ;)
 
Zuletzt bearbeitet:
Hi, Das Funktioniert schonmal mit

Code:
public override string ToString()
{
  return this.m_ProgramName;
}

Das problem ist nur noch das es nur 1 Produkt in der ComboBox anzeiget,Aber es können ja bis zu 20 oder mehr werden. wie kann ich das noch einrichten ?
 
Deine Liste ist eine Liste. Listen enthalten mehrere Elemente. Du fügst aber in deinem Code nur das erste Element zur Combobox dazu. Ich würde es mal so probieren:

Code:
comboBox1.Items.AddRange(list.ToArray());

Im übrigen würde ich an deiner Stelle mal prüfen ob deine Liste leer ist, da falls ja der Aufruf von Add() oder AddRange() mit einer Exception den Fehler quittiert.
 
Perfekt Dankeschön ;)

Jetzt nur noch eine Frage wie kann ich Die Email + Serial jetzt an das ComboBox Item hängen ?

Mfg

Peter

Was ich jetzt auch noch nicht verstehe ist warum lädt er nur den Namen in die ComboBox wenn ich comboBox1.Items.AddRange(list.ToArray()); Ausführe ?
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben