Verständnisfragen zu fgets() und sscanf()



  • Hi, ich bin im Moment dabei das NeHe OpenGL Tutorial durchzuarbeiten und bin auf ein Codefragment gestoßen, das ich nicht verstehe.
    Ich poste trotz dem OpenGL-Zusammenhang hier, da die Fragen sich nicht um die API drehen.

    void readstr(FILE *f,char *string)
    {
    	do
    	{
    		fgets(string, 255, f);
    	} while ((string[0] == '/') || (string[0] == '\n'));
    	return;
    }
    
    void SetupWorld()
    {
    	float x, y, z, u, v;
    	int numtriangles;
    	FILE *filein;
    	char oneline[255];
    	filein = fopen("data/world.txt", "rt");				// File To Load World Data From
    
    	readstr(filein,oneline);
    	sscanf(oneline, "NUMPOLLIES %d\n", &numtriangles);
    
    	sector1.triangle = new TRIANGLE[numtriangles];
    	sector1.numtriangles = numtriangles;
    	for (int loop = 0; loop < numtriangles; loop++)
    	{
    		for (int vert = 0; vert < 3; vert++)
    		{
    			readstr(filein,oneline);
    			sscanf(oneline, "%f %f %f %f %f", &x, &y, &z, &u, &v);
    			sector1.triangle[loop].vertex[vert].x = x;
    			sector1.triangle[loop].vertex[vert].y = y;
    			sector1.triangle[loop].vertex[vert].z = z;
    			sector1.triangle[loop].vertex[vert].u = u;
    			sector1.triangle[loop].vertex[vert].v = v;
    		}
    	}
    	fclose(filein);
    	return;
    }
    

    Bei diesem Codefragment geht es darum, dass aus einer Textdatei Daten für die 3D-Welt ausgelesen werden. Meine Fragen beziehen sich nun auf:

    Zeile 6: Was bewirkt diese Abbruchsbedingung?

    Zeilen 27/28: Woher weiß das Programm welche Zeile aus der Textdatei gelesen werden muss? Bzw. wodurch springt die Zeile weiter? Es gibt viele Zeilen im Format "%f %f %f %f %f" um eben die Vertices zu bestimmen.



  • Zeile 6 sorgt dafür, das so lange gelesen wird, wie die Zeile mit einem \n oder / beginnt
    Zeile 27/28 der liest doch bei jedem Durchgang eine neue Zeile und scant die.

    PS
    a) orientiere dich bitte nicht so sehr an den NeHe Beispielen, die sind schrecklich!
    b) verwendet man in C++ ohnehin eher std::fstream anstelle die alten C Funktionen für I/O.



  • Danke für die schnelle Antwort, hab mich jetzt nochmal damit beschäftigt und verstehe das Codefragment soweit.

    zu a) Danke für den Tipp, hast du andere Vorschläge zu Lernmaterial? Ist http://www.amazon.com/OpenGL-Programming-Guide-Official-Learning/dp/0321481003/ref=pd_bbs_sr_3/103-7001143-4507817?ie=UTF8&s=books&qid=1187550091&sr=1-3 empfehlenswert?

    zu b) Ja wie gesagt arbeite halt das Tutorial durch, aber werd mich in Zukunft daran halten.


Anmelden zum Antworten