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 mit

    char 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.dat

    0.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,0
    

    brauchen 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


Anmelden zum Antworten