daten schreiben - falsche daten einlesen?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • daten schreiben - falsche daten einlesen?

      moin...
      so vorweg ich kompiliere das mit gcc, ist also c nicht c++ bevor nun einer meckert funktionen wie printf sollte man in verwendet da sie veraltet wären...

      so mein problem -> ich schreibe 4 zahlen/bytes/chars/... mittels fputc() in eine datei und möchte sie dann in einem anderem programm wieder auslesen mittels fgetc()... das problem dabei ist nun aber, dass er anscheinend andere daten ausließt, als er schreibt... ich kann mir absolut nicht erklären wieso. :(

      so geschrieben wirds da ->
      /* DEBUGE */
      #ifdef DEBUGE
      printf("Schreibe Dateilaenge an Position: %d\n", (int)ftell(archiv_file));
      #endif


      /* Dateilänge schreiben */
      fputi(data_length, data_file);

      und meine recht provesorische fputi funktion dazu ->
      int fputi(int number, FILE *file)
      {
      /* Variablen */
      int bytes[4];

      /* Prüfe Dateistream */
      if(file == NULL)
      return -1;

      /* Zahl in 4 Bytes aufteilen */
      bytes[0] = number&0xFF;
      bytes[1] = (number >> 8)&0xFF;
      bytes[2] = (number >> 16)&0xFF;
      bytes[3] = (number >> 24)&0xFF;

      /* DEBUGE */
      #ifdef DEBUGE
      printf("Schreibe <%d>: %d - %d - %d - %d\n", number, bytes[0], bytes[1], bytes[2], bytes[3]);
      #endif

      /* Bytes schreiben */
      fputc((char)bytes[0], file);
      fputc((char)bytes[1], file);
      fputc((char)bytes[2], file);
      fputc((char)bytes[3], file);

      /* Erfolgreich */
      return 0;
      }


      So die Ausgabe sieht dann in etwa so aus:
      Schreibe Dateilaenge an Position: 37
      Schreibe <9688>: 216 - 37 - 0 - 0

      Bevor er die 4 Zahlen/Bytes/Chars/... also geschrieben hat war der Dateizeiger bei 37...

      so nun die "auslesung":
      /* Dateilaenge auslesen */
      /* DEBUGE */
      #ifdef DEBUGE
      printf("Lese Dateilaenge an Position: %d\n", (int)ftell(archiv_file));
      #endif

      data_length = fgeti(archiv_file);

      und meine fgeti funktion dazu ->
      int fgeti(FILE *file)
      {
      /* Dateistream prüfen */
      if(file == NULL)
      return -1;

      /* Variablen */
      int bytes[4];
      int integer;

      /* Bytes auslesen */
      bytes[0] = (int)fgetc(file);
      bytes[1] = (int)fgetc(file);
      bytes[2] = (int)fgetc(file);
      bytes[3] = (int)fgetc(file);

      /* Bytes zu einer 32Bit Integer konvertieren */
      integer = ((bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | (bytes[0]));

      /* DEBUGE */
      #ifdef DEBUGE
      printf("Lese <%d>: %d - %d - %d - %d\n", integer, bytes[0], bytes[1], bytes[2], bytes[3]);
      #endif

      return integer;
      }

      die ausgabe dazu:
      Lese Dateilaenge an Position: 37
      Lese <1179403647>: 127 - 69 - 76 - 70

      also auch hier ist der dateizeiger >vor< dem lesen auf 37 / beim 37. byte... danach ließt er 4 bytes / zahlen / chars / ... aus... und nun sieht man ja auch was mein problem ist, die 4 bytes sind andere als geschrieben wurden :)

      wieso?
    • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )

    • Kannst du vielleicht mal die Datei Senden in die geschreiben wurde?
      Also ich möchte sehen wie es genau eingetragen wurde.
      Ich weiß jetzt selber nicht wie er auf diese Zahlen kommt.
      Eigentlich kann ich auch kein C (noch! xD) aber ich denke man sollte schon erkennen woran es liegt.

      Also ich denke Der Fehler kommt von "fgeti" da er die Werte ausgibt.
      Nur weiß ich nicht ob das jetzt eine Func von dir ist oder sie zu C gehört xD (ich denke mal sie ist von dir)
    • jop, fgeti/fputi ist von mir weswegen ich ja auch den code gepostet habe.

      so gute idee, einfach mal die datei öffnen :relief:
      ok ich hab nun mal den binären modi rausgenommen (sonst kann man es ja leider in gedit nicht mehr öffnen) und merke grade -> huh der schreibt das ganze ja gar nicht rein kein wunder also damit es nicht klappt. :)

      so dann stellt sich nun das neue problem wieso schreibt er es nicht ?

      fputi wird aufgerufen, der stream sollte gültig sein (!= NULL) und die richtigen daten bekommt die funktion auch, was man ja an der ausgabe erkennen kann.
      und direkt nach der ausgabe kommt dann ja das ->
      fputc((char)bytes[0], file);
      fputc((char)bytes[1], file);
      fputc((char)bytes[2], file);
      fputc((char)bytes[3], file);


      so ok... die funktion fputc liefert -1 zurück, was laut diversen seiten ja für einen fehler steht. (wenn kein fehler auftritt, sollte die funktion den buchstaben zurückgeben, der geschrieben wurde, steht zumindest auf diversen seiten :))

      dann nun eben nochmal das neue problem -> wieso gibts den fehler bzw was bedeutet er ?

      -------

      args ok...
      fehler gefunden -> kein wunder haut das nicht hin ich hab ja auch den völlig falschen stream angegeben... :(

      danke für die hilfe... :D