Lesen einer STL-Datei
-
Hallo zusammen,
ich bin neu hier im Forum und habe festgestellt, dass es zum Thema "Einlesen von Dateien" ja schon einige Beiträge gibt, konnte allerdings keines über das Zeichenwirrwar finden, was bei mir auftritt.
Wie die Überschrift andeutet möchte ich einfach nur den Inhalt einer STL-Datei auslesen und im Konsolenfenster ausgeben lassen. Der simpelste Quelltext dafür scheint mir folgender zu sein:#include <fstream> #include <string> #include <iostream> using namespace std; int main() { ifstream datei("Spindel.stl"); string zeile; while(getline(datei, zeile)) // getline holt Zeile für Zeile { cout << zeile << endl; } return 0; }Das Konsolenfenster gibt daraufhin folgendes aus:
solid Spindel
Zeichensalat.....
Zeichensalat.....Habe testweise eine .txt-Datei lesen lassen, was einwandfrei funktioniert hat, denn alle Zeilen werden lesbar in der Konsole ausgegeben.
Die Datei "Spindel.stl" habe ich mit SolidWorks erstellt und auch testweise geöffnet, die ist daher in Ordnung.
1. Nun verstehe ich einfach nicht, wieso das Mini-programm eine txt-Datei lesen kann und die STL-Datei nicht.
1.1 Vor allem wieso wird dann die erste Zeile der STL richtig ausgegeben??? "solid Spindel" deutet laut Wikipedia auf einen ASCII-Quellcode hin, der ist doch üblich und nicht schwer zu lesen oder doch?Vielen Dank schonmal für eure Mühe
-
Du willst einfach eine Datei auf der Konsole ausgeben?
ifstream datei("Spindel.stl"); cout << datei.rdbuf();
-
Denn steht in Deiner Datei wohl kein ASCII - Code. Öffne sie mal mit dem Editor und schau rein.
-
@out:
klasse so wird das Programm noch deutlich kürzer und zeigt genau dassselbe an@Belli:
Mit dem Notepad geöffnet steht da folgendes:
solid Spindel 4 E…[=¨¡¿Üa;
C33
B „B
´
C…6
B „Bˆ´
C…6
B¸„B ËÍR=¨¡¿&—w<
C33
B „Bü³
C…6
Bø„Bƒ³
C…6
Bl„B Î%W=¨¡¿d 2<T´
C…6
Bd
„Bü³
C…6
Bø„B
C33
B „B IZ=¨¡¿¨˜Ö;ˆ´
C…6
B¸„BT´
C…6
Bd
„B
C33
B „B r„==¨¡¿5IÞ<
C33
B „B.²
C…6
BÀ&„BT±
C…6
BŒ,„B )òE=¨¡¿È¦¾<é²
C…6
B± „B.²
C…6
BÀ&„B
C33
B „B ¦M=¨¡¿¿<ƒ³
C…6
Bl„Bé²
C…6
B± „B
C33
B „B &î=¨¡¿ÙÂ=
C33
B „BJ¯
C…6
B87„B
C…6
B<„B éð(=¨¡¿Mu=]°
C…6
B2„BJ¯
C…6
B87„B
C33
B „B
usw....
Also wenn nicht ASCII dann kann es ja nur noch Binärcode sein, sowas blödes
-
Ja, aber eine Textdatei ist das nun mal nicht, das siehst Du ja nun selbst. Deshalb kommt da auch nix vernünftiges raus.
-
http://en.wikipedia.org/wiki/STL_(file_format)
STL Files gibt es binär und ascii. Du hast wohl Ersteres erwischt.
-
Das Auslesen von binären STLs geht jetzt auch ist nur etwas Schreibarbeit. Zum Abschluss den neuen Quelltext falls es noch wer braucht:
#include <iostream> #include <fstream> using namespace std; int main() { fstream bind; bind.open("Spindel.stl", ios::in|ios::binary); if (bind.good()) { bind.seekg(0L,ios::end); cout << "Groesse in Bytes: " << bind.tellg() << endl; bind.seekg(80L,ios::beg); //80L Verschiebt Dateizeiger 80 Bytes Richtung Dateiende unsigned long int anzDr; bind.read((char*)&anzDr, sizeof(anzDr)); cout << "Anzahl der Dreiecke: " << anzDr << endl; for(unsigned int i = 0; i < anzDr; i++) { //Dreieck //Normalenvektor float nVekKo1; float nVekKo2; float nVekKo3; bind.read((char*)&nVekKo1, sizeof(nVekKo1)); bind.read((char*)&nVekKo2, sizeof(nVekKo2)); bind.read((char*)&nVekKo3, sizeof(nVekKo3)); cout << "Normalenvektor: " << nVekKo1 << " " << nVekKo2 << " " << nVekKo3 << endl; //Eckpunkt 1 float pkt1Ko1; float pkt1Ko2; float pkt1Ko3; bind.read((char*)&pkt1Ko1, sizeof(pkt1Ko1)); bind.read((char*)&pkt1Ko2, sizeof(pkt1Ko2)); bind.read((char*)&pkt1Ko3, sizeof(pkt1Ko3)); cout << "Eckpunkt 1: " << pkt1Ko1 << " " << pkt1Ko2 << " " << pkt1Ko3 << endl; //Eckpunkt 2 float pkt2Ko1; float pkt2Ko2; float pkt2Ko3; bind.read((char*)&pkt2Ko1, sizeof(pkt2Ko1)); bind.read((char*)&pkt2Ko2, sizeof(pkt2Ko2)); bind.read((char*)&pkt2Ko3, sizeof(pkt2Ko3)); cout << "Eckpunkt 2: " << pkt2Ko1 << " " << pkt2Ko2 << " " << pkt2Ko3 << endl; //Eckpunkt 3 float pkt3Ko1; float pkt3Ko2; float pkt3Ko3; bind.read((char*)&pkt3Ko1, sizeof(pkt3Ko1)); bind.read((char*)&pkt3Ko2, sizeof(pkt3Ko2)); bind.read((char*)&pkt3Ko3, sizeof(pkt3Ko3)); cout << "Eckpunkt 3: " << pkt3Ko1 << " " << pkt3Ko2 << " " << pkt3Ko3 << endl; //Attribute byte count (i.d.R. gleich Null) unsigned short int abc; bind.read((char*)&abc, sizeof(abc)); cout << abc << endl; } } return 0; }Damit ist das Thema erledigt.
