While Schleife



  • Hey, ich bin völlig am verzweifeln und bin auf dieses Forum gestoßen.
    Bin grad dabei die Programmiersprache C zu lernen und versuche schon seit zwei tagen die FUnktion:

    while (fread(&adr, sizeof(adr),1, test) == 1)

    zu verstehen.

    Habe schon versucht durch probieren etwas zu verstehen aber sobald ich auch nur dran denke irgendwas zu ändern, schmiert alles ab. 😞

    Die Zeile wurde vorgegeben und es bezieht sich auf ein Programm, welches eine Datei ausliest.

    Das Programm schreibt mir, wenn ich es durchlaufen lasse, blockweise alle daten aus der datei heraus.

    Ich möchte aber nur den 3. block z.b. sehen und nicht den rest.

    Genau hierfür müsste ich verstehen was in der funktion genau passiert.

    Falls die restlichen zeilen auch noch benötigt werden um mehr zu verstehen, kopiere ich sie gerne herein aber genau in dieser "while" zeile liegt mein "problem".

    Vielen dank schon mal wenn sich mir hier einer annimmt. 🙂

    Freundliche Grüße
    Thomas



  • Die Standardfunktion fread liest ab der aktuellen File-Position 1 x sizeof(adr) Bytes in die Variable adr.
    ==1 prüft, ob alles korrekt gelesen werden konnte (also z.B. dass kein Dateiende vorkam).
    Das kann man alles in der C Spezifikation nachlesen.
    Es wird bei jedem Schleifendurchlauf immer in dieselbe Variable geschrieben, d.h. die Werte dort vom vorigen Durchlauf werden überschrieben.
    Wenn du nur den 3. Wert haben willst, musst du selbst mit einem Zähler mitzählen und bei zaehler==3 stoppen.



  • So einfach und trotzdem nicht selbst drauf gekommen, dankeschön. 🙂



  • Doch nicht so einfach wie ich dachte.
    Ich habe leider keine Ahnung wie man diesen Zähler einbaut.

    Diese eine "dumme" Frage nur noch und dann bin ich der Glücklichste Mensch auf dieser Welt. 🙂

    Könntest du mir vielleicht ein Beispiel nennen, wie sowas aussehen sollte?





  • Danke aber das war das erste was ich versucht habe und bei:

    while (fread(&adr, sizeof(adr),1, devisen) == 1)
    {
    for(a=0;a<=1;a++)
    {

    z.b. Gibt er mir die ganzen blöcke einfach doppelt heraus.

    Also 1-7 und dann wieder 1-7.

    Genau da ist ja der knackpunkt, weshalb ich hier im Forum Hilfe suche. 🙂



  • Von einer weiteren Schleife hat Wutz nichts geschrieben.

    Fürs mitzählen reicht a aus ( wobei a dafür kein guter Variablenname ist)

    Zum vorzeitigem Verlassen einer Schleife dient break;



  • Der Versuch mit der For-Schleife war auf den Post von Swordfish bezogen.

    Ich verstehe einfach nicht wie ich an die richtige Stelle komme. Egal was ich ausprobiere, jedes mal läuft das Programm die ganzen "blöcke" durch.



  • Deine while -Schleife liest so lange, solange immer wieder ganze Datensätze gelesen werden können. Solange die "Abbruchbedingung" erfüllt ist ( fread( ... ) == 1 ), aso ein vollständiger Datensatz gelesen werden kann gibt fread() eine 1 zurück, die Schleife läuft weiter. Irgendwann ist die Datei zuende, fread() gibt 0 zurück, die Bedingung 0 == 1 ist nicht mehr erfüllt und die Schleife bricht ab.

    Um nur bis zum inklusive dritten Datensatz zu lesen brauchst du also eine andere Bedingung:
    solange die Zahl des als nächstes zu lesenden Datensatzes 0 , 1 oder 2 ist, liest du im Schleiferkörper eben den ersten bei zaehler == 0 , den zweiten bei zaehler == 1 und den dritten bei zaehler == 2 beim der nächsten Prüfung der Abbruchbedingung ist zaehler == 3 . Also könnte die Bedingung wie lauten?

    Aja. Wenn du bei einer while -Schleife bleibst, dann musst du den Zähler natürlich im Schleifenkörper bei jedem Durchlauf um 1 erhöhen. Klar soweit?
    Wie's mit einer for -Schleife geht, steht im oben genannten howto.



  • Ok, danke erstmal, für die geopferte Zeit.

    Dein Tipp ist absolut super und genau das war auch mein aller erster ansatz. Leider finde ich aber nichts über das auslesen von binärdateien im zusammenhang mit einer for schleife. Also ich habe wirklich keine ahnung wie ich dass in eine for schleife einbinden kann. 😕



  • Schreib' mal ein Programm, daß Zahlen von i = 0 bis n auf dem Bildschirm ausgibt ...



  • for (i=0 ; i<=n ; i++)
    {
    printf("%i",i);
    }

    Das ist ja alles wirklich kein Problem aber das fread da jetzt reinzukriegen...

    Ich glaube ich stehe echt aufm Schlauch



  • Thomass86 schrieb:

    Ich glaube ich stehe echt aufm Schlauch

    Elephant aus dem Zoo raus (Eintrittskarte entsorgen!),
    Kühlschranktüre auf und Giraffe aus dem Kühlschrank raus,
    Elephant in den Kühlschrank rein, Kühlschranktür zu.

    ➡

    Den fread() -Aufruf aus der Bedingung der while -Schleife raus ( while -Schleife entsorgen!),
    Das printf() aus dem Schleifenkörper der for -Schleife raus,
    Den fread() -Aufruf in den Schleifenkörper der for -Schleife rein.



  • Vielen vielen Dank, funktioniert wunderbar und so easy wie dieser weg auch aussieht, ich wäre niemals drauf gekommen.
    Hab mir nicht mal vorstellen können, dass man die Zeile einfach so mit reinschreiben kann, ohne die for schleife oder ähnliches.

    Nochmals, vielen dank. 🙂

    Freundliche Grüße


Anmelden zum Antworten