zahlen aus einem string lesen



  • Hallo darman96,
    Willkommen im C++-Forum.

    Das erste 'v' am Anfang kannst Du mit der Methode ignore überlesen.
    Wie kommen denn die Zahlen in den String?
    Gruß Werner



  • Strings benutzt man in der Regel als Variablen für eine Zeichenkette ähnlich wie z.B. ein int für eine Zahl, eigentlich ist jeder String aber ein Array, in dem Zeichen gespeichert sind.

    Z.B. könnte man bei dem String s="Hallo Welt" den ersten Buchstaben mit
    cout<<s[0] ausgeben.

    In ähnlicher Weise könnte man einen String mittels einer Schleife nach bestimmten Zeichen oder Ziffern durchsuchen lassen.

    also z.B.

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
     string s="Hallo Welt";
     for (unsigned int i=0;i<s.size();++i)    //s.size() ist die Anzahl der Zeichen in einem Strings
     {
      if(s[i]=='H')
       {
        cout<<"Treffer"<<endl;
       }
     }
     return 0;
     }
    

    Was man alles sonst noch mit Strings machen kann, läßt sich bei http://www.cplusplus.com/reference/string/string/size/ nachlesen.



  • @Werner: die zahlen sind koordinaten (x,y,z) von 3D modellen.

    @redrew99: ja das wusste ich schon nur ich weiß grad nicht wie ich die zahlen trennen und einzeln auslesen soll.



  • darman96 schrieb:

    @Werner: die zahlen sind koordinaten (x,y,z) von 3D modellen.

    und wie kommen die Zahlen, die Koordinaten aus 3D Modellen darstellen, in den std::string? ich vermute mal, die standen vorher in einer Datei und Du hast diese mit getline ausgelesen ..

    Gruß
    Werner



  • genauso


  • Mod

    darman96 schrieb:

    genauso

    Worauf Werner höchstwahrscheinlich hinaus will: Du liest aus einem Dateistream in einen String, stopfst den String in einen Stringstream und liest dann aus dem Stringstream unter Benutzung der für jeden Stream vorhandenen Lesefunktionen die Werte, die du am Ende haben möchtest. Fällt dir hier eine mögliche Vereinfachung auf?



  • // Struktur in die du die Daten stopfst.
    struct Position
    {
        float x;
        float y;
        float z;
    };
    
    // Den >>-Operator zum Einlesen überladen.
    std::istream& operator>>(std::istream& in, Position& out)
    {
        return in >> char() >> out.x >> out.y >> out.z;
    }
    
    // Einsatz:
    int main()
    {
        std::ifstream file("data.txt");
        for(Position pos; file >> pos;)
            machWas(pos);
    }
    


  • Ethon schrieb:

    [cpp] return in >> char() >> out.x >> out.y >> out.z;

    Kompiliert das bei dir? Du bindest hier ein temporäres Objekt an eine nicht konstante Referenz. Das sollte eigentlich nicht funktionieren.



  • Michael E. schrieb:

    Ethon schrieb:

    [cpp] return in >> char() >> out.x >> out.y >> out.z;

    Kompiliert das bei dir? Du bindest hier ein temporäres Objekt an eine nicht konstante Referenz. Das sollte eigentlich nicht funktionieren.

    Nicht getestet, wollte schlau sein und Tipparbeit sparen. 😉
    Also vermutlich nicht. Dann muss man eben das char davor irgendwo definieren oder ignore nehmen.



  • @SeppJ: So weit war ich auch schon nur was bei mir nicht funktioniert ist das trennen der 3 zahlen.



  • darman96 schrieb:

    @SeppJ: So weit war ich auch schon nur was bei mir nicht funktioniert ist das trennen der 3 zahlen.

    Schau doch mal meinen Code an.



  • ich dachte der funktioniert nicht.



  • darman96 schrieb:

    ich dachte der funktioniert nicht.

    Mach aus

    return in >> char() >> out.x >> out.y >> out.z;
    

    ein

    char c;
    return in >> c >> out.x >> out.y >> out.z;
    

    Du hast doch sicher schon mit std::cin gearbeitet? Dann sollte die Vorgehensweise recht gut zu verstehen sein, vorrausgesetzt man weiß was Operatorenüberladung macht.



  • das mit der operatorüberladung weiß ich leider nicht 😃



  • Hallo darman96,

    um es kurz zu machen: Du hast eine Datei und Du möchtest Koordinaten aus dieser Datei in Deinem Programm einlesen.
    Damit wir Dir wirksam helfen können, müssen wir zwei Dinge wissen.
    1.) wie sieht diese Datei aus? Hat das Dateiformat einen Namen? Kannst Du vielleicht ein kleines Beispiel hier posten.
    2.) Was hast Du nach dem Einlesen mir den Koordinaten vor, also in welcher Form möchtest Du darauf zugreifen?

    Die (Ideal)Lösung sieht so aus: Du hast eine Klasse oder Struktur (oder mehrere), mit der Du Deine Aufgabe bestmöglich lösen kannst, und zwar unabhängig davon, wie diese Koordinaten - oder was da auch immer noch drin steht - in der Datei untergebracht sind. Und genau für diese Klasse oder Struktur schreibt man dann eine Funktion, die diese aus der Datei direkt ausliest. Letzteres ist dann die operator-Überladung.

    .. versuche mal, meine beiden Fragen oben zu beantworten.

    Gruß
    Werner



    1. Also es handelt sich um .obj dateien. Die sind so aufgebaut
    # Blender v2.61 (sub 0) OBJ File: ''
    # www.blender.org
    mtllib block.mtl
    o Cube
    v 1.000000 -1.000000 -1.000000
    v 1.000000 -1.000000 1.000000
    v -1.000000 -1.000000 1.000000
    v -1.000000 -1.000000 -1.000000
    v 1.000000 1.000000 -0.999999
    v 0.999999 1.000000 1.000001
    v -1.000000 1.000000 1.000000
    v -1.000000 1.000000 -1.000000
    usemtl Material
    s off
    f 1 2 3 4
    f 5 8 7 6
    f 1 5 6 2
    f 2 6 7 3
    f 3 7 8 4
    f 5 1 4 8
    

    und ich will nur die zeilen mit den v´s . das hab ich auch schon hinbekommen, was jetzt noch fehlt ist die Zahlen rauszufiltern.

    1. nach dem Einlesen möchte ich die in einer Struktur (VERTEX) speichern. die struktur hab ich auch schon es geht nur darum die zahlen zu trennen.


  • Die Lösung wurde von seldon schon genannt. Hast du damit noch Schwierigkeiten? Zeig mal deinen Code, den du bis jetzt hast.



  • So hier der Code:

    /* base.cpp */
    #include "base.h"
    #include <iostream>
    #include <fstream>
    #include <sstream>
    
    using namespace std;
    
    ModelLoader::ModelLoader() {
    
    }
    
    bool ModelLoader::LoadObjFile(string path) {
    
    	ReadFile(path);
    
    	return true;
    
    }
    
    bool ModelLoader::ReadFile(string path) {
    
    	// variables
    	fstream stream;
    	fstream stream_count;
    	string content;
    
    	VERTEX vertex;
    
    	int x = 0;
    
    	// opens file
    	stream.open(path);
    
    	// if file is open -> continue
    	if (! stream.is_open()) {
    		return false;
    	}
    
    	// opens file
    	stream_count.open(path);
    
    	// if file is open -> continue
    	if (! stream_count.is_open()) {
    		return false;
    	}
    
    	while(! stream_count.eof()) {
    
    		getline(stream_count, content);
    
    		if(content[0] == 'v') {
    			x++;
    		}
    
    	}
    
            //  Arraygröße festlegen
    	mdl.setVertexCount(x);
    
    	x = 0;
    
    	while(! stream.eof()) {
    
    		getline(stream, content);
    
    		if(content[0] == 'v') {
    			mdl.addVertex(x, GetVertex(content));
    			x++;
    		}
    
    	}
    
    	return true;
    
    }
    
    VERTEX ModelLoader::GetVertex(string line) {
    
    	VERTEX vertex;
    
    	int x = 0;
    	string coord = "";
    	stringstream stream;
    
    	for (int i = 0; i < line.length()-1; i++) {
    		if(line[i] == ' ') {
    
    			switch(x) {
    
    			case 1:
    				stream << coord;
    				stream >> vertex.X;
    				coord = "";
    				break;
    
    			case 2:
    				stream << coord;
    				stream >> vertex.Y;
    				coord = "";
    				break;
    
    			case 3:
    				stream << coord;
    				stream >> vertex.Z;
    				coord = "";
    				break;
    
    			}
    
    			x++;
    
    		} else if ( x != 0 ) {
    			coord = coord + line[i];
    		}
    	}
    
    	return vertex;
    
    }
    

    Edit: hier ist auch schon ein Versuch drin die Zahlen zu trennen das hat aber nicht geklappt.


  • Mod

    Liest du die Antworten, die du bekommst? Das hat ja wohl überhaupt nicht mit dem zu tun, was dir gesagt wurde. Tatsächlich ist das Lesen sogar voller Fehler, kein Wunder, dass das nicht funktioniert. Erwartest du, dass jemand für dich deine Fehler in deinem Programm ausbessert?



  • Nein ich hatte den Code hier auch schon bevor ich den thread eröffnet habe.
    Nur da mein Code nicht funktionierte wollte ich wissen wie man das vllt anders lösen könnte.


Anmelden zum Antworten