Binärdaten aus Datei auslesen



  • Hallo,

    Der Code scheint jetzt zu funktionieren.
    Trotzdem poste ich einmal die Codeteile
    die fuer das funktionieren verantwortlich
    sind:

    Interessant ist jedoch, dass es bei zB Byte '94' sieben
    "F" en vorher anhaengt. Also 'FFFFFF94' .Auch bei anderen
    aehnlichen Werten.
    Wieso dies?

    //Template für alle Programme
    #include <windows.h>  //benötgte Standard Headerdatei
    #include <ios>     //Required for streamize
    #include <iostream>//Dateien fuer das Oeffnen einer Standart-Datei
    #include <istream> 
    #include <fstream>
    
    using namespace std;
    
    #include <conio.h>  //Wichtig fuer die '_kbhit()' Funktion
    					 //für Windows
    #include <stdio.h>	 //für Linux, (auch um bei Windows Dateien zu oeffnen)
    #include <stdlib.h>   //für Linux (auch um bei Windows Dateien zu oeffnen)
    
    FILE  *fileZeiger = 0; //War auf ''File'' fuer die GANZE Datei, doch ich will
                                     //ja Byteweise die Datei 'zerstückelt' bis zum Ende ausgeben.
    long fileSize;///////////Groesse der File
    
    BYTE *buffer;
    
    int zaehler = 0; //Increment Variable fuer das Feld laden
    
    int main ()
    {
    
    DWORD/* LPDWORD */ BytesWritten = 0;/*war 'BytesWritten'*///Variable des Datentyps DoubleWord 
                           //Braucht es das ueberhaupt, wenn der Zeiger bereits deklariert ist?
    
    printf("\n Vor dem oeffnen der Datei ''BLINK.(!)BIN(!)''\n");
    printf("\n");
    system("Pause");
    printf("\n");
    
    fileZeiger = fopen("C:\\Schreiben an c++ Forum Binaer\\Posting02\\BLINK.BIN","r+b");// "r" wie read, "b" wie binary 
    
    if (fileZeiger == NULL)
        {
            printf("\n Fehler beim oeffnen der Datei\n");
            system("Pause");
            goto ende;
        }
        else
        {
            printf("\n BIN-Datei erfolgreich geoeffnet!\n\n");
            system("PAUSE");
        }
    
    fseek(fileZeiger, 0L, SEEK_END);//fileZeiger bis zum Ende lesen
    
    fileSize = ftell(fileZeiger);
    
    fseek(fileZeiger, 0L, SEEK_SET);
    
    int result; 
    
    //Zurueck'suchen' bis zum Anfang file
    
      while( true )
        {
         //////////byteFeld[einzelneZeichen++] = (BYTE) fgetc(fileZeiger);//Einzelne Bytes aus dem File über den "fileZeiger" 
                                                                        //holen und in das Feld 'byteFeld[]' geben
         // copy the file into the buffer:
      ////////result = fread (buffer,1,fileSize,fileZeiger);
      result = (char)fgetc(fileZeiger);
    
       printf("\n byteFeld[einzelne 8Bit Zeichen]: %X ", result++);//der '%X' Platzhalter steht für HeXadezimal
       printf("  ,Inhalt zaehler : %d",zaehler);
       printf("\n\n");
       system("PAUSE");
    
         if(zaehler >= fileSize)
                  {
                        break;
                  }
    
       zaehler++;           
    
      }     
    
       ende:
       printf("\n\nEnde Programm\n\n");     
       system("Pause");
       return 0;             
    
    }
    


  • 😮 Das ist ja immer noch der gleiche Schrott. Hätte ich bloss nicht gefragt.

    Das mit den FF liegt daran, das du da einen negativen Wert hast. Daran bist du aber selber schuld.

    result = (char)fgetc(fileZeiger); // was soll der cast auf char?
    


  • Was dein Programm derzeit machen soll (ohne goto, ohne postinkrement des eingelesenen Wertes, mit richtiger Abbruchbedingung, vernünftiger Mode bei fopen)

    #include <stdio.h>
    int main ()
    {
      FILE * pFile;
      int c;
      int n = 0;
      char fname[] = "BLINK.BIN";
    
      pFile=fopen (fname,"rb");
      if (pFile==NULL) 
        perror ("Error opening file");
      else
      {
        while ((c = fgetc(pFile)) != EOF)
        { printf("%5d : %02x\n", n, c);  // Mit Zeichenausgabe: printf("%5d : %02x %c\n", n, c, c);
          n++;
        } 
        fclose (pFile);
        printf ("The file contains %d characters.\n",n);
      }
      return 0;
    }
    

    Und was du eigentlich vor hast (einlesen in den Speicher) kannst du bei fread nachlesen: http://www.cplusplus.com/reference/cstdio/fread/



  • Hallo,

    DirkB:
    Bla, bla, bla, bla.
    ES IST MIR VOELLIG EGAL WAS IHR VON MIR DENKT,
    UND WIE DER RESTLICHE CODE AUSSIEHT!

    Der Code geht jetzt jedenfalls korrekt, es
    werden die Binaerdaten korrekt ausgelesen.

    Mehr wollte ich jedenfalls von euch
    Jungs und Maedels nicht!

    Jedenfalls dankeschoen, und auf wiedersehen!

    Gruss Tomator



  • Ähm.. kleine Frage. Du scheinst C++-Header und C zu mischen. Da das hier das C-Forum ist, warum inkludierst du C++-Header? Wenn du C++ machst, solltest du das richtige Forum wählen und außerdem wäre da FILE* suboptimal.


  • Mod

    oenone schrieb:

    Ähm.. kleine Frage. Du scheinst C++-Header und C zu mischen. Da das hier das C-Forum ist, warum inkludierst du C++-Header? Wenn du C++ machst, solltest du das richtige Forum wählen und außerdem wäre da FILE* suboptimal.

    Wundern dich diese Dinge wirklich, nachdem du den Beitrag über deinem gelesen hast? Ähnlich wie im Rechtschreibthread stelle ich mal die These auf, dass Leute, die solch eine Einstellung haben ebenfalls nicht das nötige Denkmuster für Programmierung haben und sich daher auch nicht für solche Feinheiten 😉 interessieren, wie welche Sprache sie programmieren.



  • SeppJ schrieb:

    Wundern dich diese Dinge wirklich, nachdem du den Beitrag über deinem gelesen hast?

    Nee, hab den aber auch erst danach gelesen, weil er ja erst auf der nächsten Seite kam ^^'



  • Seit neuem will die Makefile.win nicht mehr kompilieren.

    Ergebnis Kompilation:

    "Makefile.win [error] [main.o] error 1"
    

    Text siehe weiter oben.

    Was kann das bloss sein? Bin ganz verzweifelt.

    Gruss Tomator



  • Tomator schrieb:

    Hallo,

    DirkB:
    Bla, bla, bla, bla.
    ES IST MIR VOELLIG EGAL WAS IHR VON MIR DENKT,
    UND WIE DER RESTLICHE CODE AUSSIEHT!

    Der Code geht jetzt jedenfalls korrekt, es
    werden die Binaerdaten korrekt ausgelesen.

    Mehr wollte ich jedenfalls von euch
    Jungs und Maedels nicht!

    Jedenfalls dankeschoen, und auf wiedersehen!

    Gruss Tomator

    Okay 😮

    Tomator schrieb:

    Seit neuem will die Makefile.win nicht mehr kompilieren.

    Ergebnis Kompilation:

    "Makefile.win [error] [main.o] error 1"
    

    Text siehe weiter oben.

    Was kann das bloss sein? Bin ganz verzweifelt.

    Gruss Tomator

    Ich vermute die Fehlermeldung war umfangreicher?
    Warum willst du funktionierendes neu compilieren?

    Hast du irgendwo etwas an der Umgebung deines Betriebssystems geändert? Pfade neu gesetzt? Programme installiert, die dir die Pfade verbogen haben?



  • Tomator schrieb:

    Interessant ist jedoch, dass es bei zB Byte '94' sieben
    "F" en vorher anhaengt. Also 'FFFFFF94' .Auch bei anderen
    aehnlichen Werten.
    Wieso dies?

    Und der TE will schon mal Assembler programmiert haben?
    Ich weiß nicht, ob ich laut lachen oder bitterlich weinen soll.



  • Ich will nicht wissen, ob ich nun Assembler, C, oder C++ kann
    oder nicht, auch habe ich keine Pfade "verbogen" (das wuesste
    ich jedenfalls nicht) keine neuen Programme installiert und
    alles weitere nicht.

    "Makefile.win [error] [main.o] error 1"
    Was ist Fehler 1?

    Bitte helft mir!

    Gruesse



  • Zeig mal dein Programm.



  • Steht weiter oben.

    Gruesse



  • Lösch das makefile und klick auf alles neu erstellen.


  • Mod

    Bitte keine Mehrfachfragen in verschiedenen Threads stellen und auch nicht das Thema eines Threads wechseln:
    http://www.c-plusplus.net/forum/327521


Anmelden zum Antworten