Datei binär einlesen
-
Ich habe versucht eine Datei binär einzulesen, also jedem Index eines Arrays ein Byte zuzuweisen.
Das ganze sieht so aus:#include <cstdio> #include <tchar.h> #include <iostream> #include <string> #include <fstream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { string path = "test.dat"; char daten[3][16]; fstream file; file.open(path, ios::in | ios::binary); while (!file.eof()) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 16; j++) { file.get(daten[i][j]); } } } cout << daten[1][10] << endl; getchar(); file.close(); return 0; }Diese Datei will ich einlesen:
52 69 6E 67 20 52 69 6E 67 20 48 65 6C 6C 6F 20 64 61 73 20 69 73 74 20 65 69 6E 20 6C 61 6E 67 65 72 20 54 65 78 74 5C 6E 54 65 73 74 20 54 65Als Text sieht das so aus:
Ring Ring Hello das ist ein lang er Text\nTest TeSo funktioniert alles, und wird auch alles in dem Datenarray gespeichert.
Allerdings werden in dem Array die Buchstaben gespeichert, allerdings möchte ich an den Wert dran, die das Byte hat.
Am Ende möchte ich, das folgender Code möglich ist:if (daten[0][0] == 00) cout << "Test" << endl;Und ich habe noch eine Frage, gibt es irgendwo eine gute Dokumentation zu fstream? Die MSDN Doku ist in dieser Sache nämlcih sehr kompliziert und nur schwer zu durchschauen.
Danke schonmal im Vor raus

PS: Vor*raus wird zensiert

-
binary2 schrieb:
Am Ende möchte ich, das folgender Code möglich ist:
if (daten[0][0] == 00) cout << "Test" << endl;Warum sollte das nicht funktionieren?
-
das binäre Lesen einer Datei geht wesentlich einfacher, wenn man die istream- bzw. istreambuf-iteratoren nutzt. Außerdem vereinfacht die Verwendung von Containern den Code. Etwa so:
#include <fstream> #include <iostream> #include <vector> #include <iterator> // istreambuf_iterator<> int main() { using namespace std; vector< char > daten; string path = "test.dat"; ifstream file( path.c_str(), ios_base::binary ); daten.assign( istreambuf_iterator< char >( file ), istreambuf_iterator< char >() ); // lies 'alles' ein cout << daten.size() << " Bytes gelesen" << endl; if( daten.size() > 0 ) cout << "Der Wert von daten[0] ist " << int(daten[0]) << endl; return 0; }binary2 schrieb:
Am Ende möchte ich, das folgender Code möglich ist:
if (daten[0][0] == 00) cout << "Test" << endl;.. ja - wo ist das Problem?
binary2 schrieb:
Und ich habe noch eine Frage, gibt es irgendwo eine gute Dokumentation zu fstream? Die MSDN Doku ist in dieser Sache nämlcih sehr kompliziert und nur schwer zu durchschauen.
siehe cpp-Reference.
Bedenke bitte, dass std::ifstream von std::istream abgeleitet ist. Die meisten Dinge, nach denen Du fragst, wirst Du also unter der Doku von std::istream finden.binary2 schrieb:
PS: Vor*raus wird zensiert

.. das liegt wohl daran, dass die hiesigen Moderatoren es leid sind, sich solche Rechtschreibfehler anzuschauen -siehe vorraus.

Gruß
Werner
-
Werner Salomon schrieb:
das binäre Lesen einer Datei geht wesentlich einfacher, wenn man die istream- bzw. istreambuf-iteratoren nutzt. Außerdem vereinfacht die Verwendung von Containern den Code. Etwa so:
#include <fstream> #include <iostream> #include <vector> #include <iterator> // istreambuf_iterator<> int main() { using namespace std; vector< char > daten; string path = "test.dat"; ifstream file( path.c_str(), ios_base::binary ); daten.assign( istreambuf_iterator< char >( file ), istreambuf_iterator< char >() ); // lies 'alles' ein cout << daten.size() << " Bytes gelesen" << endl; if( daten.size() > 0 ) cout << "Der Wert von daten[0] ist " << int(daten[0]) << endl; return 0; }Ich habe eine feste Anzahl an Zeilen und Spalten und so finde ich meinen Code auch übersichtlich und einfach

Werner Salomon schrieb:
binary2 schrieb:
Am Ende möchte ich, das folgender Code möglich ist:
if (daten[0][0] == 00) cout << "Test" << endl;.. ja - wo ist das Problem?
War natürlich wieder ein simpler Fehler. Ich hab statt 105 z.B. 69 geschrieben, wobei 69 natürlich hexadezimal und nicht dezimal ist.
Werner Salomon schrieb:
binary2 schrieb:
Und ich habe noch eine Frage, gibt es irgendwo eine gute Dokumentation zu fstream? Die MSDN Doku ist in dieser Sache nämlcih sehr kompliziert und nur schwer zu durchschauen.
siehe cpp-Reference.
Bedenke bitte, dass std::ifstream von std::istream abgeleitet ist. Die meisten Dinge, nach denen Du fragst, wirst Du also unter der Doku von std::istream finden.Danke, unter istream finde ich direkt alles was ich will/wollte

Werner Salomon schrieb:
binary2 schrieb:
PS: Vor*raus wird zensiert

.. das liegt wohl daran, dass die hiesigen Moderatoren es leid sind, sich solche Rechtschreibfehler anzuschauen -siehe vorraus.

Danke, wieder was dazugelernt! Deutsche Rechtschreibung ist aber schon mist. Manche Wörter brauchen 3 mal den gleichen Konsonant hintereinander und hier nur einmal 
-
binary2 schrieb:
Danke, wieder was dazugelernt! Deutsche Rechtschreibung ist aber schon mist. Manche Wörter brauchen 3 mal den gleichen Konsonant hintereinander und hier nur einmal 
Früher ging man halt aus, um was zu Unternehmen. Heute geht man dazu raus.
Sehr schön ist auch, wenn man Wissen in den Kopf rin tut, das sind dan Errinnerungen.
-
volkard schrieb:
binary2 schrieb:
Danke, wieder was dazugelernt! Deutsche Rechtschreibung ist aber schon mist. Manche Wörter brauchen 3 mal den gleichen Konsonant hintereinander und hier nur einmal 
Früher ging man halt aus, um was zu Unternehmen. Heute geht man dazu raus.
Sehr schön ist auch, wenn man Wissen in den Kopf rin tut, das sind dan Errinnerungen.Aber sollte die neue Rechtschreibung nicht bezwecken, dass man alles so schreibt, wie man es spricht? Und ich habe noch nie jemanden gehört, der vor-aus sagte. Man hör nur vor-raus...
Naja egal gehört ja hier nicht zum Thema.Allerdings habe ich noch ein Problem. Und zwar verursacht ein zweidimensionaler char Array seltsame Fehler. FAST alle Variablen werden irgendwie falsch deklariert.
So wird aus einer 100 eine 16792655 oder eine -536870912 und die CStrings werden auch zu undefinierbaren Zeichenketten. Ein paar Variablen werden aber doch richtig deklariert.
Laut google sollte ein zweidimensionales char Array aber gehen. Dabei macht es kein unterschied ob ichchar daten[3][16];oder
BYTE daten[3][16];schreibe.
Wäre nett, wenn mir jemand sagen kann, wie ich es richtig hinbekomme.
-
Ein eindimensionales Array tuts auch nicht. Aber wenn ich das Array nicht global deklariere, sondern in irgendeiner Funktion funktioniert es.
Kann man char Variablen etwa nicht global deklarieren?
Soweit ich weiß, sollte es doch eigentlich funktionieren...
-
binary2 schrieb:
So wird aus einer 100 eine 16792655 oder eine -536870912 und die CStrings werden auch zu undefinierbaren Zeichenketten. Ein paar Variablen werden aber doch richtig deklariert.
Wie stellst du das denn fest? Strings sind in C übrigens nullterminiert, was deine nicht sind.
-
Ich habe den Array jetzt über einem POINT deklariert. Davor war er darunter deklariert, Semikolons waren aber alle da. Jetzt funktioniert es.
Nur habe ich jetzt festgestellt, dass die Datei halb fehlerhaft ausgelsen wird.
In der ersten Zeile, sind die Werte in der Datei, in der zweiten Zeile stehen die Werte, welche ausgelesen wurden:00 01 02 03 04 01 02 03 04 00 02 03 04 00 01 96 -64 -58 03 01 00 00 00 04 00 02 03 04 00 01Die erste Hälfte wird also falsch ausgelsen, und die zweite richtig. Allerdings kann ich mir das gerade nicht wirklich erklären. Kann mir das wer weiterhelfen?
-
binary2 schrieb:
Ich habe den Array jetzt über einem POINT deklariert. Davor war er darunter deklariert, Semikolons waren aber alle da. Jetzt funktioniert es.
Nur habe ich jetzt festgestellt, dass die Datei halb fehlerhaft ausgelsen wird.
In der ersten Zeile, sind die Werte in der Datei, in der zweiten Zeile stehen die Werte, welche ausgelesen wurden:00 01 02 03 04 01 02 03 04 00 02 03 04 00 01 96 -64 -58 03 01 00 00 00 04 00 02 03 04 00 01Die erste Hälfte wird also falsch ausgelsen, und die zweite richtig. Allerdings kann ich mir das gerade nicht wirklich erklären. Kann mir das wer weiterhelfen?
Welchen Code benutzt du denn dafür? Du hast schließlich schon viele gute Tipps bekommen, seitdem du das letzte Mal deinen Code gezeigt hast, die du hoffentlich alle gelesen, verstanden und umgesetzt hast
.
-
Doch, an dem Code hat sich fast nichts geändert. Jetzt habe ich auch mal die andere Methode von Wernde Salomon ausprobiert, obwohl ich sie noch nicht ganz verstehe. Muss ich mir nochmal genauer angucken. Aber so werden die Daten natürlich richtig eingelesen. Allerdings erscheint mir das ganze etwas umständlich, da ich den vector dann noch in ein zweidimensionales Array umwandeln muss, und die größe sowieso fest ist.
In einem anderem Projekt funktioniert meine Methode auch einwandfrei, nur in meinem großen "Ich lerne alles Projekt" funktioniert es nicht einwandfrei, obwohl ich das ganze völlig unabhänging von anderen Sachen mache.
-
Anscheinend funktionieren doch beide Methoden einwandrei. Das Array ist am Ende der Lsdefunktion korrekt. Erst wenn ich es in einer anderen Funktion aufrufe, hat es diese seltsamen Werte.
Jetzt habe ich mal das Array als allererstes deklariert, direkt unter den #include Anweisungen, und jetzt funktioniert es...
Keine Ahnung wieso, aber das Problem ist jetzt gelöst.