tizian Geschrieben 20. April 2008 Geschrieben 20. April 2008 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; } Zitieren
Klotzkopp Geschrieben 20. April 2008 Geschrieben 20. April 2008 Zähl doch mal nach, was in deiner Schleife mit i passiert, wenn zeichen '1' ist. Zitieren
tizian Geschrieben 20. April 2008 Autor Geschrieben 20. April 2008 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 Zitieren
Klotzkopp Geschrieben 20. April 2008 Geschrieben 20. April 2008 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. Zitieren
Klotzkopp Geschrieben 20. April 2008 Geschrieben 20. April 2008 Oder um es anders zu formulieren: Dein else bezieht sich nicht auf alle drei if, sondern nur auf das letzte. Zitieren
tizian Geschrieben 20. April 2008 Autor Geschrieben 20. April 2008 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 Zitieren
Klotzkopp Geschrieben 20. April 2008 Geschrieben 20. April 2008 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. Zitieren
tizian Geschrieben 20. April 2008 Autor Geschrieben 20. April 2008 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 Zitieren
Empfohlene Beiträge
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.