Binärdateien verschiedener Compiler lesen



  • Hi Leute,

    ich hab eine Frage, kann ich Binärdatein lesen, die von einem Java Programm geschrieben wurden? Bei mir funktioniert das nämlich nicht. Ich kann zwar Binärdateien lesen, die ich geschrieben habe, jedoch Dateien mit den gleichen Werten aus Java nicht. Gibt es hier irgendeine Möhlichkeit?

    Meine zweite Frage ist, ich habe eine .tiff-Bild und müsste von diesem die Farbwerte einlesen. Hier ist wieder das Problem dass ich nur Gleitkommazahlen bekomme, mit denen ich nichsts anfangen kann. Gibt es in C++ Methoden um dies zu tun? Das komische ist, mit einem Programm in Java oder LabView funktioniert es.

    Vielen Dank für eure Hilfe,
    mfG Mattias.



  • Original erstellt von mattias:
    Ich kann zwar Binärdateien lesen, die ich geschrieben habe, jedoch Dateien mit den gleichen Werten aus Java nicht.

    Kann ich mir nicht vorstellen.



  • Ist aber so, sonst würde ich es nicht schreiben, ich hab mal auf einer Intersite gelesen, dass es schon zu Problemen kommen kann wenn unterschiedliche C++ Compiler verwendet werden. Ich kann die Dateien lesen, jedoch werden nicht die richtigen Werte gelesen. Gibt es da unterschiede bei der Architektur der Binädateien, sind Flags anders gesetzt? Hat jemand einen Lösungsvorschlag?
    Genauer gesagt sind die Dateien mit Labview geschrieben worden, was aber eigentlich nicht das Problem sein sollte.

    Nochmal zur zweiten Frage, beim Einlesen von .tiff-Bildern passiert mir das Gleiche, die Werte die ich einlese sind Schrott.



  • dass es schon zu Problemen kommen kann wenn unterschiedliche C++ Compiler verwendet

    Wenn das so wäre, gäbe es nur einen einzigen Compiler, da sich die anderen gar nicht durchgesetzt hätten.

    ->
    Es hängt meistens mit dem Data-Align zusammen, was viele Programmierer vergessen, wenn sie Binärdateien schreiben.

    z.B.

    // nicht eindeutig -> wird möglicherweise sogar auf verschiedenen Microsoft-Compilern falsch interpretiert.
    struct _A
    {
      char a;
      int b;
      short c;
    };
    // jetzt wird es eindeutig
    #pragma pack( push, 1)
    struct _A
    {
      char a;
      int b;
      short c;
    };
    #pragma pack( pop)
    

    Das selber gilt für alle anderen Compiler auch.



  • Bei diesen Binärdateien wurde kein struct oder was ähnliches verwendet, nur ein simpler array aus float Werten. Ich kann die Dateien mit meinem Programm schreiben und lesen, jedoch kann ich die Dateien nicht lesen, wenn sie von einem Programm in LabView geschrieben wurden, das auch nur ein array mit float Werten schreibt.
    Hier die Methode die ich verwende:

    // Schreiben einer Binärdatei, nur floats
    
    void CBinFile::wFile(string fName) {
        dat_out = new ofstream;
        fName += ".bin";
        dat_out->open(fName.c_str(), ios::out|ios::binary);
        if (dat_out->rdstate() != ios::goodbit)
            throw "Can't open file " + fName;
        else {
            dat_out->write((char const*)values, sizeof(float)*elements);
        }
        dat_out->close();
        delete dat_out;
    }
    
    //Lesen von Binärdateien, die floats gespeichert hat
    
    void CBinFile::rFile(string fName) {
        dat_in = new ifstream;
        fName += ".bin";
        for (int i=0; i<elements; i++) {
            values[i] = 0;
        }
    
        dat_in->open(fName.c_str(), ios::in|ios::binary);
    
        if (dat_in->rdstate() != ios::goodbit)
            throw "Can't open file " + fName;
        else {
            int loop = 0;
            while(!dat_in->eof()) {
                dat_in->read((char *) &values[loop], sizeof(float));
                if(elements - 1 == loop)
                    break;
                loop++;
            }
        }
        dat_in->close();
        delete dat_in;
    }
    


  • Woher weisst Du, dass in LabView float auch wirklich dem float von C entspricht?



  • BTW: Was soll das hier?

    dat_out = new ofstream;
    // ... code
    delete dat_out;
    

    Lokale Objekte auf den Heap zu schmeißen ist völliger Schwachsinn. Der Stack ist viel schneller.

    EDIT: Informiere dich mal über die Größe der LabView-Floats

    [ Dieser Beitrag wurde am 02.06.2003 um 14:58 Uhr von MaSTaH editiert. ]



  • Ich hab die objekte im heap erzeugt, da ich öfter auf einen datei zugreifen muss, und es probleme gab, es öfter im stack zu verwenden, auch wenn ich den stream mit close geschlossen habe.

    Es kann nicht viel unterschied zwischen labview und c++ sein, zumindest lassen sich dateien, erstellt in java, in labview lesen, umgekehrt aber nicht, mit dieser mehthode die ich geschrieben habe. Gibt es eine andere möglichkeit binär dateien in c++ zu schreiben?



  • Original erstellt von mattias:
    Ich hab die objekte im heap erzeugt, da ich öfter auf einen datei zugreifen muss, und es probleme gab, es öfter im stack zu verwenden, auch wenn ich den stream mit close geschlossen habe.

    Dann hast höchstwahrscheinlich du etwas falsch gemacht. So nen Mist mit dem Heap macht man nicht. Manchmal ist es sinnvoll auf den Heap auzuweichen aber in der Regel benutzt man bei lokalen Variablen den Stack...

    Original erstellt von mattias:
    Es kann nicht viel unterschied zwischen labview und c++ sein, zumindest lassen sich dateien, erstellt in java, in labview lesen, umgekehrt aber nicht, mit dieser mehthode die ich geschrieben habe.

    float != float. Ich kenne mich mit Java nicht so gut aus. Ein float ist ja eine Fließkommazahl. Ein double aber auch, nur genauer. Guck doch bitte mal nach wieviel Bit die floats in der Datei haben. Es gibt ja auch short int, int und long int. Genauso musst du dir das mit float, double und long double vorstellen.

    Original erstellt von mattias:
    Gibt es eine andere möglichkeit binär dateien in c++ zu schreiben?

    Ja, du könntest ein CFile verwenden (aus den MFC) oder mit fopen etc. arbeiten. Von letzterem würde ich dir aber hier abraten...



  • Ich habe die Lösung für mein Problem gefunden, wie oben vermutet liegt das Problem am Byte Ordering. LabView verwendet Big-Endian beim schreiben von Binärdateien, im Gegensatz zu Windows mit dem dazugehörigen Compiler, das Little-Endian verwendet.

    Danke für die Tipps, ich hoffe ihr könnt mir das nächste Mal wieder weiterhelfen. Für alle die das gleiche Problem mit LabView haben, hier ist ein Link, bei dem man zusätzliche Programme für LabView herunterladen kann, und ein detaillierte Fehlerbeschreibung angeben.

    [url]http://digital.ni.com/public.nsf/websearch/97332426D63630EE862565070049FFBB [/url]


Anmelden zum Antworten