Seite 2 von 3

Verfasst: 23.06.2009 12:11
von Jume
ich krieg es nicht hin, nun erkennt er zwar das ich test.txt einlesen möchte, kann den text auch ausgeben der drinne steht aber leider bekomm ich es nicht hin das er alle t's darin liest und mir dann sagt wieviele es sind.

Code: Alles auswählen

OpenConsole()
eingabe$ = "t"
liste$ = "test.txt"
If OpenFile(0, liste$)
text$ = ReadString(0)
string = CountString(liste$, eingabe$)
CloseFile(0)
PrintN (text$)
EndIf

If Str(string) <> "0"
PrintN ("super " +Str(string)+ " mal")
Else
PrintN ("na toll null mal")
EndIf
Delay(9000)

Verfasst: 23.06.2009 12:28
von Kiffi

Code: Alles auswählen

string = CountString(text$, eingabe$)

Verfasst: 23.06.2009 12:38
von Jume
ahhh

danke dir =)

Verfasst: 23.06.2009 13:33
von dysti
@Jume,
du mußt natürlich jetzt bedenken, das er ja nur das Ergebnis aus

Code: Alles auswählen

CountString(text$, eingabe$)
in der Variablen "string" speichert.
Die Bezeichnungswahl ist in diesem Zusammenhang etwas unglücklich, weil das Rückgabeergebnis von "Countstring()" numerisch ist.
Man sollte sie evtl. z.B. "anz_zeichen" nennen, damit auch von der Bedeutung her klar ist, das dort eine Zahl gespeichert wird.

Die nächste Schwierigkeit ist, das "ReadString()" ja nur eine Textzeile einliest.
Da du ja die ganzen Text der Datei einlesen möchtest, muß du eine Schleife einbauen, der alle Textzeilen einer Datei ausliest.
Dann muß du das Zählergebnis einer Zeile zu einem Gesamtergebnis addieren, um die Gesamtzahl der enthaltenen Zeichen der Datei zu erhalten.

.....und das sehe dann so aus:

Code: Alles auswählen

; Am Anfang sollte man die Variablen declarieren
; würde auch gehen, aber nicht übersichtlich
; Define eingabe$, liste$, text$, anz_zeichen_zeile.l, anz_zeichen_datei.l

Define eingabe$, liste$, text$                          ; alphanumerische Variablen
Define anz_zeichen_zeile.l, anz_zeichen_datei.l         ; numerische Variablen

OpenConsole()
eingabe$ = "t"
liste$ = "test.txt"
If OpenFile(0, liste$)                                  ; können wir die Datei öffnen?
While Eof(0) = 0           ; sich wiederholende Schleife bis das Ende der Datei ("end of file") erreicht ist 
text$ = ReadString(0)                                   ; Zeile einlesen
anz_zeichen_zeile = CountString(text$, eingabe$)        ; Anzahl der Zeichen zählen und zwischenspeichern
anz_zeichen_datei=anz_zeichen_datei + anz_zeichen_zeile ; Ges-zahl gezählter Zeichen addieren + den Summanden erhöhen
Wend                                                    ; wir lesen die Datei bis zum Ende aus
CloseFile(0)                                            ; Ende erreicht? Dann schließen wir die Datei
EndIf                                                   ; Ende der If-Schleife von "If OpenFile(0, liste$)"
If Str(anz_zeichen_datei) <> "0"                        ; Vergleich, ob überhaupt zeichen gezählt worden sind.
PrintN ("super " +Str(anz_zeichen_datei)+ " mal")       ; Aha, wir haben mehr als 0 Zeichen gezählt
Else
PrintN ("na toll null mal")                             ; Nun ja, war wohl nichts
EndIf
Delay(9000) 
Ich hoffe, das du so damit klarkommt. Sonst nachfragen.

Verfasst: 23.06.2009 13:38
von Little John
Jume, noch ein paar Tipps:

Rücke am besten die Zeilen zwischen <irgendwas> und End<irgendwas> ein (z.B. If/Else/EndIf, Procedure/EndProcedure u.ä.), das erhöht enorm die Lesbarkeit für Dich und für uns:

Code: Alles auswählen

OpenConsole()
eingabe$ = "t"
liste$ = "test.txt"
If OpenFile(0, liste$)
   text$ = ReadString(0)
   string = CountString(liste$, eingabe$)
   CloseFile(0)
   PrintN (text$)
EndIf

If Str(string) <> "0"
   PrintN ("super " +Str(string)+ " mal")
Else
   PrintN ("na toll null mal")
EndIf
Delay(9000)
Ist Dir klar, dass Dein Programm im Moment nur die 1. Zeile von "test.txt" liest? Wenn es die ganze Datei lesen soll, dann sieh Dir mal das Beispiel in der Hilfe zu ReadFile() an.

Du solltest hier sowieso besser ReadFile() statt OpenFile() nehmen ( Warum? Selbst rauskriegen. ;-) ).

Am besten gewöhnst Du Dir schon gleich zu Anfang an, sinnvolle Variablennamen zu verwenden. Teilweise ist das Geschmacksache, aber z.B. ist string kein sinnvoller Name für eine Variable, die ein Zählergebnis enthält.

Und eine Zahl vergleicht man mit einer Zahl. Man wandelt sie normalerweise nicht in einen String um, um sie dann mit einem String zu vergleichen. Also statt

Code: Alles auswählen

If Str(string) <> "0"
schreibt man normalerweise einfach

Code: Alles auswählen

If string <> 0
;-)

Bei so einem kleinen Codestück spielt das alles noch keine große Rolle. Aber es ist besser Du gewöhnst Dir manche Dinge gleich richtig an, bevor es später bei größeren Programmen Probleme gibt.

Ooops ... Ich sehe gerade, dysti war etwas schneller als ich und hat z.T. das Gleiche geschrieben. ;-)

Gruß, Little John

Verfasst: 23.06.2009 13:43
von dysti
Ich schließe mich @Little John an. :allright:
Das mit

Code: Alles auswählen

If string <> 0
habe ich glatt übersehen. :oops:

So wäre es richtig:

Code: Alles auswählen

Define eingabe$, liste$, text$                          
Define anz_zeichen_zeile.l, anz_zeichen_datei.l        

OpenConsole()
eingabe$ = "t"
liste$ = "test.txt"
If OpenFile(0, liste$)
    While Eof(0) = 0           
        text$ = ReadString(0)                                   
        anz_zeichen_zeile = CountString(text$, eingabe$) 
        anz_zeichen_datei=anz_zeichen_datei + anz_zeichen_zeile 
    Wend                                                   
CloseFile(0)                                            
EndIf
                                                  
If anz_zeichen_datei <> 0                      
       PrintN ("super " +Str(anz_zeichen_datei)+ " mal")     
    Else
       PrintN ("na toll null mal")                          
EndIf
Delay(9000) 

Verfasst: 23.06.2009 14:06
von KatSeiko
Ja, das geht schon. Muss man aber schnell lesen können, und manchmal will man vielleicht nicht 9 Sekunden warten oder das Ergebnis etwas länger angezeigt lassen. Schreib daher vielleicht besser ans Ende statt Delay()

Code: Alles auswählen

Print("Enter zum Beenden")
Input()
Nebenbei kannst du statt

Code: Alles auswählen

        anz_zeichen_zeile = CountString(text$, eingabe$)
        anz_zeichen_datei=anz_zeichen_datei + anz_zeichen_zeile 
auch einfach

Code: Alles auswählen

        anz_zeichen_datei = anz_zeichen_datei + CountString(text$, eingabe$)
schreiben. Doppelte Variablen sollte man vermeiden, wenn es geht. Später wird das vor Allem bei großen Projekten wichtig.

Verfasst: 23.06.2009 15:31
von Andesdaf
@Jume: Such dir bitte einen besseren Threadnamen aus sonst findet man
dein Thema und die dazugehörigen Codes nur schwer mit der Suchfunktion :wink:

Verfasst: 23.06.2009 16:06
von dysti
@Katseiko,
dieses kann man machen:

Code: Alles auswählen

anz_zeichen_datei = anz_zeichen_datei + CountString(text$, eingabe$)
aber.......
gerade als Anfänger sollte man erstmal ein Schritt nach dem anderen machen.
Dein Beispiel programiertechnisch ok, aber es ist pädagogisch nicht sinnvoll.
Du hast in der Schule auch nicht gleich die binomischen Formeln gelehrt bekommen, sondern erstmal den Weg dort hin.
Deshalb in den Beispiel an den Anfang die Declaration der Variablen.
Auch das hätte man auch weglassen können.

Wie heißt es oben noch:
Blutiger Anfänger :D

Verfasst: 23.06.2009 16:38
von KatSeiko
Tja, mein Informatiklehrer pflegte immer zu sagen
Mein Informatiklehrer hat geschrieben:Wenn du weiterhin so viele unnötige Variablen einbaust, wird dein Taschenrechner ein RAM-Upgrade brauchen, wenn dein Programm darauf läuft, um 1+1 zu rechnen.
Man verschwendet hier 2 byte, die man anderswo gebrauchen kann. Gut, merkt man heute erst, wenn man größere Strukturen verwendet, die pro Stück mehrere MB verwenden (wer wäre so verschwenderisch, z.B. für jede Tile im Hintergrund eines Spiels ein extra Bild in den Speicher zu laden?), aber immerhin...
Ich nehme mal an, dass jeder, der programmiert, schon (1+2)*3 errechnen kann und nicht erst 1+2 in einer separaten Rechnung schriftlich ausrechnen muss. Viel komplizierter ist das dann auch nicht, vor allem, weil anz_zeichen_zeile eben exakt das Ergebnis von CountString(text$, eingabe$) ist.