ifstream >> operator

  • Hi

    C++ kann ja nicht so schwer sein, dachte ich mir...

    Ich versuche 2 short ints aus einer Datei in eine Variable einzulesen.
    Dies möchte nicht funktionieren, aus mir unerklärlichen Gründen.

    Ich verwende den >> Operator
    http://www.cplusplus.com/reference/iostream/istream/operator>>/

    Die auszulesende Datei fängt so an (Hex)

    Code
    00 01 00 05 ...

    Mein Code (man achte auf die comments ;))


    http://pastebin.com/Spwsju8h (Mit Syntax Highlighting)

    Version sollte 1 sein, Entries 5
    Ausgegeben wird aber 0 und 0

    Nach den >> Operatoren ist der get pointer (tellg) komischerweise auf -1.


    Ist nur zu Lernzwecken.
    Was ich probiere einzulesen sind location cache files von android.

    Das ganze habe ich in Java Problemlos hinbekommen :)
    https://github.com/rrelmy/Locatio…tabase.java#L39

    Wie funktioniert das möglichst einfach in C++?

  • Das heißt das ist eine Binärdatei, richtig? Tja, die >> Operatoren sind aber für das Einlesen von Text, und wenn da keine gültige Zahl steht, gibts natürlich einen Fehler und er geht nach -1. Du musst schon get() und Konsorten benutzen, um an einzelne Bytes oder shorts einzulesen.

    PS:
    Kannst dir ja flott ne Unterklasse machen, die den operator>> für short, int etc. binär macht, also einfach get() benutzt.

  • es könnte auch einfacher sein :D
    aber es wahr lehrreich

    1. problem
    einlesen des short

    Code
    short dbVersion;file.read((char*)&dbVersion, sizeof dbVersion);

    funktioniert so, ABER das file is als big-endian aufgebaut, daher hatte ich zahlen wie 256 anstatt 1 und 1280 anstatt 5.
    mein system ist little endian :)

    2. konvertieren von big endian zu little

    Code
    int is_big_endian(){    int num = 1;    return *(char *)&num != 1;}/** * converts big endian short to host endianess short * NOP if big endian system * * big to host endian */short b2he(short value){        if (is_big_endian()) {                return value;        }        unsigned char byte1, byte2;        byte1 = value & 255;        byte2 = (value >> 8) & 255;        return (byte1 << 8) + byte2;}
    Code
    dbVersion = b2he(dbVersion);


    P.S. Wieso funktioniert das Forum nicht mit Chrome?
    Ist ja nervig...

  • Ich nutze einfach die BBCodes…

    Ungetestet…

    PS:
    Big Endian ist bescheuert.

    PPS:
    Habs getestet und Fehler korrigiert, hatte mal wieder vergessen, dass man Funktions-Templates ja nicht partiell spezialisieren darf. :roll: Das liest jetzt alle Integer-Typen als BE-binär ein, und alle sonstigen als normalen Text. Wenn du noch Floats oder ähnliches lesen willst, musst du die Bedingung ändern, und schauen, dass das mit dem Einlesen richtig gemacht wird (Floats etwa machen ja normalerweise keine Shifts mit).