Binärdaten aus Datei auslesen
-
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 einenint
.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. Dieserchar
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/
-
Hallo,
Ich habe alles moegliche mit fread(...) probiert.
Es gibt mir 1.) das 'falsche' 2.) immer nur das
selbe Zeichen aus.Gruss, Tomator
-
Dann wirst du wohl etwas falsch gemacht haben. Welche andere Art von Antwort erwartest du nach solch einer Frage? Die Funktionen der Standardbibliothek funktionieren jedenfalls ganz sicher so wie beschrieben.
-
Hallo,
Was habe ich denn falsch gemacht?
Ich komme nicht dahinter.
Bitte sage mir das einmal.Gruss, Tomator
-
Tomator schrieb:
Was habe ich denn falsch gemacht?
Du hast deinen fehlerhaften Code nicht gepostet.
Ein minimales, compilierbares Beispiel, dass den Fehler enthält.
-
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.
-
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