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.