Zum Inhalt springen

Suche String in Datei mit C


tizian

Empfohlene Beiträge

Hallo,

Ich hab hier mal wieder ein Programm geschrieben, das nicht so richtig funktioniert. Vielleicht kann mir jemand sagen wo ich den Fehler gemacht habe.

Ich wollte ein Programm schreiben, das mir einen bestimmten String ("1st") in einer Binärdatei sucht und als Ausgabe denn Offset des Strings liefert.

Ich glaube, es gibt auch eigene Funktionen, mit denen ich einen String praktikabler suchen kann ,aber mich würde jetzt mal interessieren warum mein Programm nicht funktioniert. Das liefert zwar ein Ergebnis, aber das ist falsch. :-/

Ciao

Tizian

---------------------------------------------------------------------------

---------------------------------------------------------------------------

#include<stdio.h>

#include<stdlib.h>

int main(void){

FILE *q, *z;

int zeichen, i, k=0 ,fundstelle=0;

i= 0;

q = fopen("datei.bin", "rb");

z = fopen("zieldatei.txt", "w+t");

while((zeichen=getc(q)) != EOF){

if((zeichen == '1')){

k =i;

i++;

}

if((zeichen == 's') && (i==k+1)){

i++;

}

if((zeichen == 't') && (i==k+2)){

i++;

fundstelle = k;

fprintf(z, "Die Fundstelle ist an Offsetposition %d \n", fundstelle);

}

else {

i++;

}

}

return 0;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Zähl doch mal nach, was in deiner Schleife mit i passiert, wenn zeichen '1' ist.

So wie ich das sehe: Egal welches Zeichen getc() liefert, i wird immer um 1 hochgezählt. Der Unterschied für das Zeichen '1' ist, das die Variable k mit dem Wert von i initialisiert wird, anschließend dann das Inkrement. Ich glaube, das sollte funktionieren.

Ein Fehler, den ich gerade entdecke: Beim Test auf 't' wird nicht mehr auf das 's' geprüft, da werde ich noch eine Variable einführen. Vielleicht klapppts ja dann.

Ciao

Tizian

Link zu diesem Kommentar
Auf anderen Seiten teilen

So wie ich das sehe: Egal welches Zeichen getc() liefert, i wird immer um 1 hochgezählt.
Soweit schon mal falsch.

Der Unterschied für das Zeichen '1' ist, das die Variable k mit dem Wert von i initialisiert wird, anschließend dann das Inkrement.
Das ist aber nicht das einzige, was passiert. Da die dritte Bedingung nicht wahr ist, wird deren else-Block auch ausgeführt. Damit wird i zweimal inkrementiert.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Oder um es anders zu formulieren: Dein else bezieht sich nicht auf alle drei if, sondern nur auf das letzte.

Ok, danke. Dann muss ich mir mal was einfallen lassen, das ich da nicht jedesmal inkrementiere wenn die dritte Bedinfgung falsch ist.

Ich könnte ja stattdessen eine weitere if-Schleife aufstellen, mit der Bedingung das alle vorhergehenden schleifen nicht eingetreten sind.

Das krieg ich dann schon hin, danke für deine Hilfe!

Ciao

Tizian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich könnte ja stattdessen eine weitere if-Schleife aufstellen, mit der Bedingung das alle vorhergehenden schleifen nicht eingetreten sind.
Es gibt keine "if-Schleife".

Du könntest in den ersten beiden if-Blöcken die weitere Verarbeitung des Schleifenkörpers abbrechen (continue) oder das Ganze als if/else if-Kaskade aufbauen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

So,

Mit der if/else if -Kaskade und einem abschließendem else hab ich es jetzt geschaft, mein Programm liefert mir die gewünschte Adresse.

Ich mache zwar gerade einen C-Kurs, aber Kontrollstrukturen haben wir noch nicht durchgenommen. Jetzt hab ich mir auf eigene Faust ein paar Sachen zusammengesucht, um ein Programm zu schreiben das mich persönlich interessiert. Deswegen sind meine Versuche momentan bestimmt noch recht holprig.

Ciao

Tizian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...