Binärdaten aus Datei auslesen



  • Da erinnert man sich doch unwillkürlich an die 70er Jahre, als Bill Gates selber noch (BASIC) programmiert hat.
    Dein Code ist Schrott, das sollte dir klar sein.
    Du bindest C++ Zeugs ein und benutzt es nicht.
    Du bindest Windows-API ein und benutzt sie nicht.
    Du weißt nicht, was ein Array ist:

    byteFeld[einzelneZeichen != fileSize]
    ...
    byteFeld[einzelneZeichen = 0]
    

    Du weißt nicht, was ein Zeiger ist:

    //////////FILE *zeigerAufByteFeld;
    
    ////////////zeigerAufByteFeld = byteFeld[0];
    

    Du benutzt VLA, sowas ist tödlich bei Anfängern (denn die wissen nicht, was sie tun).
    Du änderst mehrfach die Laufvariable im while-Block, das ist natürlich totaler Unsinn.

    Stelle dein DevC++ auf "Console Application" und dann auf "C-Project" ein, damit über was Gescheites rauskommen kann,
    und dann werfe den ganzen Anzeigemüll aus der while-Schleife:

    while(einzelneZeichen < fileSize)//Schleife um einzelne Bytes nach 'byteFeld' zu geben
    {
    byteFeld[einzelneZeichen] = fgetc(fileZeiger);
    printf("\n byteFeld[%d]: %02X",einzelneZeichen,byteFeld[einzelneZeichen]);
    einzelneZeichen++;
    }
    


  • Binärdaten aus Datei auslesen!

    Ich weiss, das ist mehr C++ Code, wegen eines Fehlers in der
    Entwicklungsumgebung und er FUNKTIONIERT WENIGSTENS.
    Console Application habe ich gemacht. Musste jedoch eine
    Datei in .cpp umbennennen!
    Alles weitere hier soll euch (die Fehler und der Spaghetticode)
    nicht zu interressieren haben (Noergelei/Eierei).
    sondern ich moechte nur wissen, wie ich aus der Binaerdatei
    korrekt 8Bit (1Byte) Binaerzeichen auslesen kann!!!!!

    Gruss,Tomator



  • Dafür gibt es die Standardfunktion fgetc .
    Aber die benutzt du ja schon.
    Die funktioniert richtig, also liegt der Fehler beim Rest, der uns ja nicht zu interressieren hat.



  • Tomator schrieb:

    Binärdaten aus Datei auslesen!

    Das Ausrufezeichen kannst du dir sparen, wir alle hier können lesen und verstehen, im Gegensatz zu dir.

    Tomator schrieb:

    Ich weiss, das ist mehr C++ Code,

    Der Code ist mehrheitlich pures C, die C++ Teile sind ersatzlos löschbar.

    Tomator schrieb:

    wegen eines Fehlers in der
    Entwicklungsumgebung

    Die Entwicklungsumgebung hat keinen Fehler, der Fehler bist du selbst, der die Entwicklungsumgebung nicht bedienen kann, weil du nicht weißt, was du willst.
    Statt auf "Console Application" hast du auf "Windows Application" gedrückt,
    statt auf "C-Project" hast du auf "C++-Project" gedrückt, weil du nicht weißt, was du willst, und die Unterschiede zw. C und C++ sowie zw. Windows und Console nicht kennst.

    Tomator schrieb:

    und er FUNKTIONIERT WENIGSTENS.

    Das kannst du als Anfänger überhaupt nicht beurteilen.
    Das haben hier schon viele gesagt, nachdem sie die hier (kostenlos) gegebenen (überwiegend sinnvollen) Hinweise ignoriert haben, weil sie der Meinung sind, alles verstanden zu haben.
    Wenn dein Code "FUNKTIONIERT", warum fragst du dann hier?

    Tomator schrieb:

    sondern ich moechte nur wissen, wie ich aus der Binaerdatei
    korrekt 8Bit (1Byte) Binaerzeichen auslesen kann!!!!!

    Lasse deine trolligen pubertären Ausrufezeichen sein.
    Wieso willst du wissen, wie man das tut, wenn dein Code schon "FUNKTIONIERT"?
    Das Problem mit euch Anfängern ist immer, dass ihr immer schon genau wisst, wie was zu tun ist und 'nur noch' Kleinigkeiten benötigt. Regelmäßig habt ihr aber überhaupt nichts verstanden, euch irgendwo was zusammengegoogelt, könnt noch nicht mal richtig formatieren, die Codetags benutzen und eine vernbünftige Frage stellen bzw. Fehlerbeschreibung geben.
    So auch bei dir.
    Wenn es ein Trost für dich ist, die Mehrzahl der Anfängerfragen hier ist auf deinem Niveau.
    Wenn du nicht weißt oder wissen willst, was in C Array und Zeiger sind, und du sie so benutzt, wie du gezeigt hast, entspricht das einem Fahrschüler bei der Prüfung, der nicht weiß, was Gas und Bremse ist und wie man sie bedient.



  • Hallo,

    1.) Ich bin kein Anfaenger, schlag Dir das mal aus den Kopf.
    Noch nie was von MCU-Assembler Programmierung und
    hardwarenahe Programmierung gehoert?
    2.) Der Fehler in der Entwicklungsumgebung ist TATSAECHLICH vorhanden,
    und ich wusste mir nicht anders zu helfen als die .c Datei in
    .cpp umzubenennen, dass etwas in der Kompilierung funktionierte.
    3.) Ich habe die argen Beschimpfungen langsam satt. Wollt Ihr mir
    nun helfen, oder gehts dabei nur um Schickaniererei?
    Ich werde mir die ganzen Schikanen merken und notfalls in ein
    anderes, freundlicheres Forum wechseln, wenn Ihr nicht ernsthaft
    dabei seit.[Heul]
    4.) Ich wollte eigentlich nur wissen,ob es eine andere Funktion als
    fgetc() gibt oder eine andere Moeglichkeit, das Problem zu lösen.

    Gruss Tomator!



  • Tomator schrieb:

    Hallo,

    1.) Ich bin kein Anfaenger, schlag Dir das mal aus den Kopf.
    Noch nie was von MCU-Assembler Programmierung und
    hardwarenahe Programmierung gehoert?

    Also ein Anfänger in C (oder C++, je nachdem was es jetzt sein soll) biste. Definitiv.

    2.) Der Fehler in der Entwicklungsumgebung ist TATSAECHLICH vorhanden,
    und ich wusste mir nicht anders zu helfen als die .c Datei in
    .cpp umzubenennen, dass etwas in der Kompilierung funktionierte.

    Wenigstens etwas.

    3.) Ich habe die argen Beschimpfungen langsam satt. Wollt Ihr mir
    nun helfen, oder gehts dabei nur um Schickaniererei?
    Ich werde mir die ganzen Schikanen merken und notfalls in ein
    anderes, freundlicheres Forum wechseln, wenn Ihr nicht ernsthaft
    dabei seit.[Heul]

    Du fingst doch an. Wir haben nur Tipps gegeben.

    4.) Ich wollte eigentlich nur wissen,ob es eine andere Funktion als
    fgetc() gibt oder eine andere Moeglichkeit, das Problem zu lösen.

    Was genau geht denn nicht?



  • Tomator schrieb:

    1.) Ich bin kein Anfaenger, schlag Dir das mal aus den Kopf.
    Noch nie was von MCU-Assembler Programmierung und
    hardwarenahe Programmierung gehoert?

    Ja, jetzt kann ich es sehen.
    Aber warum nimmst du eien höhere Programmiersprache, wenn du doch wieder Assembler-Spagethi programmierst?
    Dieses Nudelknäuel

    if (byteFeld[einzelneZeichen != fileSize])
    {
    goto next1;
    }
    
    fseek(fileZeiger, 0L, SEEK_SET);//Zurueck'suchen' bis zum Anfang file
    byteFeld[einzelneZeichen = 0];///byteFeld dann ebenfalls auf 0 geben
    
    next1:
    

    kannst du lesbarer machen

    if (byteFeld[einzelneZeichen != fileSize])
    { fseek(fileZeiger, 0L, SEEK_SET);//Zurueck'suchen' bis zum Anfang file
      byteFeld[einzelneZeichen = 0];///byteFeld dann ebenfalls auf 0 geben
    }
    

    Tomator schrieb:

    2.) Der Fehler in der Entwicklungsumgebung ist TATSAECHLICH vorhanden,
    und ich wusste mir nicht anders zu helfen als die .c Datei in
    .cpp umzubenennen, dass etwas in der Kompilierung funktionierte.

    Dann wechsle die Umgebeung. Es gibt noch den Original Dev C++ bzw. dessen Nachfolger Orwell Dev-C++
    Dann gibt es noch Code::Blocks. Das basiert auch auf Code::Blocks
    Links dafür kannst du bei Wikipedia nachschlagen.

    Tomator schrieb:

    3.) Ich habe die argen Beschimpfungen langsam satt. Wollt Ihr mir
    nun helfen, oder gehts dabei nur um Schickaniererei?
    Ich werde mir die ganzen Schikanen merken und notfalls in ein
    anderes, freundlicheres Forum wechseln, wenn Ihr nicht ernsthaft
    dabei seit.[Heul]

    Wir sind ernsthaft dabei, nur du bist ignorant.

    Tomator schrieb:

    4.) Ich wollte eigentlich nur wissen,ob es eine andere Funktion als
    fgetc() gibt oder eine andere Moeglichkeit, das Problem zu lösen.

    Die Frage hast du im Eröffnungspost aber nicht gestellt. Und wie ich dir schon gesagt habe, liegt der Fehler nicht bei fgetc , sondern daran, wie du mit den Daten umgehst.

    Du bist nicht der erste, der die gelesenen Daten falsch interpretiert oder ausgibt.

    Du hast auch nicht gesagt, was du mit den Daten im Feld machen willst.
    Denn man kann auch das ganze Feld auch auf einmal einlesen und danach bearbeiten.



  • Du weißt sicher nicht mal was

    if (byteFeld[einzelneZeichen != fileSize]) 
                  { 
                        goto next1; 
                  }
    

    wirklich macht.

    Ich leider auch nicht, was soll das genau machen?? Also nicht goto next1 sondern was ist Array[irgendwas != was anderes] ???



  • irgendwas != was anderes

    ergibt true oder false.
    Das wird zu 1 oder 0 ausgewertet, und das wird dann als Index in das Array verwendet.



  • bisschen "Strange" für mich



  • goto next1;
    

    wird ausgeführt, wenn byteFeld[1] != 0 ist.
    Das ist natürlich totaler Unsinn, aber der Frager ist von seinem Unsinn weiterhin überzeugt.



  • Schaun wir mal:

    if (byteFeld[einzelneZeichen != fileSize])
    

    Wir haben eine if-Anweisung. Die braucht eine Bedingung (zwischen den runden Klammern)
    Diese Bedingung besteht aus einer Variablen.
    Diese Variable ist ein Arrayelement, auf die mit einem Index zugegriffen wird.
    Dieser Index wiederum ist das Ergebnis eines Vergleichs.

    einzelneZeichen != fileSize ist meistens wahr und somit 1
    Beim letzten Durchlauf der while-Schleife ist aber einzelneZeichen gleich fileSize und somit die Bedingung unwahr und somit 0. (Das liegt an dem inkrement bei der Zeile mit dem fgetc )

    Es wird somit meist auf das Arrayelement byteFeld[1] zugegriffen. Dessen Wert wird genommen und als Bedingung verstanden. Ist der Wert Null ist es unwahr. Ist er ungleich Null, dann ist er wahr.
    Davon hängt also ab, ob der if-Zweig ausgeführt wird oder nicht.
    Nochmal kurz: Wenn der Inhalt von byteFeld[1] != 0 ist, wird das goto ausgeführt.
    Egal ob byteFeld[1] schon gelesen wurde oder nicht.

    Durch das inkrement beim fgetc wird dann ja auch auf ein Element verwiesen, das noch gar nicht eingelesen ist.

    Der Trick dahinter entzieht sich meiner Kenntniss ( ich habe allerdings auch noch kein MCU-Assembler gemacht)



  • unsure110 schrieb:

    bisschen "Strange" für mich

    Es ist korrektes C und man kann es (wenn man es kann) sogar lesen.
    Darum compiliert das ja auch.
    Aber

    Wutz schrieb:

    Das ist natürlich totaler Unsinn,

    was nach sehr, sehr zurückhaltend ausgedrückt ist.

    ~Real Programmer can write FORTRAN programs in any language.
    (Ed Post, Real Programmers Don't Use Pascal, 1982)~



  • Hallo,

    Mir kommt nur spanisch vor, dass bei fget_c_() das
    letztere 'c' _c_har bedeuten koennte.
    Wie ist das jetzt, bedeutet das 'c' tatsaechlich 'char'
    oder handelt es sich hier um eine Verwirrung/Verwechslung
    meinerseits?

    Die Daten im Feld sind jedenfalls different, als
    die 8Bit bzw 1Byte Daten im Hex-Editor bei 'Blink.bin'.

    Ich wuerde euch ja gerne 'Blink.bin' und den kleinen
    Hex-Editor anhaengen, jedoch ist hier keine
    Anhaenge-Button.

    Viele Gruesse, Tomator



  • Es ist korrektes C und man kann es (wenn man es kann) sogar lesen.

    Hmm, ok, aber das macht man doch nicht wirklich so ?? Ich hatte irgendeinen "Trick" dahinter vermutet der mir unbekannt ist , aber dem ist wohl nicht so.
    Naja, wieder was gelernt??



  • Tomator schrieb:

    Mir kommt nur spanisch vor, dass bei fget_c_() das
    letztere 'c' _c_har bedeuten koennte.
    Wie ist das jetzt, bedeutet das 'c' tatsaechlich 'char'
    oder handelt es sich hier um eine Verwirrung/Verwechslung
    meinerseits?

    Der 8-bit Datentyp heißt in C halt 'char' und nicht 'Byte'.



  • Tomator schrieb:

    Die Daten im Feld sind jedenfalls different, als
    die 8Bit bzw 1Byte Daten im Hex-Editor bei 'Blink.bin'.

    Wie auch immer du die Daten aus dem Feld vergleichst.

    Deine gesammte Einlesroutine ist genau so krude, wie dieser sinnfreie Vergleich den ich beschrieben habe.

    Beim einlesen machst du schon Fehler.
    Die wurden dir aber schon genannt.



  • Wenn ich mit fgetc() ein Byte beispielsweise
    auslese, was kommt dabei heraus, ein 'interpretierte
    ASCII Zeichen' das wiederum mit (Byte) gecastet
    werden muss (und dabei natuerlich ein anderer Wert
    herauskommt als das uerspruenglichen BinaerByte)
    oder habe ich das falsch verstanden,

    Bitte seit so lieb und helft mir dabei,

    Viele Gruesse, Tomator



  • Das fgetc liefert dir einen int .

    Aus der man-page:

    fgetc() liest das nächste Zeichen von stream und gibt es als ein unsigned char gecastet in einem int zurück, oder EOF bei Dateiende oder Fehler.

    Wenn der Rückgabewert also nicht EOF ist, dass lässt er sich verlustfrei wieder zurück in einen char casten. Dieser char umfasst genau ein Byte (=8 Bit) aus der Datei. (Keine Interpretation oder Veränderung.)

    Du kannst ja ein einfaches Programm erstellen, was nur die Datei öffnet und das erste Zeichen einliest und ausgibt. Das sollte, wenn du es richtig machst, mit dem ersten Zeichen aus dem Hexeditor übereinstimmen.



  • Wie du dann alles auf einmal ohne VLA einliest, kannst du bei fread nachsehen:
    http://www.cplusplus.com/reference/cstdio/fread/


Anmelden zum Antworten