[c++] binäre Datei richtig interpretieren

Rhyothyn

Grünschnabel
Tach liebe tutorials.de-Gemeinde,

Ich habe ein Problem, bei dem ich einfach keinen Ansatz finde, da mir ganz einfach die nötigen Kenntnisse im Umgang mit Binär-Dateien fehlen.

Ich schreibe im Moment ein Programm, mit dem man STL-Dateien importieren kann. STL-dateien beschreiben ein Netz aus Dreiecksflächen, das einen geometrischen Körper repräsentiert. Sie können im ASCII-Format oder binär vorliegen. ASCII ist kein Problem und auch schon gelöst.

Mein Problem ist nun, wie ich die Eckpunkte der Dreiecksflächen aus einer binären STL-Datei auslese, sodass sie mir als double vorliegen.

Binäre STL Dateien sind folgendermaßen aufgebaut: STL binary format specification. Mich interessieren vor allem die Koordinaten der vertex Einträge. Der Header kann ignoriert werden.

Ich hoffe ich konnte mein Problem ausreichend beschreiben. Falls nicht, bitte Fragen stellen ;).
 
C++:
template<typename T>
struct vector3
{
    typedef T value_type;
    T x;
    T y;
    T z;
    explizit vector3(T const& x = T(), T const& y = T(), T const& z = T())
        : x(x), y(y), z(z)
    {}
};

struct facet
{
    vector3<float> normal;
    vector3<float> vertex[3];    
    bool unused[2];
};
erstmal brauchen wir ein paar grundlegende Strukturen ...

Dann wird eingelesen :P
C++:
std::ifstream file_stream("input.stl");
if (!file_stream) return false;

// 80 |     Any text such as the creator's name
char information[81] = {0};
file_stream.read(information, 80);
// 4     | int equal to the number of facets in file
unsigned int facet_count(0);
file_stream.read(reinterpret_cast<char*>(&facet_count), 4);

// Speicher für alle Dreiecke anlegen
std::vector<facet> model(facet_count);
// Alle Dreiecke einlesen
for (std::vector<facet>::iterator it(model.begin()); it != model.end(); ++it)
    file_stream.read(reinterpret_cast<char*>(&*it), 50);
 
Wow, vielen vielen Dank. Hab zwar ein paar Minuten gbraucht, bis ich kapiert habe, wie ich jetzt an meine Werte rankomme, aber letztendlich war es doch ganz einfach und logisch.

Wenn mir jetzt noch jemand erklären kann, wie ich feststelle, ob es sich bei einer geladenen STL-Datei um ASCII oder binär-Format handelt...das wäre toll.

Ich hab zu dieser Thematik auch schonmal was gefunden, aber irgendwie klappt das nicht so richtig oder ich mach was falsch:

Code:
	int c;
		while ((c = mm_fileSTL.get()) != EOF && c <= 127)
			;
		if (c == EOF)
		        //FILE is all ASCII
 
Nja guckst halt in deinem Code (so ähnlich, dann klappts vllt ;)) danach ob da nen Zeichen außerhalb des ASCII-Codes drin steht ... is aber nciht so wirklich ne sichere Methode :P
 
Jetzt klappt's:
Code:
while (!mm_fileSTL.eof() && (c = mm_fileSTL.get()) <= 127)
	;
if (c == EOF)
	cout << "File is all ASCII!" << endl;
else
	cout << "File is binary" << endl;
 
C++:
const bool isASCII(std::string const& filename)
{ 
    std::ifstream file_stream(filename.c_str()); 
    if (!file_stream) throw std::invalid_argument("invalid filename");
    do { if (file_stream.get() > 127) { return false; } } while (file_stream);
    return true;
}
Aber sicher is dadran nix ^^
 
Zurück