Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Binary File I/O

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.09.2009, 10:39 Uhr
~HMeier
Gast


Hallo,

ich habe ein Problem. Es sollen mehrere float Werte binär in einer Datei gespeichert werden.
Dieser Code wird für jeden Float Wert einmal aufgerufen. Jedoch bekomme ich wenn ich es wieder auslese nur ganzzahlige falsche Werte herraus. Was mach ich Falsch?

Schreiben:

C++:
        FILE    *stream = NULL;
        TMeasFloat f =lpDST->ftGlobalValue;
        char *buffer;
        buffer = new char [((sizeof(float))*8)];
        buffer= (char*) &f;


        ofstream outfile("H:\\analog1.out",ofstream::app | ios::binary);

        outfile.write(buffer, ((sizeof(float))*8));
        outfile.close();


Lesen:

C++:
TMeasFloat lesen(long x)
{
    TMeasFloat s;
    char *buffer;
    FILE *stream = NULL;
    buffer = new char [((sizeof(float))*8)];

    ifstream infile;
    infile.open("H:\\analog1.out",ios::binary);
    infile.seekg ((x*8), ios::beg);                     //x = x+(sizeof(float));
    infile.read (buffer ,((sizeof(float))*8));
    infile.close();
    
    s=((TMeasFloat)(*buffer));
    delete [] buffer;

    return s;
}  

Dieser Post wurde am 23.09.2009 um 11:19 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.09.2009, 19:55 Uhr
0xdeadbeef
Gott
(Operator)


Zunächst mal leckt das hier Speicher:

C++:
        buffer = new char [((sizeof(float))*8)];
        buffer = (char*) &f;


Wie willst du auf die Art den mit new angeforderten Speicher wieder freigeben?

Du schreibst nicht floats in die Datei, sondern eine Instanz der Klasse TMeasFloat - oder zumindest die ersten sizeof(float) * 8 Byte davon. Warum dabei ganzzahlige Werte rauskommen, kann ich dir nicht sagen, weil ich die Klasse nicht kenne. Möglicherweise Padding, aber das ist wild geraten.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.09.2009, 21:07 Uhr
~HMeier
Gast


Entschuldigung, hab ich vergessen dazuzuschreiben. TMeasFloat entspricht einfach nur float.


Zitat von Oxdeadbeef:

Wie willst du auf die Art den mit new angeforderten Speicher wieder freigeben?


Was meinst du damit?

Danke schon mal im Vorraus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.09.2009, 21:28 Uhr
0xdeadbeef
Gott
(Operator)


Wenn TMeasFloat einfach nur ein typedef auf float ist, dann ist es auch genau sizeof(float) groß. Wobei es natürlich schöner wäre, das Alias zu benutzen, also

C++:
    TMeasFloat f = lpDST->ftGlobalValue;

    ofstream outfile("H:\\analog1.out", ofstream::app | ios::binary);

    outfile.write(&f, sizeof(TMeasFloat));
    outfile.close();


Dann beim Einlesen

C++:
    TMeasFloat s;
    ifstream infile;

    infile.open("H:\\analog1.out",ios::binary);
    infile.seekg (x * sizeof(TMeasFloat), ios::beg);
    infile.read (&s, sizeof(TMeasFloat));
    infile.close();        


Was ich mit der Speicherfreigabe meine, ist, dass mit new[] angeforderter Speicher auch mit delete[] wieder freigegeben werden muss. Wenn du

C++:
        buffer = new char [((sizeof(float))*8)];
        buffer= (char*) &f;


schreibst, forderst du Speicher an, überschreibst den Zeiger darauf aber gleich wieder mit etwas anderem. Danach weißt du nicht mehr, wo der angeforderte Speicher ist, und das macht es ausgesprochen schwierig, ihn später wieder freizugeben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.09.2009, 08:04 Uhr
~HMeier
Gast


Ich habe folgenden Fehler nun zwei mal:

error C2440: 'type cast' : cannot convert from 'TMeasFloat *' to 'TMeasFloat'

bei infile.read und outfile.write

Diesen Fehler wollte ich eigentlich mit dem Char Buffer umgehen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.09.2009, 11:31 Uhr
0xdeadbeef
Gott
(Operator)


Zeig nochmal her, was du da jetzt stehen hast.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: