3 spalten ascii datei einlesen c



  • Hi Leute, ich hoffe ich bin hier richtig und ihr könnt mir weiter helfen. Bin absoluter Anfänger in C.

    Folgendes Problem habe ich.

    Ich möchte aus einer ASCII-Datei in der 3 Spalten und mehrere Zeilen vorhanden sind, die Daten (BSP: 2.5795132E-01) einlesen um später in Arrays zu speichern um diese wiederum für weitere Berechnungen zu verwenden.

    Was ich bisher habe:

    #include <stdio.h>
    
    int main()
    {
    	char fname[] = "test.txt";
    	char zeile[1024];   
    	float s1[1024];    
    	float s2[1024];   
    	float s3[1024];  
    	int i, N;    	
    	FILE *fp = fopen(fname,"r");
    
    	/* Teil 1: Einlesen */
    
    	printf("Lese %s\n", fname);
    	if(fp == NULL)
    	{
    		perror(fname);
    		return 1;
    	}
    
    	while(fgets(zeile, sizeof(zeile), fp))
    	{
    		float x, y, z;
    		if(sscanf(zeile, " %E %E %E", &x, &y, &z) == 3)
    		{
    			s1[N] = x;
    			s2[N] = y;
    			s3[N] = z;
    			N++;
    		}
    	}
    	fclose(fp);
    
    	/* Teil 2: Auswerten */
    
    	printf("%d Werte gefunden\n", N);
    	for(i=0; i<N; i++) printf(" %E %E %E\n", s1[i], s2[i], s3[i]);
    	return 0;
    }
    

    als Ausgabe erhalte ich:

    Lese test.txt
    

    aber die in der Datei vorhandenen Daten werden nicht ausgegeben......

    hilfe?!?!



  • N ist nicht initialisiert!



  • Findest du raus, wenn du den Debugger nimmst oder ein paar Testasugaben in das Programm mit einbaust.

    Z.B. in Zeile 26:

    printf("Lese Zeile %d: <%s>", N, Zeile);
    


  • vielen Dank für die schnelle Antwort!! Funktioniert!

    Jetzt habe ich nur noch das Problem, dass der Teil 2, Auswerten, noch nicht funktioniert. Also das ausgeben der Anzahl N und der Daten.



  • estring schrieb:

    vielen Dank für die schnelle Antwort!! Funktioniert!

    Jetzt habe ich nur noch das Problem, dass der Teil 2, Auswerten, noch nicht funktioniert. Also das ausgeben der Anzahl N und der Daten.

    Bei printf() ist %E double, aber nicht float.



  • estring schrieb:

    ..., noch nicht funktioniert. Also das ausgeben der Anzahl N und der Daten.

    Das ist die schlechteste Fehlerbeschreibung die es gibt.

    Was passiert?
    Was erwartest du an Aktionen?



  • gigg schrieb:

    Bei printf() ist %E double, aber nicht float.

    Nein!
    %e (und auch %f und %g) steht bei printf für double und float.
    Der Compiler wandelt das float automatisch in double um.

    ⚠ Bei scanf ist es nicht so. Das ist auch eine ganz andere Funktion.



  • DirkB schrieb:

    gigg schrieb:

    Bei printf() ist %E double, aber nicht float.

    Nein!
    %e (und auch %f und %g) steht bei printf für double und float.
    Der Compiler wandelt das float automatisch in double um.

    ⚠ Bei scanf ist es nicht so. Das ist auch eine ganz andere Funktion.

    Sorry. Bei K&R steht im Referenzteil nur double.



  • sorry für die schlechte Fehlerbeschreibung, ich hab halt das Problem, dass ich keinen Fehler sehe.

    Letztendlich wird im obigen Code dieser Teil:

    /* Teil 2: Auswerten */
    
    	printf("%d Werte gefunden\n", N);
    	for(i=0; i<N; i++)printf(" %E %E %E ", s1[i], s2[i], s3[i]);
    	return 0;
    

    nichts ausgegeben. Ich erwarte, dass meine Daten die eingelesen werden Zum Einen ausgegeben werden (pro Zeile) und zum Anderen die Anzahl der Zeilen die eingelesen wurden.
    Ich möchte damit zeigen, dass die Daten in den Arrays abegspeichert sind um später weitere Berechnungen mit den Daten durch führen zu können.



  • Welchen Startwert hat N, ist N initialisiert? (siehe Beitrag von aki ni saki)



  • Wenn die Ausgabe ".. Werte gefunden" nicht kommt, hängt dein Programm in der while-Schleife fest.

    Was passiert denn überhaupt?
    Blinkt der Cursor?
    Verschwindet das Fenster?



  • N = 0;

    ich möchte letztendlich die eigelesenen Werte in Arrays speichern. Also in s1, s2 und s3.

    mit dem Teil

    while(fgets(zeile, sizeof(zeile), fp))
    	{
    		float gx, gy, gz;
    		if(sscanf(zeile, " %E %E %E", &gx, &gy, &gz) == 3)
    		{
    			s1[N] = gx;
    			s2[N] = gy;
    			s3[N] = gz;
    			N++;
    
    			printf("Lese Zeile %d: <%s>", N, zeile);
    		}
    	}
    

    werden die Zeilen und auch die Werte ausgegeben das klappt ganz gut. Als nächstes möchte ich die Werte aus den Arrays heraus ausgeben.......um zu zeigen, dass ich mit diesen Arrays weiter rechnen kann....

    Sorry wenn das nicht klar rüber kommt...bin wie gesagt neu in der Programmierwelt...

    Danke für eure Hilfe!!!



  • @ DirkB

    Ich denke du könntest recht haben. Ich arbeite mit eclipse.

    Es folgt nur folgende Ausgabe:

    Lese test.txt

    dann folgt nichts mehr.

    füge ich noch

    printf("Lese Zeile %d: <%s>", N, zeile);
    

    in die while shleife ein, so wird die zeile und auch die Werte aus der entsprechenden Zeile ausgegeben....somit denke ich eben das du recht hast....



  • Jetzt muss ich nur noch wissen wie ich aus der while schleife raus komme...



  • fgets gibt ein NULL zurück, wenn das Ende der Datei erreicht wurde: http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

    Nimm das printf mal aus dem if-Zweig raus, lass es aber in der while-Schleife (vertausche Zeile 11 und 12 in dem Beispiel).



  • Vielleicht hat ja deine Datei mehr als 1024 Zeilen ... die Arraygrenze solltest du jedenfalls im Schleifendurchlauf kontrollieren.



  • @Josef,

    DANKE! So ein Dummer Fehler. Sorry an alle und Danke für die Mühe!!

    Beste Grüße!


Anmelden zum Antworten