Schleif läuft zu weit!
-
Hi,
hab folgendes Problem:
und zwar hab ich folgenden Code:
while (!feof(file)) { dummy = 0; for (int g = 0; g < 4; g++) { if ((g == 3) && (g/3 == 1)) break;
und da läuft mir die Schleife noch einmal zu weit, weis jemand wie ich das behebn kann, komm net drauf!
-
Hallo,
welche Schleife laeuft zu weit?
mfg
v R
-
ide for schleife, läuft dann zu weit, wenn der EOF Zeiger nicht durch vier Teilbar ist!
Hab ne Datei die ist eigentlich 65 Byte groß und die for-Schleife läuft dann nur noch dreimal weiter und liest immer das EOF Teil dann noch dreimal mehr!
-
Könntest du mal den ganzen Code der Schleife while(!feof(file)) posten?
Dir ist schon klar, dass feof() erst das Dateiende liefert, wenn eine Funktion zum Lesen von der Datei (z. B. fgets()) das Dateiende gelesen hat?
-
Hier der ganze Code!
Ja das ist mit klar mit fread und so!while (!feof(file)) { dummy = 0; for (int g = 0; g < 4; g++) { if ((g == 3) && (g/3 == 1)) break; fread(&result, 1, 1, file); counter++; if (result == 0) counter_null++; dummy += (int)result; if (g == 3) { } else dummy = dummy << 8; } if (rad == 0) { if (maske == (maske & dummy)) { maske = dummy; rad++; } } else { if (maske == dummy) { rad++; } } }
-
Ist imho daraus nicht zu erkennen. Allerdings frage ich mich, wieso das da steht:
if ((g == 3) && (g/3 == 1))
Bedeutet: Wenn g GLEICH 3 UND g/3 == 1 dann BREAK;
Also wenn g == 3 ist, dann ist g/3 immer 1, also unnötig.
-
ok dann ist das unnötig ich ja nur dass mir die for-schleife aufhört zu laufen, wenn das Dateieiende erreicht wurde, so wie es da steht läuft die for-schleife nämlcih einfach zuende, obwohl das dateiende erreicht wurden ist!
-
Natuerlich tut sie das, denn du pruefst innerhalb der for-Schleife nicht, ob das Dateiende
erreicht worden ist. Nehmen wir einmal an, du kommst in die while-Schleife, der Dateizeiger
ist am Offset 0x0F und die Datei geht bis 0x10. Dann kommst du in die for-Schleife, welche
bis < 4 laeuft. Und schon haste den von dir beschriebenen Fehler.Dein Code funktioniert nur, wenn die Datei eine durch 4 teilbare groesse hat.
mfg
v R
-
Kann es sein, daß Du davon ausgehst, daß die while-Schleife sofort verlassen wird, wenn die Bedingung nicht mehr gilt?
Also quasi so:
int i=0; while(i<10) { i=10; // Hier fliegt er jetzt raus i=0; }
Da muß ich Dich leider enttäuschen. Das ist eine Endlosschleife.
Die Bedingung wird immer nur einmal vor dem Schleifendurchlauf abgefragt. Wenn die Schleife einmal durchlaufen ist ist i wieder 0 und die Abfrage ergibt true, also läfut die Schleife nochmal... länger und länger und länger...MfG Jester
-
ich muss doch irgendwie die while-schleife mit eine break abbrechen können, wenn die Bedingung erfüllt ist, oder dass ich die for-schelife nur aufrufe, wenn das ichnicht am Ende bin oder die forschleife dann so oft laufen lasse bis ich am ende angelangt bin!
Gruß
-
So langsam wird mir klar, was Du haben willst:
Sehe ich das richtig, Du willst immer ein Byte lesen, aber immer 4 Stück zusammen sollen in ein long oder sowas reingeschoben werden?
Dann mach doch einfach sowas in der Art:
int anzahl=0;
unsigned long dummy = 0;while(Datei nicht zu Ende)
{
// anzahl erhöhen
// 1 Byte lesen in result
// result in Dummy reinodern / draufaddieren
// Dummy um 8 Bit shiften, falls anzahl durch 4 teilber, also anzahl%4==0
// und sonstige Sachen erledigen, dummy wieder auf 0 setzen
// falls nicht durch 4 teilbar einfach nix machen
}
-
Wie wärs denn mit nur einer Schleife und dieser Abbruchbedingung?
for (int g = 0; (g < 4) && (!feof(file)) ; g++)
MfG Neo
-
Und was genau soll das bringen? Da werden ja nur 4 Werte eingelesen...