Frage

Ich wollte die Größe einer großen Textdatei mit Float-Werten in eine binäre .dat-Datei schrumpfen, so dass ich (in C ++) verwendet:

// the text stream
std::ifstream fin(sourceFile);
// the binary output stream
std::ofstream out(destinationFile, std::ios::binary);

float val;
while(!fin.eof())
{
    fin >> val;     
    out.write((char *)&val,sizeof(float));
}
fin.close();
out.close();

Dann wollte ich all Float-Werte aus der rpeviously erstellt binären Datei in ein Array von Float-Werten lesen. Aber wenn ich versuche, aus dieser Datei lesen ich eine Ausnahme in der letzten Zeile des Codes erhalten (der Leseprozess):

// test read
std::ifstream fstream(destinationFile, std::ios::binary);

__int64 fileSize = 0;
struct __stat64 fileStat;  
if(0 == _tstat64(destinationFile, &fileStat))
{
    fileSize = fileStat.st_size;
}

//get the number of float tokens in the file
size_t tokensCount = fileSize / sizeof(float);
float* pBuff = new float[tokensCount];
fstream.read((char*)&pBuff, tokensCount * sizeof(float));

Was mache ich falsch?

War es hilfreich?

Lösung

float* pBuff = new float[tokensCount];
fstream.read((char*)&pBuff, tokensCount * sizeof(float));

Du liest gerade in die pBuff Variable, nicht der Puffer verweist er auf. Suchen Sie nach:

fstream.read((char*)pBuff, tokensCount * sizeof(float));

Andere Tipps

Beachten Sie, dass diese:

while(!fin.eof())
{
    fin >> val;     
    out.write((char *)&val,sizeof(float));
}

ist nicht der richtige Weg, um eine Datei zu lesen - es einen Müllwert am Ende gelesen wird. Sie sollten so gut wie nie die eof() Funktion verwenden und Sie sollten immer prüfen, ob eine Datei bearbeitet lesen. Korrekter Code lautet:

while( fin >> val )
{
    out.write((char *)&val,sizeof(float));
}

Magnus' Antwort ist richtig und sollte Ihr Problem lösen. Ich will nur noch hinzufügen, dass Sie nicht ein Problem in erster Linie gehabt haben, wenn Sie wie die Gurus getan hatten sagen und nicht ein böse C-Casts verwendet. Wenn Sie die letzte Zeile, um diese Änderung:

fstream.read(static_cast<char*>(&pBuff), tokensCount * sizeof(float));

Dann würde Ihr Programm es versäumt haben, zu kompilieren und die Fehlermeldung, die Sie hätte zu der Lösung geführt.

EDIT: meine Lösung funktioniert nicht, wenn pBuff ist ein Zeiger auf jeden anderen Typ als char. So ist es kein Gebrauch im Fall des OP.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top