Autor |
Nachricht |
|
FlyingGekko Globaler Moderator

Anmeldedatum: 01.06.2003 Beiträge: 4521 Wohnort: Linz/ Urfahr
|
Verfasst am: 30.09.2012, 11:24 • Titel: |
|
|
el_momo hat Folgendes geschrieben: |
Die idee mit dem Zeilen Umbruch hatte ich auch schon nur fehlt mir dau die differenzierung
Momentan gibt er mir immer nur die leerzeilen aus.
|
Welche Differenzierung? |
|
Nach oben |
|
 |
Cody227 CULT-Urgestein

Anmeldedatum: 03.05.2011 Beiträge: 1217 Wohnort: Hamburg
|
Verfasst am: 30.09.2012, 11:34 • Titel: |
|
|
Ja, dachte ich mir, dass es sowas gibt/geben muss. Hab's bisher aber nie verwendet, deswegen war ich mir unsicher ob man das genauso einfach abfragen kann. Ich denke mit Differenzierung meint er genau dieses Zeichen, nach dem die Funktion dann sucht und den Text da aufsplittet.
//EDIT: ne die idee ist mist. dafür bräuchte ich ja für jeden Tipp erstmal ein char wo das drin gespeichert wird, bevor die random-funktion einen auswählt. Da muss ich mir nochmal was sinnvolleres ausdenken. |
|
Nach oben |
|
 |
FlyingGekko Globaler Moderator

Anmeldedatum: 01.06.2003 Beiträge: 4521 Wohnort: Linz/ Urfahr
|
Verfasst am: 30.09.2012, 12:05 • Titel: |
|
|
Die Frage ist, wieviel Wert man auf Gleichverteilung der Zufallsfunktion legt. Aber in der Regel gilt beim Programmieren immer:
Optimiere erst, wenn es notwendig ist.
Daher würde ich den einfachsten Weg wählen und folgendes machen:
1. Ich stelle irgendwie fest, wieviele Textzeilen im Dokument vorhanden sind. zb. in dem ich einmal durch das Dokument durchlaufe und die Zeilenumbrüche Zähle, auf welche kein Leerzeichen folgt (um Leerzeilen auszuschließen)
2. Ich lasse mir eine Zufallszahl zwischen 1 und der ermittelten Zeilenanzahl ausgeben
3. Ich lese die Textdatei erneut ein und wandere bis zu jener Zeile, welcher der Zufallszahl entspricht
Alternativ könnte man natürlich die jeweiligen Strings in einem Array speichern. Aber wozu sollte man neuen Speicher nutzen, wenn die Textdatei ja bereits existiert. Die Zugriffszeiten sind hier ja völlig irrelevant.
Auch könnte man sich den ersten Durchlauf sparen, in dem man einfach eine fixe Zahl (welche auf jeden Fall größer als die größtmögliche Anzahl an Zeilen ist) als Ergebniss von Punkt 1 annimmt. Dies hat aber zur Folge, dass man eventuell erst recht mehrmals das Dokument einlesen muss (Beispiel: 20 Zeilen, aber 43 als Ergebnis von Punkt 1), und dass keine Gleichverteilung mehr vorliegt.
mfg Stephan
Zuletzt bearbeitet von FlyingGekko am 30.09.2012, 12:09, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
 |
Cody227 CULT-Urgestein

Anmeldedatum: 03.05.2011 Beiträge: 1217 Wohnort: Hamburg
|
Verfasst am: 30.09.2012, 12:08 • Titel: |
|
|
Ja, man wird wohl nicht drum rum kommen erstmal die Zeilen zu zählen. Das kommt bei mir aber erst später, ich arbeite gerade noch am drumherum, also GUI usw. Ich hoffe nur ich werde für den Kram kein DoubleBuffering brauchen. :S
Zuletzt bearbeitet von Cody227 am 30.09.2012, 12:10, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
FlyingGekko Globaler Moderator

Anmeldedatum: 01.06.2003 Beiträge: 4521 Wohnort: Linz/ Urfahr
|
Verfasst am: 30.09.2012, 12:10 • Titel: |
|
|
Cody227 hat Folgendes geschrieben: |
Ja, man wird wohl nicht drum rum kommen erstmal die Zeilen zu zählen. Das kommt bei mir aber erst später, ich arbeite gerade noch am drumherum, also GUI usw. |
Ich habe noch etwas ergänzt im letzten Beitrag. Aber was stört dich daran, die Zeilenanzahl ermitteln zu müssen. Wie gesagt: Optimiert wird nur, wenn es notwendig ist.
mfg Stephan |
|
Nach oben |
|
 |
Cody227 CULT-Urgestein

Anmeldedatum: 03.05.2011 Beiträge: 1217 Wohnort: Hamburg
|
Verfasst am: 30.09.2012, 12:12 • Titel: |
|
|
Mich stört daran, dass ich dann erstmal überlegen muss wie ich das überhaupt angehe xD Bei der Geschichte mit den Chars für jede Zeile hätte ich quasi schon den Code im Kopf gehabt, aber das ist ja totaler Mist mit dieser Methode. Da bräuchte man ja unheimlig viele chars. |
|
Nach oben |
|
 |
FlyingGekko Globaler Moderator

Anmeldedatum: 01.06.2003 Beiträge: 4521 Wohnort: Linz/ Urfahr
|
Verfasst am: 30.09.2012, 12:17 • Titel: |
|
|
Dafür hat uns der Herrgott das Dateiformat String (=ein Char-Array) gegeben
Bei deiner Methode brauchst du aber auch keine Strings:
1. Laufe durch die Textdatei und zähle die Zeilenumbrüche
2. Ermittle die Zufallszahl x wie bereits beschrieben
3. Lese die Datei erneut ein bis du beim (x-1)ten Zeilenumbruch bist. Gib anschließend jedes eingelesene Char aus, bis der nächste Zeilenumbruch eingelesen wird.
Hier brauchst du keine Strings sondern nur ein Char als Buffer.
mfg Stephan
PS: Vergiss nicht, dass Zeilenumbrüche auf welche ein Leerzeichen folgt, einfach ignoriert werden können.
PSS: Wolltest du die ganze Textdatei zwischenspeichern, würden sich ein String-Array (=zweidimensionales Char-Array) anbieten. |
|
Nach oben |
|
 |
Cody227 CULT-Urgestein

Anmeldedatum: 03.05.2011 Beiträge: 1217 Wohnort: Hamburg
|
Verfasst am: 30.09.2012, 12:44 • Titel: |
|
|
Ok, ich bin jetzt fertig mit dem Fenster an sich und fang jetzt gleich mit der Auswertung der textdatei an.
@FlyingGekko: Weißt du zufällig die Funktion auswendig, die ich brauche um die Zeilenumbrüche zu zählen? |
|
Nach oben |
|
 |
FlyingGekko Globaler Moderator

Anmeldedatum: 01.06.2003 Beiträge: 4521 Wohnort: Linz/ Urfahr
|
Verfasst am: 30.09.2012, 12:56 • Titel: |
|
|
Funktion brauchst du da gar keine spezielle. Ein Zeilenumbruch entspricht dem char "\n".
Allerdings müsste Aaron hier mal eine genaue Spezifikation zum Syntax bzw. eine Test-Datei posten. Ohne diese kann man die Sonderfälle nicht berücksichtigen (und die machen ja die meisten Probleme)
mfg Stephan
PS: Sollte es bis zum Abend bei dir nicht klappen, poste ich hier den passenden Code. Ich sitze aktuell an einem IPad und da ist mir das zu umständlich. |
|
Nach oben |
|
 |
Cody227 CULT-Urgestein

Anmeldedatum: 03.05.2011 Beiträge: 1217 Wohnort: Hamburg
|
Verfasst am: 30.09.2012, 13:29 • Titel: |
|
|
ich versuch es jetzt mal so:
ich lese erst die ganze datei aus und speichere sie in einem String. da such ich dann mit IndexOf() nach "\n" und lösche dann alle Zeichen aus dem String, bis zu dem Index, den ich von IndexOf() bekomme. Das ganze ist dann in einer Schleife und funktioniert solange IndexOf() ein ergebnis liefert. Bei der Schleife läuft dann ein Zähler mit und der gibt mir dann am ende die zahl der zeilenumbrüche.
Wird aber kompliziert das so zu machen  |
|
Nach oben |
|
 |
|