5. ANSI-C-Aufgabe: Bitoperationen

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

Original-Aufgabenstellung:

Polaritätsausgleich für Festplatten

Dateien werden auf Disketten und Festplatten magnetisch gespeichert. Dabei wird jedes Bit der Datei durch eine unterschiedliche Polarisierung dargestellt. Ein gelöschtes Bit durch eine negative Polarisierung, ein gesetztes Bit durch eine positive Polarisierung. Eine Datei die nur aus (binären) Nullen besteht, wird also als negativ geladener Bereich auf dem Datenträger gespeichert. Statistisch gesehen sollte die Festplatte durch die große Menge an Daten, die auf ihr gespeichert ist, nach Außen hin magnetisch neutral erscheinen.

Sind nun aber deutlich mehr gelöschte Bits gespeichert als gesetzte (oder umgekehrt), dann lädt sich die Festplatte magnetisch auf und es kommt zu einer Unwucht im Rechner, die nicht nur für die Festplatte schädlich ist, sondern auch für viele andere sensible Komponenten.

 

Um einem magnetischen Ungleichgewicht vorzubeugen, wollen wir uns heute ein Programm schreiben, das zu einer angegebenen Datei das entsprechende magnetische Gegenstück erzeugt. Die vom Programm errechnete Ausgleichs-Bitfolge wird in einer Datei gespeichert und neutralisiert somit das Bitgewicht und damit die magnetische Ladung der Festplatte.

Anforderungen

  • Das Programm liest von der Kommandozeile exakt einen Parameter, der die auszugleichende Datei spezifiziert. Ist eine davon abweichende Anzahl an Parametern angegeben worden, so gibt das Programm die Hilfe aus und beendet sich mit return 1.

  • Wird das Programm anstatt mit einem Dateinamen mit der Option -h (oder -H) aufgerufen, so soll die Hilfe ausgegeben werden. In diesem speziellen Fall beendet sich das Programm mit return 0.

  • Von der angegebenen Datei werden die gelöschten und gesetzten Bits gezählt. Aus diesen beiden Parametern wird anschließend eine Datei erzeugt, die die entsprechend entgegengesetzten Bits beinhaltet. Dabei soll diese Ausgleichsdatei so klein wie möglich sein, um nicht unnötig Festplattenplatz zu belegen. Wenn also die Quelldatei lediglich 8 Bits mehr gesetzt hat als gelöschte, dann enthält die Ausgleichsdatei genau 8 gelöschte Bits und kein gesetztes Bits. Ist die Quelldatei bereits ausgeglichen, so wird gar keine Ausgleichsdatei erzeugt.

  • Die Ausgleichsdatei hat denselben Namen wie die Quelldatei, der allerdings um die zusätzliche Dateiendung .bga erweitert wird. Diese Datei wird im aktuellen Arbeitsverzeichnis abgelegt (also die Pfadinformationen verworfen).

  • In der Ausgleichsdatei sollen zuerst alle gelöschten Bits stehen und dann alle gesetzten Bits. In dem Übergangsbyte stehen die gelöschten Bits an den niederwertigen Positionen.
    Beispiel:
    Die Berechnung hat ergeben, daß 3 gelöschte Bits und 29 gesetzte Bits geschrieben werden müssen. Diese werden wie folgt dargestellt.
    Bitebene: 11111000 11111111 11111111 11111111
    Byteebene: 248 255 255 255

  • Kann die Quelldatei nicht geöffnet werden, so soll sich das Programm mit einer Fehlermeldung und return 1 beenden.

Hinweise

  • In dieser Übung wollen wir uns schon mal mit Dateien beschäftigen. Das Thema Datei-Operationen wird in der nächsten Übung noch tiefergehend behandelt, so daß wir heute nur die grundlegenden Funktionen nutzen werden.

    • FILE* fopen(const char* path, const char* mode)
      fopen öffnet die durch path spezifizierte Datei und liefert ein File-Handle zum Zugriff auf diese Datei zurück. mode gibt an, ob die Datei gelesen oder beschrieben werden darf. Für diese Übungsaufgabe wählen wir zum Lesen den Modus "rb" und zum Schreiben den Modus "wb". Konnte die Datei nicht geöffnet werden, so ist das Funktionsergebnis der Nullzeiger.

    • int fgetc(FILE* stream)
      fgetc liest ein einzelnes Zeichen aus einer geöffneten Datei. Das Funktionsergebnis ist der ASCII-Code des gelesen Zeichens als int-Wert. Ein negativer Funktionswert signalisiert, daß das Dateiende erreicht wurde.

    • int fputc(int c, FILE* stream)
      fputc ist das Gegenstück zu fgetc und schreibt ein einzelnes Zeichen in eine Datei.

    • int fclose(FILE* stream)
      fclose schließt eine Datei die zuvor mit fopen geöffnet wurde.

  • Modularisiert euer Programm (wie immer) sinnvoll.

  • Da am 1. April noch keine C-Übung war, mußte diese Aufgabe leider bis heute warten.

 

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

 

Zur Aufgaben-Übersicht

 

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

 

Neuen Kommentar abgeben

t17wx