Zahlen in Textdatei mit fwrite speichern



  • halli hallo miteinander!

    heutiger punkt is die funktion fwrite() 😃
    probier jetzt schon eine weile und bin gefühlt kurz davor es herauszufinden.
    gebe mich aber langsam geschlagen.

    folgendes problem:
    im ordner liegt eine textdatei mit dem namen "zahlen.txt". diese enthält mehrere int zahlen. z.b.:

    123456
    457587
    4545454
    3547
    

    ich will nun ein programm schreiben, was die werte aus der txt einliest, sie sortiert, ausgibt und in entweder die selbe datei speichert oder eine neue. letzteres spielt erstma keine rolle.

    einlesen, sortieren und ausgeben funktioniert tadellos, aber das speichern... 😕

    hier nur der ausschnitt der fwrite-funktion. rest geht ja wie gesagt.

    File *datei;
    .
    .
    .
    File *zahlen2;
    zahlen2 = fopen("zahlen2.txt", "w");
    
    for(int i = 0; i<array[i];i++)
    {
         fwrite(datei, sizeof(array[i], array[i], zahlen2;
    }
    

    als ergänzung: in dem array sind die eingelesenen zahlen, wie oben schon erwähnt.
    ich hab jetzt mal 100 werte genommen. ergo: array 0 bis 99 in denen int zahlen stecken.

    geh ich richtig davon aus, dass:
    datei: die zieldatei +
    sizeof(array[i]): die (block)größe meiner werte in byte +
    array[i]: die (block)anzahl der zeilen und
    zahlen2: die zieldatei ist?

    vom logischen her müsste es ja klappen. er schreibt in die (ziel)-datei namens "datei" die größe meiner werte in byte und die anzahl der zeilen in abhängig von der durchlaufenden array-größe durch die for-schleife in die datei "zahlen2"!?
    irgendwie klappt es aber nicht. ich hoffe ihr könnt mir helfen.

    besten dank dirkb 😃
    und dem rest natürlich! 👍



  • kleiner edit noch:
    sofern ich wie oben beschrieben das programm starte und die txt überprüfe, die er erstellt hat, dann ist diese gleich mal 30mb groß und es steht natürlich nur nonsens drin.
    die quelldatei hat hingegen knapp 50kb.


  • Mod

    Norben schrieb:

    geh ich richtig davon aus, dass:
    datei: die zieldatei +
    sizeof(array[i]): die (block)größe meiner werte in byte +
    array[i]: die (block)anzahl der zeilen und
    zahlen2: die zieldatei ist?

    Sind das nicht ein bisschen viele Zieldateien?

    Was ist denn jetzt eigentlich deine Frage? Was die verschiedenen Parameter von fwrite bedeuten? -> Referenz

    irgendwie klappt es aber nicht.

    Das ist die wohl schlechtest mögliche Fehlerbeschreibung. Was erwartest du, was passiert stattdessen?

    Norben schrieb:

    kleiner edit noch:
    sofern ich wie oben beschrieben das programm starte und die txt überprüfe, die er erstellt hat, dann ist diese gleich mal 30mb groß und es steht natürlich nur nonsens drin.
    die quelldatei hat hingegen knapp 50kb.

    Das ist schon eher zu gebrauchen, aber da dein Programm sehr unvollständig ist, ist kann man nur sagen, dass du wohl etwas falsch machst. Da du die Parameter von fwrite nicht zu kennen scheinst, ist das auch durchaus zu erwarten. Ein paar Spekulationen:

    for(int i = 0; i<array[i];i++)
    

    Das ist eine der
    verrücktesten Abbruchbedingungen, die ich je gesehen habe. Ich behaupte mal: Die ist falsch. Außerdem machst du mehrmals fwrite. Ebenfalls sehr merkwürdig. Vermutlich ebenfalls ungewollt.

    es steht natürlich nur nonsens drin.

    Dir ist schon klar, dass das Ergebnis von fwrite nicht menschenlesbar ist?



  • Das ist kompletter Quatsch.

    Du brauchst nicht probieren wie fwrite funktioniert, das ist eindeutig beschrieben. Z.B: http://www.cplusplus.com/reference/cstdio/fwrite/

    Auch kann das kein Ausschnitt aus deinem Programm sein, da das nicht mal compilieren würde (wegen Zeile 10).

    Und fwrite ist ncht die richtige Funktion für menschenlesbare Dateien.

    Was steht überhaupt so wichtiges in array[i] , dass du dieses Element dauernd nimmst?

    Norben schrieb:

    geh ich richtig davon aus, dass:
    datei: die zieldatei +
    sizeof(array[i]): die (block)größe meiner werte in byte +
    array[i]: die (block)anzahl der zeilen und
    zahlen2: die zieldatei ist?

    Nein*, ja, nein, ja.

    *genauer: weiß ich nicht, kann sein, ist ja schließlich ein Filedeskriptor. Du schreibst ja nichts weiter dazu.
    Allerdings ist datei, so wie du es bei frwite nutzt, völlig fehl am Platz.



  • hab getüftelt und nachgeschlagen. mit fprintf klappt es herovrragend.
    es tut mir leid wenn ich laiehaft nach der richtigen funktion gesucht habe. wer soll als anfänger sofort durchsehen, wenn es x funktionen (fputs, fprintf, fwrite,...) gibt und man die für sich passende eben nicht sofort findet.
    pardon!
    schöner wärs wenn man aufklärt, warum eben fwrite nicht dafür geeignet ist und was man für eine funktion nehmen könnte.
    das es quatscht ist oder ich fehler im code habe, brauch man nicht zu schreiben. wenns klappen würde, hätte ich nichts gepostet.
    deswegen fragte ich explizit, gerade WEIL ich es nicht weiß und fehler drin habe!

    SeppJ schrieb:

    Sind das nicht ein bisschen viele Zieldateien?
    Was ist denn jetzt eigentlich deine Frage?

    die frage war, wie ich zahlen in eine textdatei schreibe.
    siehe:

    Norben schrieb:

    ich will nun ein programm schreiben, was die werte aus der txt einliest, sie sortiert, ausgibt und in entweder die selbe datei speichert...
    ...einlesen, sortieren und ausgeben funktioniert tadellos, aber das speichern... 😕

    SeppJ schrieb:

    Das ist die wohl schlechtest mögliche Fehlerbeschreibung. Was erwartest du, was passiert stattdessen?

    die fehlerbeschreibung liegt in den übergabeparametern die ich oben aufgelistet und explizit als frage aufgeschrieben habe. ein fehler beim kompilieren gibt es nicht, da er (und das habe ich auch beschrieben ⚠ ) die datei erstellt und keine ordentlich verwertbaren daten liefert.
    was ich erwarte kann man aus der frage herauslesen. ich erwarte int werte in einer neuen datei, welche dort (durch die funktion) gespeichert wurden, was ja aber nicht klappte.

    SeppJ schrieb:

    Das ist schon eher zu gebrauchen, aber da dein Programm sehr unvollständig ist, ist kann man nur sagen, dass du wohl etwas falsch machst. Da du die Parameter von fwrite nicht zu kennen scheinst, ist das auch durchaus zu erwarten. Ein paar Spekulationen:

    auch hier nochmal im detail: z.T. richtig seppJ. ja! aber da ich fragte, wie ich die paramater zu verstehen habe, erhoffte ich mir da eine andere antwort als: "scheint falsch zu sein".

    ich will eigentlich ungern immer die quotes raussuchen.

    vorletzter punkt: deine beschriebene "schlechteste abbruchbedingung ever" funktioniert und steht so im skript bei uns.

    dass das ergebnis von meschen nicht lesbar ist wusste ich nicht. nein.

    zu dirkb:
    natürlich brauch ich es nicht probieren. ich will aber gegebenen sachverhalt lösen. also versuche ich es mit probieren, bis es klappt. das es natürlich jetzt im nachhinein eine einfachere lösung gibt ist toll. les ich hier aber leider nicht.

    in dem array[i] stehen jeweils die int werte aus der textdatei.

    summa summarum: programm geht. kann es auch gerne noch posten, sofern interesse besteht.
    zu den atworten heute hier bin ich eher verhalten 😞
    das war bisher auf einer anderen/freundlicheren ebene



  • Norben schrieb:

    in dem array[i] stehen jeweils die int werte aus der textdatei

    Das habe ich mir schon gedacht. 😉
    Nur DU solltest dir darüber nochmal Gedanken machen.

    Das mit dem Quatsch bezog sich auf

    1. Diese obskure Abbruchbedingung beim for, die du so sicher nicht erfolgreich beim

    Norben schrieb:

    einlesen, sortieren und ausgeben funktioniert tadellos,

    hattest.

    2. die fehlenden Klammern beim fwrite, die so nicht in einem compilierbaren Programm stehen können

    3. den Aufruf von fwrite mit zwei Fildeskriptoren.

    Der Aufruf wäre übrigens:

    fwrite(array,sizeof(array[i]), AnzahlElementeIn_array, zahlen2);
    // oder
     fwrite(array,1, sizeof(array), zahlen2);
    

    Ohne Schleife.
    (Aber das gibt auch kein menschenlesbares Format)


Anmelden zum Antworten