6. ANSI-C-Aufgabe: Dateioperationen

Letztes Update: Dienstag, 16. August 2016 - 16:41 Uhr

Original-Aufgabenstellung:

SQL-Querys

In der letzten Übung haben wir bereits mit Dateien gearbeitet. Mit dieser Übung werden das Thema Dateiverarbeitung noch vertiefen. Dazu schreiben wir uns ein Programm, das einfache SQL-Anfragen konstruiert und diese in einer Datei ablegt.


Wir definieren die SELECT Anweisung wie folgt:

SELECT [<Spalte1> [,<Spalte2> ...] ] FROM <Tabelle1> [, <Tabelle2> ...] [WHERE <Bedingung1> = <Wert> [<AND/OR> <Bedingung2> = <Wert>...] ] ;

Anforderungen

  • Jede Teilanweisung kommt in eine eigene Zeile, wie das Beispiel deutlich macht. Die Ausgabe ist also in Ausdruck und Form so zu übernehmen.
            SELECT *
            FROM Adresse
            WHERE AdresseId = 5
            AND Name = Maier
            OR Name = Meier;
  • Alle Statements werden mit einem ; am Ende abgeschlossen.

  • Schlüsselwörter wie SELECT, FROM, etc. werden groß geschrieben.

  • Tabellen- und Spaltenbezeichnungen sind vom Benutzer beliebig wählbar. Zulässige Zeichen sind Buchstaben, wobei nicht zwischen Groß- und Kleinbuchstaben unterschieden wird.

  • Aufrufparameter: Optionen können wie immer groß oder klein geschrieben werden
    • -h : Ausgabe der Hilfe.
    • -d <dateiname> : Name der Zieldatei. Dieser Parameter ist immer erforderlich.
    • -s [<spalten>] : Hinter dem SELECT Parameter können keine, eine oder mehrere Spalten angegeben werden. Wird kein Parameter angegeben, so wird dies in der Datei durch einen * ersetzt. Existiert die Datei noch nicht, ist dieser Parameter Pflicht.
    • -f <tabellen> : Zu dem FROM Parameter müssen mindestens eine bzw. mehrere Tabellen angegeben werden. Existiert die Datei noch nicht, ist dieser Parameter Pflicht.
    • -fa <tabellen> : Fügt der FROM Klausel eine bzw. mehrere Tabellen hinzu.
    • -w <spalte> = <wert> : Definiert die WHERE-Klausel der Query.
    • -wa <spalte> = <wert> : Erweitert die WHERE-Klausel um eine mit AND verknüpfte weitere Bedingung.
    • -wo <spalte> = <wert> : Erweitert die WHERE-Klausel um eine mit OR verknüpfte weitere Bedingung.

  • Die Reihenfolge der Parameter ist nicht festgelegt. Relevant ist diese nur bei den Parametern -wa und -wo.

  • Mehrere Spalten bzw. Tabellen werden durch Komma getrennt in die Datei geschrieben, bei Programmaufruf allerdings leerzeichensepariert.

  • Die Optionen -s, -f, -w und -d dürfen nicht mehrmals vorkommen.

  • Der Einfachheit halber werden Bedingungen in Hochkomma ("<Spalte> = <Wert>") angegeben. Dadurch wird der komplette Ausdruck zu einem einzigen Kommandozeilenargument zusammengefaßt.

  • Existiert noch keine WHERE Bedingung, so lösen die Optionen -wa und -wo einen Fehler aus.

  • Existiert die angegebene Datei bereits, so können wir davon ausgehen, daß diese eine gültige SQL Anweisung enthält. In diesem Fall ersetzen die Optionen -s, -f und -w den gesamten Folgeausdruck in der Datei. -w ersetzt also den gesamten Ausdruck inklusive aller mit AND/OR verknüpften Bedingungen.

  • Kann das Programm die Anfrage des Benutzers korrekt bearbeiten, so soll es sich mit dem Returncode 0 beenden. Tritt ein Fehler auf, so beendet sich das Programm mit Returncode 1.

Hinweise

  • Beachtet, daß bereits bestehende Dateien auch schreibgeschützt sein können. Fangt also alle Fehler ab, die bei den Dateioperation auftreten können.

  • Aufrufbeispiele: Aktion, Aufruf, Ausgabe
    • Benutzer möchte alle Adressinformationen einer Datenbank abfragen
      % ./ueb06 -d foo.sql -s -f Adresse
      SELECT *
      FROM Adresse;

    • Benutzer möchte nur den Namen, Vornamen und Wohnort der vorherigen Adresstabelle haben
      % ./ueb06 -d foo.sql -s Name Vorname Wohnort
      SELECT Name, Vorname, Wohnort
      FROM Adresse;

    • Benutzer möchte die vorherige Abfrage auf alle Personen mit dem Namen Mueller, die entweder aus Hamburg oder Muenchen kommen einschränken
      % ./ueb06 -d foo.sql -w "Name = Mueller" -wa "Wohnort = Hamburg" -wo "Wohnort = Muenchen"
      SELECT Name, Vorname, Wohnort
      FROM Adresse
      WHERE Name = Mueller
      AND Wohnort = Hamburg
      OR Wohnort = Muenchen;

    • Benutzer möchte alle Informationen der Tabellen Adresse, Student und Dozent haben mit den gleichen Bedingungen wie zuvor. (Daß dieses so keine SQL-Anfrage erzeugt, die eine richtige Datenbank verarbeiten kann, sei im Rahmen der Aufgabenstellung zu vernachlässigen)
      % ./ueb06 -d foo.sql -s -fa Student Dozent
      SELECT *
      FROM Adresse, Student, Dozent
      WHERE Name = Mueller
      AND Wohnort = Hamburg
      OR Wohnort = Muenchen;

    • Benutzer möchte alle Infos aus der Tabelle Student haben, bei denen die Studienrichtung Wi ist
      % ./ueb06 -d foo.sql -w "Studri = Wi" -f Student
      SELECT *
      FROM Student
      WHERE Studri = Wi;

  • Validierung von Kommandozeilenargumenten haben wir in den letzten Wochen ausreichend geübt. Der Schwerpunkt dieser Übungsaufgabe liegt daher auf der korrekten Verarbeitung der Datei.
    Fehlerhafte Programmaufrufe sollen natürlich weiterhin abgefangen werden. Diesmal ist es euch jedoch freigestellt, wie ihr diese behandelt, solange sich das Programm mit return 1 beendet.

  • Modularisiert euer Programm (wie immer) sinnvoll.

 

Download Beispiel-Lösungsvorschlag, Quelltext inkl. Projektdateien für VC6 (ZIP-Archiv, 53 KB)

 

Zur Aufgaben-Übersicht

 

Gefällt dir die C Übungsaufgabe? Schreibe doch einen Kommentar...

 

Neuen Kommentar abgeben

f1akd