Probleme mit Schleifen und umwandeln von String zu Float

CodeCrafterCpp

Erfahrenes Mitglied
Hallo,
Irgendwie kommt wenn ich das Programm starte ganz viele Zahlen auch die richtigen aber er hört einfach nicht auf...was ist falsch hab es auch schon mit For-Schleife versucht bringt auch nichts. Wenn ich die Daten bxf, byf und bzf ausgebe bekomme ich komische Zeichen und nicht die Float Werte.

Der Code:
C++:
#include <iostream>
#include <windows.h>
#include <SDL.h> 
#include <GL/gl.h>
#include <GL/glu.h>
#include <string>
#include <fstream>
#include <sstream>


using namespace std;


string bx;
string by;
string bz;



void init()
{
	glClearColor(0.0,0.0,0.0,1.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45.0,640.0/480.0,5.0,500.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

class Quad
{
public:
	float ex[10];
	float ey[10];
	float ez[10];


};

void auslesen(string Pfade, class Quad *s1)
{
		int i = 0;
		int e = 0;
        ifstream file(Pfade);
        string buffer;
		size_t pos1;
		size_t pos2;
		float bxf, byf, bzf;


		while(true)
		{
			getline(file,buffer);
			if(!buffer.find('v'))
			{
				pos1 = buffer.find(" ");
				buffer = buffer.substr(pos1);
				pos2 = buffer.find(" ", pos1);
				bx = buffer.substr(pos1, pos2);
				pos1 = buffer.find(" ", pos2);
				by = buffer.substr(pos2, pos1);
				pos2 = buffer.find(" ", pos1);
				bz = buffer.substr(pos1, pos2);

				cout << bx << endl << by << endl << bz << endl;

				istringstream bx;
				bx >> bxf;
				istringstream by;
				bx >> byf;
				istringstream bz;
				bx >> bzf;

				s1->ex[i] = bxf;
				s1->ex[i] = byf;
				s1->ex[i] = bzf;

				i++;
			}
			if(e<20)
            {
                e++;
            }else
            {
                break;
            }
		}
        file.close();
}


void display()
{
    Quad s1;
    auslesen("C://Users/Jonas/Desktop/test.obj",&s1);
	glClear(GL_COLOR_BUFFER_BIT);
	  glBegin(GL_QUADS);
        glVertex3f(s1.ex[0], s1.ey[0], s1.ez[0]);
        glVertex3f(s1.ex[1], s1.ey[1], s1.ez[1]);
		glVertex3f(s1.ex[2], s1.ey[2], s1.ez[2]);
		glVertex3f(s1.ex[3], s1.ey[3], s1.ez[3]);
		
        /*glVertex3f(1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, 1.000000,5.0);
        glVertex3f(1.000000, 1.000000,5.0);
        
        glVertex3f(1.000000, 1.000000,-5.0);
        glVertex3f(1.000000, 1.000000,5.0);
        glVertex3f(1.000000, -1.000000,5.0);
        glVertex3f(1.000000, -1.000000,-5.0);
        
        glVertex3f(1.000000, -1.000000,-5.0);
        glVertex3f(1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, -1.000000,-5.0);
        
        glVertex3f(-1.000000, -1.000000,-5.0);
        glVertex3f(-1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, 1.000000,5.0);
        glVertex3f(-1.000000, 1.000000,-5.0);
        
        glVertex3f(-1.000000, 1.000000,-5.0);
        glVertex3f(-1.000000, 1.000000,5.0);
        glVertex3f(1.000000, 1.000000,5.0);
        glVertex3f(1.000000, 1.000000,-5.0);*/
	glEnd();
}

int main(int, char**)
{
	SDL_Init(SDL_INIT_EVERYTHING);
	SDL_Surface* screen=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE|SDL_OPENGL);
	bool running=true;
	Uint32 start;
	SDL_Event event;
	init();
	while(running)
	{
		start=SDL_GetTicks();
		while(SDL_PollEvent(&event))
		{
			switch(event.type)
			{
				case SDL_QUIT:
					running=false;
					break;
			}
		}
		display();
		SDL_GL_SwapBuffers();
		if(1000/30>(SDL_GetTicks()-start))
			SDL_Delay(1000/30-(SDL_GetTicks()-start));
	}
	SDL_Quit();
	return 0;
}

Achja hier nochmal die Datei die ausgelesen werden soll:
Code:
# Blender v2.62 (sub 0) OBJ File: ''
# www.blender.org
mtllib test.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



mfG
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    88,2 KB · Aufrufe: 21
Zuletzt bearbeitet von einem Moderator:
Schau mal in Zeile 67:

C++:
        istringstream bx;
                bx >> bxf;
                istringstream by;
                bx >> byf;
                istringstream bz;
                bx >> bzf;

Du erstellst einen istringstream bx und schreibst dann bx >> bxf; bx ist aber leer, du musst zuerst etwas in bx heineinschreiben, um wieder auszulesen. Ich vermute mal du willst den Inhalt des strings bx in den istringstream bx verschieben, jedoch geht das nicht, wenn du beide gleich benennst.

C++:
istringstream ibx (bx);

Jetzt wird zum Beispiel der istringstream am Anfang mit dem Inhalt des globalen strings bx initialisiert. Für die folgenden Fälle gleich.
 
Ahh ich hab das mit "=" versucht und das hat nicht geklappt. Die Werte sind aber immer noch nicht richtig da kommt so was mit e+... oder so am Ende....siehe Anhang.
Und das mit der Schliefe geht auch noch nicht.


Der neue Code:
C++:
#include <iostream>
#include <windows.h>
#include <SDL.h> 
#include <GL/gl.h>
#include <GL/glu.h>
#include <string>
#include <fstream>
#include <sstream>


using namespace std;


string bx;
string by;
string bz;



void init()
{
	glClearColor(0.0,0.0,0.0,1.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45.0,640.0/480.0,5.0,500.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

class Quad
{
public:
	float ex[10];
	float ey[10];
	float ez[10];


};

void auslesen(string Pfade, class Quad *s1)
{
		int i = 0;
		int e = 0;
        ifstream file(Pfade);
        string buffer;
		size_t pos1;
		size_t pos2;
		float bxf, byf, bzf;


		while(true)
		{
			getline(file,buffer);
			if(!buffer.find('v'))
			{
				pos1 = buffer.find(" ");
				buffer = buffer.substr(pos1);
				pos2 = buffer.find(" ", pos1);
				bx = buffer.substr(pos1, pos2);
				pos1 = buffer.find(" ", pos2);
				by = buffer.substr(pos2, pos1);
				pos2 = buffer.find(" ", pos1);
				bz = buffer.substr(pos1, pos2);

				

				istringstream ibx (bx);
				ibx >> bxf;
				istringstream iby (by);
				ibx >> byf;
				istringstream ibz (bz);
				ibx >> bzf;

				cout << bxf << endl << byf << endl << bzf << endl;
				s1->ex[i] = bxf;
				s1->ex[i] = byf;
				s1->ex[i] = bzf;

				i++;
			}
			if(e<=20)
            {
                e++;
            }else
            {
                break;
            }
		}
        file.close();
}


void display()
{
    Quad s1;
    auslesen("C://Users/Jonas/Desktop/test.obj",&s1);
	glClear(GL_COLOR_BUFFER_BIT);
	  glBegin(GL_QUADS);
        glVertex3f(s1.ex[0], s1.ey[0], s1.ez[0]);
        glVertex3f(s1.ex[1], s1.ey[1], s1.ez[1]);
		glVertex3f(s1.ex[2], s1.ey[2], s1.ez[2]);
		glVertex3f(s1.ex[3], s1.ey[3], s1.ez[3]);
		
        /*glVertex3f(1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, 1.000000,5.0);
        glVertex3f(1.000000, 1.000000,5.0);
        
        glVertex3f(1.000000, 1.000000,-5.0);
        glVertex3f(1.000000, 1.000000,5.0);
        glVertex3f(1.000000, -1.000000,5.0);
        glVertex3f(1.000000, -1.000000,-5.0);
        
        glVertex3f(1.000000, -1.000000,-5.0);
        glVertex3f(1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, -1.000000,-5.0);
        
        glVertex3f(-1.000000, -1.000000,-5.0);
        glVertex3f(-1.000000, -1.000000,5.0);
        glVertex3f(-1.000000, 1.000000,5.0);
        glVertex3f(-1.000000, 1.000000,-5.0);
        
        glVertex3f(-1.000000, 1.000000,-5.0);
        glVertex3f(-1.000000, 1.000000,5.0);
        glVertex3f(1.000000, 1.000000,5.0);
        glVertex3f(1.000000, 1.000000,-5.0);*/
	glEnd();
}

int main(int, char**)
{
	SDL_Init(SDL_INIT_EVERYTHING);
	SDL_Surface* screen=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE|SDL_OPENGL);
	bool running=true;
	Uint32 start;
	SDL_Event event;
	init();
	while(running)
	{
		start=SDL_GetTicks();
		while(SDL_PollEvent(&event))
		{
			switch(event.type)
			{
				case SDL_QUIT:
					running=false;
					break;
			}
		}
		display();
		SDL_GL_SwapBuffers();
		if(1000/30>(SDL_GetTicks()-start))
			SDL_Delay(1000/30-(SDL_GetTicks()-start));
	}
	SDL_Quit();
	return 0;
}
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    90,1 KB · Aufrufe: 13
Zuletzt bearbeitet von einem Moderator:
1. Ok das geht auch bloß jetzt gibt er mir immer noch wie verrückt die Werte aus nach 20 Durchgängen sollte er ja aufhören. Also nach 20 Zeilen auslesen...

2. Gibt es eine Möglichkeit das man herausfindet wie viele Zeilen eine Datei hat?
 
1. Da ich in OpenGL nicht tätig bin, kann ich dir da jetzt leider nicht weiterhelfen, nur im main() wird ja die Schleife while (running) immer wieder ausgeführt und da wird auch immer wieder display() aufgerufen kann es daran liegen?

2. Am besten mit getline():
C++:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream as ("bsp.txt");
    string a;
    int count = 0;

    while (getline (as, a))
    {
        count++;
    }

    cout << "Datei hat " << count << " Zeilen." << endl;
}
 
Wofür ist "String a:" ?
Ok lag daran. Aber jetzt steht hinter ein paar Zahlen immer noch z.b. -1.07374e+008 wie bekomme ich das e+008 weg? Und den Wert -1.07374e+008 ist in der Datei auch gar nicht Vorhanden.

Ausgabe:
Code:
1
-1.07374e+008
-1.07374e+008
1
-1.07374e+008
-1.07374e+008
-1
-1.07374e+008
-1.07374e+008
-1
-1.07374e+008
-1.07374e+008
1
-1.07374e+008
-1.07374e+008
0.999999
-1.07374e+008
-1.07374e+008
-1
-1.07374e+008
-1.07374e+008
-1
-1.07374e+008
-1.07374e+008



Datei:
Code:
# Blender v2.62 (sub 0) OBJ File: ''
# www.blender.org
mtllib test.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

Was ist das Problem?

Außerdem hab ich ja schon eine Getline hört er denn von alleine auf wenn die Datei zu Ende ist?
 
Zuletzt bearbeitet:
Ok das hab ich jetzt hinbekommen jetzt hab ich nur noch wie ein Beitrag weiter oben schon gesagt nur noch "Flasche Werte".

mfG
 
Ja, getline() hört am Ende von alleine auf.
Weiters bin ich jetzt leider überfragt, nur eins noch: In Zeile 75-77 kopierst du bxf, byf und bzf in dasselbe Element, also steht im Endeffekt nur bzf in s1->ex[ i ] drin.

Lg
 

Neue Beiträge

Zurück