Probleme mit Schleifen und umwandeln von String zu Float

Ok das ist ein Fehler aber die gebe ich ja nicht aus...Es muss eigentlich ja ein Fehler beim Konvertieren sein von String in Float gibt es da noch andere Möglichkeiten?
 
Ok ich bin jetzt echt an verzweifeln :(
Hier 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;



bool e = true;


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;
        ifstream file(Pfade);
        string buffer;
		size_t pos1;
		size_t pos2;
		float bxf, byf, bzf;
		string bx, by, bz;
 

		while(e == 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);
				iby >> byf;
				istringstream ibz (bz);
				ibz >> bzf;


				s1->ex[i] = bxf;
				s1->ex[i] = byf;
				s1->ex[i] = bzf;
				cout << s1->ex[i] << endl << s1->ex[i] << endl << s1->ex[i] << endl;
				i++;
				
			}
		}
		e = false;
        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;
}

Hier die 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


Und hier die Ausgabe:
Code:
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
1
1
1
1
1
1
1
1
1
1
1
1

Das ist ja komisch und wenn ich Zeile 76 durch das ersetze
C++:
cout <<bxf << endl << byf << endl << bxf << endl;

Die Ausgabe jetzt:
Code:
1
-1
1
1
-1
1
-1
-1
-1
-1
-1
-1
1
1
1
0.999999
1
0.999999
-1
1
-1
-1
1
-1

Die ist immer noch nicht richtig wie man der Datei entnehmen kann.
Bloß weiß ich auch nicht woran es liegen könnte.

mfG
 
Zuletzt bearbeitet von einem Moderator:
Ok das war ein Fehler aber hier die Ausgabe:
Code:
1
-1
-1
1
-1
-1
-1
-1
-1
-1
-1
-1
1
1
1
0.99999
1
1
-1
1
1
-1
1
1

Den Quellcode muss ich ja nicht nochmal angeben hat sich ja nicht viel verändert und die Datei ist oben ja auch nochmal. Die ersten paar sind ja richtig aber dann kommen Fehler auf zb. steht dort nur ein 0.9 Wert drinne obwohl es in der Datei 2 Stück gibt. Hoffe das es auch nur so ein doofer Fehler ist.


mfG
 
Hi.

Mal abgesehen davon, das du es viel zu kompliziert machst, std::string.find liefert keinen bool zurück, sondern einen Index und den speziellen Wert std::string::npos falls die Suche fehlschlägt.

\edit: Gut, es ist schon spät. Du prüfst anscheinend mit find ob der erste Buchstabe der Zeile ein 'v' ist. Das könntest du natürlich auch einfacher haben...
C++:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

using namespace std;

typedef float vec3f[3];

int main() {
  ifstream in("test.dat");
  string line;
  while (getline(in, line)) {
    istringstream is(line);
    char type;
    
    if (is >> type) {
      switch (type) {
      case 'v':
        vec3f v;
        if (is >> v[0] >> v[1] >> v[2])
          cout << v[0] << " " << v[1] << " " << v[2] << endl; 
          break;

      case '#': // comment
        break;

      default:
        clog << "unknown type: " << type << endl;
      }
    }
  } 
}
Schalte alle Warnungen deines Compilers an und berichtige den Code.

Gruß
 
Zuletzt bearbeitet:
Ok ich verstehe das nicht...Was soll ich denn jetzt berichtigen und ich bekomme keine Warnungen im Compiler( VS2010 Express). Ich hab das übrigens ein neues Thema gemacht da ich finde das es nicht mehr zum Titel passt.


mfG
 
Hi.

Verwende den Debugger und schau dir ganz genau an welche Werte die Variablen pos1 und pos2 haben.

Dann schau dir an welche Bedeutung der zweite Parameter der std::string::substr Methode hat.

Alles in allem ist der Versuch mit find und substr zu arbeiten unnötig kompliziert und wird auf diese Weise nicht funktionieren. Du änderst den String und greifst dann mit dem alten Index darauf zu. Du müßtest eigentlich Leerzeichen überspringen, du springst aber nur von Leerzeichen zu Leerzeichen (selbst das stimmt nicht wirklich), egal ob da noch andere Zeichen dazwischenstehen (was wenn nicht).

Gruß
 
Ok sieht besser aus :D Ich schau mal wie du es gemacht hast und versuche es zu verstehen aber warum hast du einmal "cout" und einmal "clog" benutzt wo liegt der unterschied?
 
Zurück