Vokale in einer Textdatei

#1
Hallo zusammen,

ich habe vor einigen Tagen damit begonnen Pascal zu lernen und stehe nun vor folgender Aufgabe.
Geschrieben werden soll ein Programm, dass die Anzahl der Vokale in einer Textdatei zählt und dies am Bildschirm ausgibt.
Nachdem ich mich da mal ran getastet habe, scheitere ich nun allerdings schon am Öffnen der Datei :(, denn wenn ich hier den Pfad eingebe ist Schluss. Kann mir jemand sagen was ich an dieser Stelle falsch mache?

Vielen Dank!

Folgendes habe ich bisher:


program vokale (Datei);


var Datei: Text;
Pfad: string;
Anzahl: integer;
a: boolean;
begin
Writeln('Welche Datei soll gelesen werden: (Pfad)');
Readln (Pfad);
Assign (Datei, Pfad);
Reset (Datei);
while not EOF do
begin
Readln (Datei);
if a then inc(Anzahl);
Close (Datei);
end;
Writeln (Anzahl);
End.
 

Mat

Well-Known Member
c-b Experte
#2
Grad mal auf http://wiki.freepascal.org/Text nachgesehen. Ich weiß nicht, ob du FPC, Delphi oder eine alte Pascal-Version benutzt.. aber das Beispiel dort sollte auch bei dir gehen. Vielleicht lauten die Funktionsnamen ein bisschen anders und try-catch geht bei dir nicht, aber davon abgesehen sollte es bei dir laufen.

Bevor du versucht, alles auf einmal zu wuppen, könntest du erstmal das Laden von Textdateien zum Laufen kriegen. Also zum Rumprobieren würde ich folgendes machen:
  • Die Testdatei vorerst direkt übergeben statt Benutzereingabe, damit du schneller testen und fehlerhafte Benutzereingaben ausschließen kannst
  • Weg mit den unnötigen Variablen Pfad, Anzahl, a und her mit einem neuen String um die aktuelle Zeile zwischenzuspeichern
  • Ich weiß nicht, ob while not EOF sich automatisch auf Datei bezieht, mach lieber EOF(Datei)
  • Ich weiß nicht, ob du dich darauf verlassen kannst, dass Variablen richtig vorbelegt sind. Deswegen initialisiere sie am besten selbst.
  • Ich weiß nicht, ob ReadLn(Datei) das ausgelesene direkt in einen Puffer schreibt, auf den du zugreifen kannst..also packe die Zeile lieber selber in eine Variable, mit der du dann auch weiterarbeiten kannst: ReadLn(Datei, ZeileTxt)
  • Du schließt den Dateistream innerhalb der while-Schleife.. das kann gar nicht richtig sein.. also erst danach schließen
  • Wenn das einlesen läuft, kannst du mal schauen, ob du eine Dokumentation für Text bzw TextFile und string findest und dann überlege, was besser ist und was überhaupt möglich ist:
    • zeichenweise auslesen und jeweils prüfen
    • zeilenweise auslesen und die ganze Zeile mit einem regulären Ausdruck prüfen oder nochmal mit einer Schleife über jeden Buchstaben rutschen

An deinen derzeitigen Code angepasst könnte das zeilenweise auslesen so aussehen:

Pascal:
program vokale;

var
  Datei     : Text;
  ZeileNr  : integer;
  ZeileTxt : string;

begin
  Assign(Datei, 'vokale.txt');
  Reset(Datei);

  ZeileNr := 0;
  while not EOF(Datei) do
  begin
    Readln(Datei, ZeileTxt);
    Inc(ZeileNr);
    WriteLn(ZeileNr, ': ', ZeileTxt);
  end;

  Close(Datei);
  ReadLn;
end.
 
Oben