Binäre chars werden nicht mithilfe von atof in floats konvertiert
-
Hallo,
ich habe folgendes Problem. Das Programm GNURadio gibt mir eine binäre Datei mit seinen Samples aus. Ich möchte diese in C++ als ein Array mit floats speichern.
Derzeit sieht mein Code so aus:
void read_file (const char* verzeichnis){ std::ifstream file; file.open(verzeichnis, std::ios::binary| std::ios::in); // <== Filename eintragen if(!(file.is_open())){ std::cout << "Data\t" << verzeichnis << "\tis not open!!" << std::endl; return; }; file.seekg (0, std::ios::end); int length = file.tellg(); int complex_length = length/4; file.seekg (0, std::ios::beg); char * buffer= new char[length]; file.read(buffer,length); int u = 0; for(int h = 0; h < complex_length; h++){ char pbuffer[4] = {buffer[u], buffer[u+1],buffer[u+2],buffer[u+3]}; // std::cout << "atof(pbuffer):\t" << pbuffer << std::endl; _values.push_back(atof(pbuffer)); u = u+4; } delete[] buffer; return; }eingebunden sind folgende Libaries:
#include <iostream> #include <fstream> #include <cstdio> #include <cstdlib> #include <iomanip> #include <vector> #include <cmath> #include <string>_values ist ein std::vector<float> und gehört der Klasse.
Ich benutze Eclipse Version: 3.7.2 unter Linux 3.5.0-28-generic und x86_64.
Wenn ich probeweise das zum cout debuggen ausführe:
for(int z = 0; z < 1e5; z++) std::cout << "buffer:\t" << buffer[z] << std::endl;,bekomme ich Werte bzw. chars ausgegeben. Also die Datei wird wahrscheinlich ordnungsgemäß eingelesen. Ich würde gerne memcpy() http://www.cplusplus.com/reference/cstring/memcpy/ benutzen. Allerdings habe ich dabei ein Problem mit dem kompilieren, welches ich nicht lösen kann, obwohl ich schon bei Google gesucht habe http://stackoverflow.com/questions/7966976/eclipse-indigo-cdt-function-could-not-be-resolved. Die Funktion memcpy ist bei mir angeblich in keinem Gültigkeitsbereich definiert.
Kennt einer eine Alternative zum Einlesen von binären Dateien, die dann zu floats zu konvertieren sind? Kann einer diese hier posten?
Ich bin mit meinem Latein am Ende.
mfg
Thomas
-
Wie werden die Samples denn in der Datei gespeichert?
Du versuchst 4 Byte Blöcke in einen ständig neu erstellten Array zu packen, gibst diesen dann als nicht terminierenden String aus, womit du atof fütterst. Klingt schon falsch, nicht?
-
Hallo,
binäre Datei (bzw. Daten) und atof (Ascii to float) paßt aber nicht zusammen!
Lese es gleich als float-Werte ein:// diese beiden Zeilen sind dann überflüssig // char * buffer= new char[length]; // file.read(buffer,length); for(int h = 0; h < complex_length; h++) { float f; file.read(reinterpret_cast<char *>(&f), sizeof(float)); _values.push_back(f); }
-
#include <vector> #include <sstream> #include <iostream> using namespace std; int main() { // Erzeuge Daten: stringstream file; { vector<float> foo = {1.2345, 2.3456, 8.765e12}; file.write(reinterpret_cast<const char*>(foo.data()), foo.size() * sizeof(float)); } // Lese Daten wieder ein. Bei einer richtigen Datei würde ich stat benutzen, // um die Größe zu erfahren. Hier aber mal so wie du es gemacht hast: file.seekg(0, ios::end); size_t length = file.tellg(); file.seekg(0, ios::beg); vector<float> values(length/sizeof(float)); file.read(reinterpret_cast<char*>(values.data()), length); for (auto value : values) cout << value << '\n'; }
-
Hallo,
danke für eure schnellen und guten Antworten. Ich habe nun Th69's Vorschlag umgesetzt und es klappt alles sehr gut.
Danke und mfg
Thomas
-
SeppJ schrieb:
Bei einer richtigen Datei würde ich stat benutzen
Wie meinst du das? Richtige Datei?
-
out schrieb:
SeppJ schrieb:
Bei einer richtigen Datei würde ich stat benutzen
Wie meinst du das? Richtige Datei?
fstream statt stringstream.