Entwickler-Ecke
C# - Die Sprache - Formatierung von Strings
sepp_a_u - Do 04.10.07 22:54
Titel: Formatierung von Strings
hi @ all
ich habe ein programm geschrieben, bei welchem der user seine daten eingibt (telfon, name, vorname, geb, usw usf.)
diese daten werden dann in einer txt - datei abgespeichert. jedoch habe ich das problem, dass da noch keine struktur drin ist und daher beim auslesen der daten genauso wenig eine struktur drin ist! hier mal der code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
| using System; using System.Collections.Generic; using System.Text; using System.IO;
namespace telefonbuch { class Program { static void Main(string[] args) { Menue(); } static void WriteFile() { StreamWriter schreiben = new StreamWriter(@"test.txt", true); schreiben.Write(Console.ReadLine()); schreiben.Close(); } static void ReadFile() { StreamReader lesen = new StreamReader("test.txt"); while (!lesen.EndOfStream) { Console.WriteLine(lesen.ReadLine()); } lesen.Close(); Console.ReadLine(); } static void Menue() { bool Ende = true; string[] neueAdresse = new string[7]; neueAdresse[0] = "Name"; neueAdresse[1] = "Vorname"; neueAdresse[2] = "Strasse"; neueAdresse[3] = "Plz"; neueAdresse[4] = "Ort"; neueAdresse[5] = "Telefonnr."; neueAdresse[6] = "Geburtstag"; string eingabe; Console.WriteLine("\n\n\t \t Was möchtest du tun? \n\n \t \t -----------------------------"); Console.Write("\n \t \t |#############################|"); Console.Write("\n \t \t |# N - Neue Adresse eingeben #| \n \t"); Console.Write("\t |# A - Datensätze anzeigen #| \n \t \t |# B - Beenden #|" ); Console.Write("\n \t \t |#############################|"); Console.WriteLine("\n \t \t -----------------------------"); do { switch (eingabe = Console.ReadLine().ToUpper()) { case "N": foreach (string adressen in neueAdresse) { Console.Write("{0}: ",adressen); WriteFile(); } Menue(); break; case "A": ReadFile(); Menue(); break; case "B": Ende = true; break; default: Console.WriteLine("Fehlerhafte Eingabe!"); Menue(); break; } } while (!Ende); }
} } |
wie kann ich jetzt eine struktur (ne art tabelle, wo oben der spaltenbezeichner wie zb name, vorname steht) hinbekommen? ihr könnt das prog ja mal compilieren und seht, dass die speicherung und das ansehen der gespeicherten daten absolut *mist*e aussieht. also: wie bekomme ich strutktur dahinter? hat vll wer ein konkretes bsp?
mfg
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
sepp_a_u - Fr 05.10.07 21:14
hmm weiß demnach also keiner, wie man die aus-eingabe schön formatieren kann? schade :(
falls es jedoch noch wem einfällt bitte posten ;)
mfg
Christian S. - Fr 05.10.07 21:17
Schau Dir mal die String.Format-Funktion an und lies Dir die Doku bezüglich der dort verwendeten Format-Strings durch. Ziemlich weit am Anfang steht IIRC was dazu.
sepp_a_u - Sa 06.10.07 10:06
hmm...aber da kann man doch keine tabellenform hertellen oder? hab ich es nur übersehen? also ich habe nur gesehen, wie man datum usw schön formatieren kann, aber das bringt mir leider nichts :( will ja ne shcöne tabellen form, wo dann unter "name" die ganzen namen stehen und unter "vorname" die ganzen vornamen usw usf.
wäre dankbar für nen link oder so
mfg
Kha - Sa 06.10.07 11:06
Da hast du aber etwas übersehen, nämlich die "Alignment"-Angabe (oder wie das auch immer im deutschen SDK genannt werden mag): "{0,10}" fügt den ersten Parameter ein und füllt mit so vielen Leerzeichen auf, dass die Gesamtlänge 10 beträgt.
Du musst dir aber erst einmal überlegen, ob deine Tabelle eine statische oder dynamische Breite haben soll. In ersterem Falle kannst du direkt eine Konstante wie oben angeben, ansonsten müsstest du eben für jede Spalte zuerst die längste Zelle finden und diese Breite als Alignment benutzen.
sepp_a_u - Sa 06.10.07 11:17
danke mal...
bei meiner tabelle ist jede spalte 14 zeichen lang. wie mache ich es nun, dass jeder name immer in der spalte steht, den man eingibt? denn der name kann ja mal 10 zeichen lang sein, mal kann er nur 5 zeichen lang sein. dann verschiebt sich das ganze ja leider wieder.
wie muss ich es mit dem alignment machen, damit die spalte, egal wie lang der name ist, immer 14 zeichen lang ist?
mfg
Christian S. - Sa 06.10.07 11:19
Khabarakh hat folgendes geschrieben: |
"{0,10}" fügt den ersten Parameter ein und füllt mit so vielen Leerzeichen auf, dass die Gesamtlänge 10 beträgt. |
:roll:
JüTho - Sa 06.10.07 11:22
sepp_a_u hat folgendes geschrieben: |
wie muss ich es mit dem alignment machen, damit die spalte, egal wie lang der name ist, immer 14 zeichen lang ist? |
Willst Du nicht lesen, oder kannst Du nicht lesen?
Khabarakh hat folgendes geschrieben: |
Da hast du aber etwas übersehen, nämlich die "Alignment"-Angabe (oder wie das auch immer im deutschen SDK genannt werden mag): "{0,10}" fügt den ersten Parameter ein und füllt mit so vielen Leerzeichen auf, dass die Gesamtlänge 10 beträgt. |
Ich glaube, Du willst nicht lesen; Du bist schließlich schon mehrfach darauf hingewiesen, die Forumsregeln zu beachten. Jürgen
PS. Nicht schnell genug...
sepp_a_u - Sa 06.10.07 11:31
hmm die frage ist jetzt, wie ich das anstelle?
ich denke ich wrde es hier einfügen müssen oder:
C#-Quelltext
1: 2: 3:
| StreamWriter schreiben = new StreamWriter(@"telebuch.txt", true); schreiben.Write(Console.ReadLine()); schreiben.Close(); |
jedoch wird dann immernoch nicht gut formatiert. es klappt dann immernoch nicht mit der tabellenausgabe :( :
C#-Quelltext
1: 2: 3:
| StreamWriter schreiben = new StreamWriter(@"telebuch.txt", true); schreiben.Write("{0,14}",Console.ReadLine()); schreiben.Close(); |
weiß wer, wie ich es machen muss? bzw ob die stelle überhaupt stimmt in dem code? vll muss ich ihn ja wo anders einfügen?
der ganze quelltext ist ja drin. vll kann mir wer sagen, worein damit..
mfg
Christian S. - Sa 06.10.07 11:52
Was soll diese Methode denn überhaupt machen? Du liest eine Zeile Benutzereingabe und willst die dann an eine Datei anhängen? Das klingt nicht sehr sinnvoll. :gruebel:
sepp_a_u - Sa 06.10.07 16:15
Christian S. hat folgendes geschrieben: |
Was soll diese Methode denn überhaupt machen? Du liest eine Zeile Benutzereingabe und willst die dann an eine Datei anhängen? Das klingt nicht sehr sinnvoll. :gruebel: |
ich will die benutzereingabe speichern ja. ist ja quasi ein telefonbuch. die daten werden abgespeichert. teste den code doch einmal. wie sollte ich es denn sonst machen, dass die daten gespeichert wrden? damit sie immernoch beim nächsten programmstart vorhanden sind?
mfg
Leuchtturm - Sa 06.10.07 16:27
Wenn du Tabellenform haben willst musst du entweder eine Datenbank benutzen oder eine CSV-Datei. Frage mich aber nicht wie du die anlegst.
sepp_a_u - Sa 06.10.07 16:33
Leuchtturm hat folgendes geschrieben: |
Wenn du Tabellenform haben willst musst du entweder eine Datenbank benutzen oder eine CSV-Datei. Frage mich aber nicht wie du die anlegst. |
hmm...also geht das nciht mit ner txt datei? nur mit ner csv oder access db? schade...dann muss ich wohl umsteigen und es mit csv oder txt machen... kann mir wer nur sagen, was einfacher ist? ;)
mfg
Christian S. - Sa 06.10.07 16:43
sepp_a_u hat folgendes geschrieben: |
ich will die benutzereingabe speichern ja. ist ja quasi ein telefonbuch. die daten werden abgespeichert. teste den code doch einmal. |
Das brauch ich nicht ;-)
Wenn ich sehe, dass Du mit Write einfach alles hinter einander weg in die Datei schreibst, wundere ich mich nicht, dass da keine Tabellenform bei rum kommt. Überlege doch mal, was die Write-Methode des StreamWriters macht.
sepp_a_u - Sa 06.10.07 16:47
Christian S. hat folgendes geschrieben: |
sepp_a_u hat folgendes geschrieben: | ich will die benutzereingabe speichern ja. ist ja quasi ein telefonbuch. die daten werden abgespeichert. teste den code doch einmal. | Das brauch ich nicht ;-)
Wenn ich sehe, dass Du mit Write einfach alles hinter einander weg in die Datei schreibst, wundere ich mich nicht, dass da keine Tabellenform bei rum kommt. Überlege doch mal, was die Write-Methode des StreamWriters macht. |
ja wie du schon gesagt hast alles hintereinander schreiben oder? muss ich etwa in der methode öfter die write-methode aufrufen und dann immer den abstand von vorne vergrößern und dann irgendwie in jeder write-methode den array-bereich übergebe? oder wie oder wo? ;)
mfg
Christian S. - Sa 06.10.07 16:55
Du musst überlegen, was alles in eine Zeile soll und wann Du eine neue Zeile in der Datei anfängst.
sepp_a_u - Sa 06.10.07 17:03
ja pro datensatz EINE zeile. wenn man dann eine zweite adresse eingeben will, dann muss einen neue zeile her. ich habe vorher schon gemerkt, dass dies bei meinem code leider nicht möglich ist. aber ich frage mich, wie ich das realisieren kann. hab gedacht in der write-methode noch ein \n hinzufügen, aber dann wird nach jeder eingabe (name, vorname) usw eine neue zeile angefangen. und das will ich ja auch nicht :(
hmm...
Christian S. - Sa 06.10.07 17:13
Mögliche Lösung:
Du liest eine komplette Adresse (Also Name, Vorname, etc.) in Variablen ein und schreibst sie dann in einem Rutsch mittels WriteLine in eine Zeile der Datei. Da kannst Du dann wieder eine entsprechende Stringformatierung für verwenden.
sepp_a_u - Sa 06.10.07 17:24
also ich habe jetzt mal eine neue klasse gemacht:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| public class Adresse { public string name; public string vorname; public string Strasse; public int PLZ; public string Ort; public string Telefon;
public Adresse(string n, string v, string s, int p, string o, string t) { this.name = n; this.vorname = v; this.Strasse = s; this.PLZ = p; this.Ort = o; this.Telefon = t; } } |
auf diese greife ich dann in meinem hauptprogramm drauf zu:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80:
| using System; using System.Collections.Generic; using System.Text; using System.IO;
namespace telefonbuch { class Program { static void Main(string[] args) { Menue(); } static void WriteFile() { StreamWriter schreiben = new StreamWriter(@"telebuch.txt", true); schreiben.Write(Console.ReadLine()); schreiben.Close(); } static void ReadFile() { StreamReader lesen = new StreamReader("telebuch.txt"); while (!lesen.EndOfStream) { Console.WriteLine(lesen.ReadLine()); } lesen.Close(); Console.ReadLine(); } static void Menue() { bool Ende = true; string eingabe;
Console.Clear(); Console.WriteLine("\n\n\t \t\t Menue \n\n"); Console.WriteLine("\t \t -------------------------------"); Console.Write("\t \t |#############################|"); Console.Write("\n \t \t |# N - Neue Adresse eingeben #| \n \t"); Console.Write("\t |# A - Datensätze anzeigen #| \n \t \t |# B - Beenden #|" ); Console.Write("\n \t \t |#############################|"); Console.WriteLine("\n \t \t -------------------------------"); do { switch (eingabe = Console.ReadLine().ToUpper()) { case "N": Adresse ady = new Adresse(); WriteFile(); Console.WriteLine("\nDatensatz gespeichert..."); Console.ReadLine(); Menue(); break; case "A": Console.WriteLine("\n\nDatensatzausgabe"); Console.WriteLine("------------------\n\n"); Console.WriteLine("+--------------+--------------+--------------+--------------+--------------+"); Console.WriteLine("| Nachname | Vorname | Strasse | Ort | Telefon |"); Console.WriteLine("+--------------+--------------+--------------+--------------+--------------+"); ReadFile(); Menue(); break; case "B": Ende = true; break; default: Console.WriteLine("Fehlerhafte Eingabe!"); Console.ReadLine(); Menue(); break; } } while (!Ende); }
} } |
jedoch, wie kann ich nun die einzelnen daten einlesen? komme damit noch nicht so recht klar :( wie muss ich den code abändern, damit ich das zeug einlesen kann?
mfg
Christian S. - Sa 06.10.07 17:32
Jedes Feld der Klasse mittels Console.ReadLine() einlesen und dann alle Felder formatiert in eine Zeile in die Datei schreiben.
C#-Quelltext
1: 2: 3: 4: 5:
| ady.name = Console.ReadLine(); ady.vorname = Console.ReadLine();
schreiben.WriteLine(ady.name+" .... "); |
sepp_a_u - Sa 06.10.07 19:30
also eingelesen habe ich die sachen jetzt, jedoch kann ich nicht auf sie zugreifen in der anderen methode write. hab veruscht die strings public zu machen, geht jedoch leider nicht :(
mfg
Christian S. - Sa 06.10.07 19:44
Du musst die Adresse als Parameter an die Write-Methode übergeben, weil Du sie ja nur lokal deklariert hast.
sepp_a_u - Sa 06.10.07 19:51
also quasi so dann:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| case "N": Adresse ady = new Adresse("Max", "Mustermann", "Musterstrasse", "Musterstadt", "0123456789"); Console.Write("Name: "); ady.name = Console.ReadLine(); Console.Write("Vorname: "); ady.vorname = Console.ReadLine(); Console.Write("Strasse: "); ady.Strasse = Console.ReadLine(); Console.Write("Ort: "); ady.Ort = Console.ReadLine(); Console.Write("Telefonnr.: "); ady.Telefon = Console.ReadLine(); WriteFile(Adresse); Console.WriteLine("\nDatensatz gespeichert..."); Console.ReadLine(); Menue(); break; |
und dann bei der write-methode:
C#-Quelltext
1: 2: 3: 4: 5:
| tatic void WriteFile(string Eingabe) { StreamWriter schreiben = new StreamWriter(@"telebuch.txt", true); schreiben.WriteLine(); schreiben.Close(); |
jedoch kann ich dann nicht auf die ady.xxx zugreifen :( was mache ich denn falsch? ich komm gerade nicht mit irgendwie...ist es kein string oder wie?
mfg
Christian S. - Sa 06.10.07 20:05
Du willst einen Parameter vom Typ Adresse übergeben, hast ihn aber als String deklariert. Du solltest Dir vielleicht mal strukturiert ein paar Grundlagen aneignen, anstatt zu erraten, wie ein Sourcecode aussehen muss.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!