Problem bei ausgelesenen Koordinaten
-
Servus an die große weite C/C++ Welt!
bin ein Neuling und habe folgendes Problem:
ich lese aus einer Textdatei Wertepaare (Koordinaten) aus, dabei befinden sich in einer Zeile 6 Koordinatenwerte - die sind durch ein LEERZEICHEN getrennt. Da es sich um Straßenkoordinaten handelt gibt es davon einige (immer in einer neuen Zeile)
Nun zu meinem eigentlichen Problem:
- ich lese eine Zeile mitchar array[256] ifstream file("text.dat"); if(file.isopen()==true){ file.getline(array, sizeof(array));aus -> soweit so gut
Nun muss ich jedoch die einzelnen Chars in Float Werte zusammenbauen?!
Mit anderen Worten -> ich stehe vor dem wahrscheinlich völlig banalem Problem die einzelnen Chars zu einem Float zu konkatenieren (bis zum LEERZEICHEN) und dann diese Einzelwerte in ein float array[6] zu schreiben.Da ich den Text oben ziemlich verwirrend finde ein Beispiel:
text.dat0.00000 0.00000 290.00000 0.00000 0.00000 0.00000 23.23400 12.00000 -12.00000 2.00000 12.00000 0.00000 144.54300 -13.13240 20.00000 -4.234560 -123.00000 4.124670[/code]
in meinem file.getline(array,sizeof(array)) steht für die erste Zeile vermutlich folgendes:0,.,0,0,0,0,0, ,0,.,0,0,0,0,0, ,2,9,0,.,0,0,0,0,0, ,0,.,0,0,0,0,0, ,0,.,0,0,0,0,0, ,0,.,0,0,0,0,0brauchen tue ich einen array in dem das Folgende steht:
array[6]={0.00000,0.00000,290.00000,0.00000,0.00000,0.00000}meine erste Idee war eine Funktion die ich rekursiv aufrufe zu schreiben, in der ich die Werte durch '+' konkateniere -> das schlug fehl -> auch das Problem mit dem LEERZEICHEN ist noch nicht gelöst -> ich versuche mit
x-wert = function(array); float function(char array[256]){ if(isspace(array[i]){ return x; } else{ x=array[i]+funktion(array[i++]) } }für einen hilfreichen Ansatz, Codebeispiel, etc wäre ich sehr dankbar
der Hightower
-
Schau mal in die FAQ unter "Einmal String nach Zahl und zurück" - sowohl der Ansatz mit Stringstreams als auch die strtod()-Funktion kannst du in einer (passenden) Schleife anwenden, wenn du willst.
-
und zum ermitteln der einzelnen Zahlen kannst du dir strtok *wegduck*
anschauen. Wenn du das ganze sowieso in C++ machst dann helfen find, find_first usw. weiter//... char *value; value = strtok(zeile, " "); if(value != NULL) while(value != NULL) { //verarbeiten von value z.B. mit strtod value = strtok(NULL, " "); } // ...
-
zeigerzeiger schrieb:
und zum ermitteln der einzelnen Zahlen kannst du dir strtok *wegduck*
anschauen.Wozu? strtod() liefert dir das erste unpassende Zeichen, dort kannst du im nächsten Schleifendurchlauf weiterarbeiten. Und ein Stringstream gibt seine Daten sowieso sequentiell aus

-
Stimmt, so kann man den "error" wert von strtod gut nutzen...
Daran hab ich nicht gedacht.Gruß
zeigerzeiger
-
Hightower82 schrieb:
für einen hilfreichen Ansatz, Codebeispiel, etc wäre ich sehr dankbar
Mache Dir zunächst eine Koordinaten-Struktur oder Klasse ..
#include <iostream> #include <fstream> #include <iterator> // istream_iterator #include <vector> struct Koordinate { double m_x, m_y; }; // dann eine Funktion, die so eine Koordinate einliest std::istream& operator>>( std::istream& in, Koordinate& k ) { return in >> k.m_x >> k.m_y; } int main() { using namespace std; // die Datei öffnen ... ifstream in("text.dat"); // .. und z.B. einen STL-Container damit füllen vector< Koordinate > koords( (istream_iterator< Koordinate >( in )), istream_iterator< Koordinate >() ); return 0; }das ist alles. Deine Koordinaten sind in der Variablen 'koords'.
Gruß
Werner
-
Dank euch erstmal für eure Hilfe und werd mich gleich mal ransetzen...
DANKE