Fehler in C ++, was tun?
-
21-09-2019 - |
Frage
Ich versuche, Daten zu schreiben, die in einer Binärdatei mit Turbo C ++ gespeichert sind. Aber es zeigt mir einen Fehler
could not find an match for ostream::write(long *, unsigned int)
Ich möchte ein 4 -Byte schreiben long
Daten in diese Datei. Wenn ich versucht, Daten mit char -Zeiger zu schreiben. Es läuft erfolgreich. Aber ich möchte großen Wert speichern, z. B. zB. 2454545454, die in gelagert werden können long
nur.
Ich weiß nicht, wie ich 1 Byte in Bit umwandeln soll. Ich habe 1 Daten Byte als Zeichen. Darüber hinaus versuche ich zu tun, 4 Chars in lange zu konvertieren und Daten dazu zu speichern. Und auf der anderen Seite möchte ich dies umkehren, um wie viele Daten Bytes ich geschrieben habe.
long *lmem;
lmem=new long;
*lmem=Tsize;
fo.write(lmem,sizeof(long));// error occurs here
delete lmem;
Ich implementiere die Steganographie und habe die TXT -Datei erfolgreich in das Bild gespeichert, aber ich versuche jetzt, diese Dateidaten abzurufen.
BEARBEITEN:
Ich benutze Turbo Complier.
Lösung
Wirsen Sie es zu a char*
long *lmem;
lmem=new long;
*lmem=Tsize;
fo.write(reinterpret_cast<char*>(lmem),sizeof(long));
delete lmem;
Oder sogar noch besser (da die Zuweisung am Stapel weitaus schneller ist und weniger fehleranfällig ist)
long lmem = Tsize;
fo.write(reinterpret_cast<char*>(&lmem),sizeof(long));
Wenn Tsize
ist adressierbar und lange können Sie dies tun:
fo.write(reinterpret_cast<char*>(&Tsize),sizeof(long));
Andere Tipps
Ich glaube, Schreiben nimmt einen Char*, nicht lange*
ostream& write ( const char* s , streamsize n );
1)
const long L = Tsize;
fo.write(reinterpret_cast<const char*>(&L),sizeof(L));
Hier gibt es mehrere Probleme.
Erstens müssen Sie kein ganz neu erstellen long
Um tsize zu speichern. Sie können einen Zeiger auf das TSIZE machen, das Sie bereits haben.
Zweitens die write
Call nimmt einen Strom von Bytes. Was Sie tun müssen, ist, Ihren Zeiger auf Char*zu werfen.
So was:
fo.write( static_cast<char*>(&Tsize), sizeof(Tsize) );
Drittens ist es ziemlich ineffizient zu schreiben. Wenn Sie eine große Auswahl an langen Werten haben, die Sie schreiben möchten, verwenden Sie einen einzelnen Schreibanruf, um alle von ihnen zu erhalten, wie:
fo.write( static_cast<char*>(array), sizeof(*array) * array_count );
Ich bin mir ziemlich sicher, dass static_cast hier für Zeiger funktioniert, aber wenn er nicht den zu verwendenden Code ändert reinterpret_cast
.