Pufferfehler
Du verstehst nicht, was Pufferfehler sind und wann sie auftreten können? Im Folgenden erklären wir dir, wie du externe Dateien als Eingabe für dein Programm verwenden kannst.
Inhaltsübersicht
Einlesen von externen Dateien – Was sind Pufferfehler und wie können diese behandelt werden?
Wenn wir Eingaben tätigen, werden diese im Eingabepuffer abgelegt. Normalerweise funktioniert das auch einwandfrei. Wenn wir jetzt aber eine externe Datei hinzufügen wollen, kann es passieren, dass ein Fehler beim Einlesen dieser Datei auftritt. Leider sind solche sogenannten Pufferfehler meist so gravierend, dass das Programm beendet werden muss, da keine weiteren Eingaben mehr möglich sind.
Und genau deswegen benötigen wir eine Fehlerbehandlung. Damit wir aber überhaupt Fehler erzeugen können, benötigen wir ein Programm, das etwas einliest. In unserem Fall handelt es sich hier um eine Anwendung, die eine ganze, positive Zahl aus einer externen txt-Datei einlesen und auf Kommandozeile ausgeben soll.
Erst einmal schreibst du also im Editor deiner Wahl eine txt-Datei, in die du eine Zahl schreibst, enter drückst und sie dort abspeicherst, wo du sie schnell finden kannst. Dann kannst du deine Programmierumgebung öffnen und mit dem eigentlichen Programm beginnen.
Vorgehensweise Beispiel
Wir fangen wie immer mit der main-Funktion an. Zuerst deklarieren wir unsere benötigten Variablen. In unserem Fall ist das ein Status vom Typ int. Den brauchen wir, um nachher zu überprüfen, ob unsere Einleseoperation erfolgreich war. Außerdem benötigen wir noch eine Nummer, damit wir nachher auch etwas ausgeben können.
Nun wird es gleich etwas ungewöhnlich, denn wir begeben uns absichtlich in eine Endlosschleife. Dafür schreibst du einfach while(1). Da eins immer wahr ist, endet diese Schleife nie. Als nächstes fügen wir schnell eine Anweisung für den Benutzer des Programms hinzu, damit er weiß, was er mit diesem anfangen kann. Ist das getan, musst du dir bereits einen Namen für deine Einlese-Funktion überlegen, denn mit dieser fahren wir jetzt fort. Deswegen beenden wir vorerst auch unsere main-Funktion mit einem Rückgabewert und behandeln zunächst die Einlese-Funktion.
Sie erhält keinen Eingabewert aus unserer main-Funktion. Deswegen beginnen wir gleich mit der Initialisierung unserer benötigten Variablen, die mehr oder weniger dieselben sind, wie die in der Hauptfunktion. Eine Ausnahme davon ist das C, das hier nur hinzugeschrieben wird, da wir Einleseoperationen wie getchar immer einer Variable zuweisen müssen. Dies tun wir, damit wir mit deren Rückgabewerten etwas anfangen zu können.
Nun lesen wir also zunächst einmal unseren Wert mittels scanf ein und schreiben das Ergebnis in unsere Nummer-Variable. Allerdings ist es hiermit noch nicht getan. Wir wollen ja später noch wissen, ob nur GENAU EINE Zahl eingegeben wurde. Um das möglich zu machen, weisen wir die gesamte Operation status zu.
Suche nach Pufferfehlern
Jetzt müssen wir nach tatsächlichen Pufferfehlern suchen. Das können wir tun, indem wir überprüfen, ob unser status EOF beträgt. EOF bedeutet hierbei „End Of File“. Wenn dein Programm also dieses Zeichen als Input erhält, bedeutet das, dass das Einlesen einer Datei fehlgeschlagen ist. Um das Ganze gründlich zu machen, überprüfen wir dann noch das nachfolgende Zeichen.
Wenn statt eines Pufferfehlers nur ein normaler Fehler, also zum Beispiel die Eingabe von Buchstaben oder mehreren Zahlen vorliegt, leeren wir einfach den Puffer mit dieser Funktion my_flush_buff() und geben dafür einen Fehlerwert aus.
Du kennst doch bestimmt diese tollen Zahlen, die dir immer angezeigt werden, wenn etwas in deinem Browser nicht funktioniert. Das liegt daran, dass bestimmte Fehler gewissen Werten zugewiesen werden, um sie unterscheiden zu können. Genau dasselbe machen wir jetzt auch für unser Programm. Wir schreiben nämlich direkt unter unsere Importe zwei Konstanten, die nachher unsere Fehlerwerte ersetzen. Solltest du also später deine Fehlerbehandlung erweitern wollen, kannst du das ohne viel Aufwand erledigen und musst nicht mühsam von Hand jeden einzelnen Wert abändern. Zu guter Letzt müssen wir nur noch – falls alles gut gegangen ist – die eingelesene Zahl zurückgeben.
Folgen wir unseren Rückgabewerten nun zurück in die main-Funktion, müssen wir sie dort noch irgendwie verarbeiten. Dazu überprüfen wir, welcher Wert zurückgegeben wurde und geben entsprechende Meldungen aus. Der Sonderfall des Pufferfehlers erhält zusätzlich zu einem netten Hinweis auf einen fatalen Programmfehler noch einen Programmabbruch, da wir einen solchen Fehler nicht während der Programmlaufzeit korrigieren können.
Test des Programms
Jetzt müssen wir unser Programm nur noch testen. Um eine Textdatei in ein Programm als Eingabe einzubinden, musst du nur für Windows diesen Befehl: type name.txt | program_name eingeben und für Linux bzw. MacOS diesen: cat name.txt | program_name. Nun sollte dein Programm einwandfrei funktionieren. Aber wir wollen ja wissen, ob unsere Fehlerbehandlung funktioniert.
Dazu können wir ganz einfach künstlich einen Pufferfehler erzeugen. Auf Windows musst du dazu – wenn du zur Eingabe aufgefordert wirst – Steuerung und Z gleichzeitig drücken. Auf Linux und MacOS geht das Ganze mit Steuerung und D. Und wie du ungültige Eingaben überprüfen kannst, sollte eigentlich klar sein. Da unser Programm jetzt getestet wurde, sollte es definitiv rund laufen und dir keine weiteren Probleme bereiten.
Du kannst jetzt externe Dateien ohne Probleme einlesen und dir damit all die lästige Schreibarbeit für jedes einzelne Programm sparen!