Binärdaten aus Datei auslesen
-
Hallo,
Ich habe eine Binaerdatei "Blink.bin" und will den Inhalt selber
in ein Feld schreiben (einzelne Bytes [8Bit]). Ich habe den Code
dazu weiter unten 'gepostet'.
Nun zeigt mir der Feldinhalt, wenn ich es in einer while-Schleife
ausgebe(siehe C code weiter unten, Entwicklungsumgebung DevC++,
Version build 7.4.2.569, herunterladbar unterhttp://wxdsgn.sourceforge.net, ich benuetze den free Hexeditor 'xvi32')
ganz andere Werte, als in der Binaerdatei enthalten sind.:
//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. int fileSize;///////////Groesse der File BYTE einzelneZeichen;//Für das Feld int feldZaehler = 0; //Increment Variable fuer das Feld laden int main () //Hauptfunktion 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);//Zurueck'suchen' bis zum Anfang file BYTE byteFeld[fileSize]; //////////FILE *zeigerAufByteFeld; ////////////zeigerAufByteFeld = byteFeld[0]; while(einzelneZeichen < fileSize)//Schleife um einzelne Bytes nach 'byteFeld' zu geben { byteFeld[einzelneZeichen++] = (BYTE) fgetc(fileZeiger);//Einzelne Bytes aus dem File über den "fileZeiger" //holen und in das Feld 'byteFeld[]' geben 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: printf("\n byteFeld[einzelne 8Bit Zeichen]: %X ", byteFeld[einzelneZeichen++]);//der '%X' Platzhalter steht für HeXadezimal printf(" ,Feldnummer : %d",feldZaehler); printf("\n\n"); system("PAUSE"); if(feldZaehler >= fileSize) { break; } feldZaehler++; } ende: printf("\n\nEnde Programm\n\n"); system("Pause"); return 0; }
Binaerdatei:
'Blink.bin'
[code]
[xvi32]
-
Du willst angeblich ein C-Programm schreiben
Was haben da C++ Header in einem C Quelltext zu suchen?
Speichere den Quelltext dann als "meinquelltext.c" oder stelle deine IDE auf C-Quellcode ein"meinquelltext" ist nur ein Beispiel,
Globale Variable - warum?
2 goto bei so einem simplen Programm - warum?
int main () //Hauptfunktion main <= dieser Kommentar ist doch nicht ernst gemeint? {
Das sollte laut C-Standard eher so
int main (void) // Argumente sind auch möglich {
aussehen.
Sollte das doch C++ Quelltext werden wegen:
fileZeiger = fopen("C:\\Schreiben an c++ Forum Binaer\\Posting02\\BLINK.BIN","r+b");// "r" wie read, "b" wie binary
Dann versenke deinen Quelltext schnell im Papierkorb und schreib den in C++.
-
Das ist kein C wegen siehe f.-th.
Das ist kein C++ wegen VLA (und Stil)Das ist Spaghetti-Code.
Du weißt sicher nicht mal was
if (byteFeld[einzelneZeichen != fileSize]) { goto next1; }
wirklich macht.
Sollte das doch C Quelltext werden wegen:
fileZeiger = fopen("C:\\Schreiben an c++ Forum Binaer\\Posting02\\BLINK.BIN","r+b");// "r" wie read, "b" wie binary
Dann versenke deinen Quelltext schnell im Papierkorb und schreib den in C.
Beschreibe dein Problem, nicht das Problem mit deiner Lösung.
Nutze den Vorschau-Button und korrigiere dein Post im Zweifelsfall.
-
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
EntwicklungsumgebungDie 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äuelif (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 demfgetc
)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.
AberWutz 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.