Wert einlesen aus Datei



  • Also wenn ich den debugger starte sehe ich das der Wert den ich haben will und der es eigentlich auch sein sollte vollkommen anders ist als der in der Datei steht. Die Datei ist ein Daten satz mit nur Zahlen. Die ersten Werte sind Integer und dann kommen nur noch float Zahlen bzw. double. In meinen Programm wird eine Schleife durchlaufen die nach den ersten 6 Werten die ganzen folgenden Werte einliest und dann jenachdem farbige Punkte zeichnet.
    Ich Poste am Besten mal den Code:

    #include <stdio.h>
    #include <windows.h>
    #include "glut.h"
    #include <gl/gl.h>
    
    #pragma comment(lib, "glut32.lib")
    #pragma comment(lib, "opengl32.lib")
    #pragma comment(lib, "mui32.lib")
    
    void init(void);
    void display(void);
    
    	short hoehe, breite ;
    	float abstand,maxwert;
    	short ankozr,ankoyr,farben;
    	char dateiname[62];
    	FILE *datei;
    
    int main(int argc,char **argv)
    {
    
    	/* Abfrage nach Namen des Datensatz */
    
    	printf("Bitte geben sie den Namen des Datensatz ein:\n");
    
    	scanf("%s",dateiname);
    
    	/* Öffnen der Datei */	
    
    	if((datei = fopen(dateiname,"r")) == NULL)
    	{
    		printf("Fehler beim Oeffnen der Datei %d!\n",dateiname);
    		exit(-1);
    	}
    
    	/* Abfrage in wievielen Farben das Bild gezeichnet werden soll */
    	printf("Mit wievielen Farben soll das Bild gezeichnet werden ?");
    	scanf("%d",&farben);
    
    	/* Daten in Programm laden */
    	/*-------------------------*/
    
    	fscanf(datei,"%d",&hoehe);				//Anzahl der Y-werte
    	fscanf(datei,"%d",&breite);				//Anzahl der X-werte
    	fscanf(datei,"%f",&maxwert);			//Größter Wert
    	fscanf(datei,"%f",&abstand);			//Abstand zwischen punkten
    	fscanf(datei,"%d",&ankozr);				//anfangskoordinate z-richtung  
    	fscanf(datei,"%d",&ankoyr);				//anfangskoordinate y-richtung
    
    	glutInit(&argc,argv);
    	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    	glutInitWindowSize(400,400); //Maße des fensters
    	glutInitWindowPosition(50,50);
    	glutCreateWindow("dB Darstellung");
    	init();
    	display();//display(); //glutDisplayFunc(display);
    	glutMainLoop();
    
    	//fclose(datei);
    
    	return 0;
    } 
    
    void init(void)
    {
    
    	glClearColor(1.0, 1.0, 1.0, 0.0);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	glOrtho(-150, 150, -150, 150, -150, 150);
    }
    
    void display(void)
    {
    
    	glClear(GL_COLOR_BUFFER_BIT);
    
    	glColor3ub(0, 0, 0);
    
    	/* Koordinaten System */
    	/*--------------------*/
    
    	/* Y-Achse */
    	glBegin(GL_LINES);
    	glVertex2i(-145, 140);
    	glVertex2i(-145, -145);
    	glEnd();
    
    	/* X-Achse */
    	glBegin(GL_LINES);
    	glVertex2i(140, -145);
    	glVertex2i(-145, -145);
    	glEnd();
    
    	/* Spitzen des Koordinaten Systems*/
    	/*--------------------------------*/
    
    	/* Oben, Y-Achse */
    	glBegin(GL_TRIANGLES);
    	glVertex2f(-145,145);
    	glVertex2f(-144,138);
    	glVertex2f(-146,138);
    	glEnd();
    
    	/* Rechts, X-Achse*/
    	glBegin(GL_TRIANGLES);
    	glVertex2f(145,-145);
    	glVertex2f(138,-144);
    	glVertex2f(138,-146);
    	glEnd();
    
    	/* NullMarkierungen */
    
    	glBegin(GL_LINES);
    	glVertex2f(0,-143);
    	glVertex2f(0, -147);
    	glEnd();
    
    	glBegin(GL_LINES);
    	glVertex2f(-143, 0);
    	glVertex2f(-147, 0);
    	glEnd();
    
    	/* Punkte zeichnen */
    	/*-----------------*/
    
    	float looph;			// schleife für höhe
    	float loopb;			// schleife für breite
    	short loopf;			// schleife für farbe
    	double werte;
    	short wschritt;		//wertschritte (in welche bereiche die Werte unterschiedliche Farben bekommen)
    	short fschritt;		//farbschritte (wie groß die Stufen zum Farbunterschied sind)
    	float r,g,b;			// rot, grün, blau
    	short counter;			// zähltdurchläufe für Farbbestimmung
    
    	wschritt = maxwert / farben;
    	fschritt = 255 / farben * 2;
    
    	for(looph = 0.5; looph < hoehe; looph = looph + abstand)				//rückt "curser" nach oben
    	{	
    		loopb = abstand;
    
    		for(loopb = 0.5; loopb < breite; loopb = loopb + abstand)			// rückt "curser" zur seite         
    		{
    			fscanf(datei,"%f",&werte);
    			//printf("%f",werte);
    
    			loopf = 0;
    			r = 255;
    			g = b = 0;
    			counter = 0;
    
    			while(loopf != 1)
    			{
    
    				glColor3f(r,g,b);
    
    				if(counter <= werte && (counter + wschritt) > werte)
    				{
    					glBegin(GL_POINTS);
    					glVertex2i(loopb - 145,looph - 145);
    					glEnd();
    					break;
    				}
    
    				if(b == 0 && r > 0)
    				{
    					r = r - fschritt;
    					g = g + fschritt;
    				}
    
    				else
    				{	
    					if(r == 0 && b >= 0)
    					{
    						g = g - fschritt;
    						b = b + fschritt;
    					}
    				}
    
    				counter = counter + wschritt;
    
    				if((counter + 1) > maxwert)
    					loopf = 1;
    
    			}
    
    		}
    
    	}
    
    	fclose(datei);
    
    	glEnd();
    
    	glutSwapBuffers();
    
    }
    


  • Achso ja und die Werte haben immer 5 Ziffern nach dem Komma und von 2 bis 5 Ziffern vor den Komma.



  • Sind deine Werte in der Datei auch durch ein White-Space-Char getrennt? Oder hast du die Zahlen einfach so hintereinander reingeschrieben, oder vielleicht bloß durch ein Komma getrennt (ohne zusätzliches Leerzeichen)?



  • Jede neue Zahl ist in einer neuen Zeile.



  • Ernd schrieb:

    Jede neue Zahl ist in einer neuen Zeile.

    Dann ist doch ganz einfach
    Prinzip:

    char buf=0;
    double xx=0;
    while(!feof(datei_ptr))
    {
     fscanf(datei_ptr,"%lf",buf)
    }
    

    Mit der Funktion Scanst du die ganze Datei und zwar Zeilenweisse.
    bis die datei zu ende ist.

    mit xx=atof(buf); kannst du z.b. dann auf double wandlen.



  • Das Funktioniert ja. In einer Vorherigen Funktion konnte ich jeden Wert lesen. Nur jetzt liest der aufeinmal einen Total wirren Wert.



  • Ich habe gerade die Lösung meines Problemes selber gefunden. Es lag daran das die Variable Werte in der Funktion display definiert war. Der Pointer auf die Datei jedoch Gobal war.
    Trotzdem vielen Dank für die Hilfe.
    Ernd



  • Chris233 schrieb:

    Ernd schrieb:

    Jede neue Zahl ist in einer neuen Zeile.

    Dann ist doch ganz einfach
    Prinzip:

    char buf=0;
    double xx=0;
    while(!feof(datei_ptr))
    {
     fscanf(datei_ptr,"%lf",buf)
    }
    

    Mit der Funktion Scanst du die ganze Datei und zwar Zeilenweisse.
    bis die datei zu ende ist.

    mit xx=atof(buf); kannst du z.b. dann auf double wandlen.

    Dieser Quellcode ist nicht dein Ernst, oder?!?



  • Meiner ???



  • @Ernd
    Nein der von Chris.



  • @ernd
    verbesserungsvorschlag:
    es macht keinen sinn in jeder renderloop die werte neu aus einer datei zu laden, ausser du änderst die datei zur laufzeit. wenn du sie änderst dann nehme ich alles zurück, ansonsten wäre dieses verschwendung von resourcen.



  • Ich verstehe nicht wie du das meinst.
    Ich lade den Wert. Gehe in die while-schleife. Bestimme die Farbe. Und zeichne den Punkt. Dann lese ich den nächsten Wert und Zeichne auch den dazugehörigen Punkt.



  • die funktion display(); wird wieder und wieder von der mainloop aufgerufen oder machst du nur einen rendervorgang und beendest dann das programm.



  • Achso. Du meinst wahrscheinlich in der main oder? Das habe ich nur zum debuggen gemacht. Damit das programm in die Funktion springt.


Anmelden zum Antworten