0 Daumen
353 Aufrufe

Ayfgabe:

Schreiben Sie eine Funktion, welche eine bereits geöffnete Textdatei übergeben bekommt, diese zeichenweise ausliest und ermittelt um wie viele Stellen sich die Position des ersten Auftretens eines Zeichens sich von der Position des letzten
Auftretens des selben Zeichens unterscheidet.

Zu diesem Zweck wird der Funktion der Filepointer in und das zu suchende Zeichen ch übergeben. Kommt das Zeichen weniger wie zweimal vor, so wird als "Differenzwert" 0 rückgeliefert.

(SPI ist zu sichern und zu restaurieren!)

SPI steht für Streampositionierung.

Programmiersprache C.

Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Funktion mit Streampositionierung

Um diese Aufgabe zu bearbeiten, müssen wir eine Funktion in C programmieren, die einen FILE-Pointer und ein Zeichen als Eingabe nimmt, die Datei zeichenweise durchsucht, und die Differenz zwischen der ersten und letzten Position des Zeichens zurückgibt. Wichtig ist hierbei, dass die ursprüngliche Position des File-Pointers nach Abschluss der Funktion wiederhergestellt werden muss. Hier ist ein detaillierter Plan, wie man dies erreichen kann:

1. Ermittlung der aktuellen Position: Am Anfang der Funktion speichern wir die aktuelle Position des File-Pointers, damit wir sie später wiederherstellen können.
2. Durchsuchen der Datei: Wir setzen den File-Pointer an den Anfang der Datei und lesen die Datei Zeichen für Zeichen durch, um die Positionen des ersten und letzten Auftretens des gesuchten Zeichens zu finden.
3. Wiederherstellung der SPI (Streampositionierung): Nachdem wir die benötigten Positionen gefunden haben, stellen wir die ursprüngliche Position des File-Pointers wieder her, bevor wir die Funktion beenden.
4. Rückgabe der Differenz: Falls das gesuchte Zeichen weniger als zweimal vorkommt, geben wir 0 zurück. Andernfalls berechnen wir die Differenz zwischen der ersten und letzten Position und geben diese zurück.

Hier ist der notwendige C-Code, der diese Schritte implementiert:

c
#include <stdio.h>

// Prototyp der Funktion
long findCharDifference(FILE *in, char ch);

// Hauptfunktion
int main() {
    // Beispiel zum Öffnen einer Datei und Aufrufen der Funktion
    FILE *file = fopen("example.txt", "r");
    if (!file) {
        perror("Datei konnte nicht geöffnet werden");
        return 1;
    }
    
    char searchCharacter = 'a'; // Das gesuchte Zeichen
    long diff = findCharDifference(file, searchCharacter);
    
    if (diff != 0) {
        printf("Die Differenz beträgt: %ld\n", diff);
    } else {
        printf("Das Zeichen '%c' kommt weniger als zweimal vor.\n", searchCharacter);
    }

    fclose(file); // Datei schließen
    return 0;
}

// Funktion zur Ermittlung der Differenz zwischen ersten und letzten Auftreten eines Zeichens
long findCharDifference(FILE *in, char ch) {
    long startPosition = ftell(in); // Aktuelle Position sichern
    long firstPosition = -1, lastPosition = -1; // Initialwerte setzen
    long currentPosition = 0;
    int c; // Variable zum Speichern des jeweils gelesenen Zeichens

    // Zurück zum Anfang der Datei
    fseek(in, 0, SEEK_SET);
    
    // Datei zeichenweise durchsuchen
    while ((c = fgetc(in)) != EOF) {
        if (c == (int)ch) {
            if (firstPosition == -1) {
                firstPosition = currentPosition; // Erste Position festhalten
            }
            lastPosition = currentPosition; // Letzte Position immer aktualisieren
        }
        currentPosition++;
    }

    // SPI restaurieren
    fseek(in, startPosition, SEEK_SET);

    // Differenz berechnen und zurückgeben
    if (firstPosition == -1 || lastPosition == -1) {
        return 0; // Das Zeichen kommt weniger als zweimal vor
    } else {
        return lastPosition - firstPosition; // Differenz zwischen ersten und letzten Auftreten
    }
}


Diese Implementierung liest eine Datei zeichenweise durch und findet das erste und das letzte Auftreten eines gegebenen Zeichens, berechnet die Differenz zwischen diesen beiden Positionen und stellt sicher, dass die ursprüngliche Streampositionierung (SPI) der Datei vor dem Verlassen der Funktion wiederhergestellt wird.
Avatar von 4,6 k

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community