fscanf



  • [code="c"]while ((fscanf(datei_ptr,"%f",Messdaten)) != EOF)
    

    So schreibst du immer nur in das erste Element von deinem Array.

    zoro schrieb:

    Habe auch mal die Abbruchbedingung auf

    while ((fscanf(datei_ptr,"%s",Messdaten)) ==  1)
    

    gesetzt. Und es hat genause funktioniert wie mit EOF.

    Dann mach das mal jetzt (mit dem %f) und schreib mal ein Zeichen darein, das nicht zu einer float-Zahl passt. Z.B. ein Komma: , oder @



  • Also, ich habe eine beliebige Datei Text.txt, mit folgenden zufälligen Inhalt.

    23 34 1 232
    12 232 5
    1
    2132

    Das heißt, es sind beliebige Zahlen, Ziffern in dieser Datei, beliebig angeordnet.

    Ich möchte mit meinem Programm, die Datei öffnen Lesen und die Messwerte in ein Array beliebiger größe Speichern. Gleichzeitig möchte ich die Anzahl der Zahlen auch noch dazu ermitteln, in diesem Beispiel wären das 9 Zahlen.

    Ich denke mal das hat deswegen nicht funktioniert, da ich float Werte in das float array speichere. Und deswegen kann ich keinen String auslesen.



  • zoro schrieb:

    Ich denke mal das hat deswegen nicht funktioniert, da ich float Werte in das float array speichere.

    Da gehören die aber hin.

    zoro schrieb:

    Und deswegen kann ich keinen String auslesen.

    Das hast du ja auch nicht gemacht.

    Dein Beispiel im Eröffnungspost hätte mit dem printf("%s",Messdaten); genauso funktioniert. Nur könntest du dann mit den Zahlen nicht vernünftig rechnen.

    zoro schrieb:

    Ich möchte mit meinem Programm, die Datei öffnen Lesen und die Messwerte in ein Array beliebiger größe Speichern. Gleichzeitig möchte ich die Anzahl der Zahlen auch noch dazu ermitteln, in diesem Beispiel wären das 9 Zahlen.

    Das funktioniert ja jetzt fast (du musst bei fscanf das richtige Element vom Array angeben).
    Bis auf die beliebige Größe. Da musst du dich mit dynamischer Speicherverwaltung auseinander setzen. malloc und co.



  • Ok, ich glaube ich habe das verstanden mit der 1. Glaube ich.

    Wäre es dann so korrekt?

    if((datei_ptr = fopen(dateiname,"r")) != NULL)
    	{
    		while ((fscanf(datei_ptr,"%f",&Messdaten[cnt])) == 1)
    		{
    			cnt++;
    		}
    	}
    	printf("%i\n",cnt);
    	for (i=0;i<=cnt;i++)
    		printf("%f",Messdaten[i]);
    


  • Dann nimm int!
    @DirkB
    Die Aufgabe ist es eine Datei auszulesen in der beliebige Zahlen (beliebig angeordnet) stehen. Wenn da nun ein Komma drin ist, ist dies nicht das Problem von zoro.



  • Oder warscheinlich so besser:

    if((datei_ptr = fopen(dateiname,"r")) != NULL)
    	{
    		while ((fscanf(datei_ptr,"%f",&Floatvariable)) == 1)
    		{
    		Messdaten[cnt] = Floatvariable;	
                    cnt++;
    		}
    	}
    	printf("%i\n",cnt);
    	for (i=0;i<=cnt;i++)
    		printf("%f",Messdaten[i]);
    


  • Ja habe ich vergessen zu sagen, sollen float werte sein,habe schlechte Zahlen gewählt^^

    Aber vielen Dank trotzdem schon mal für die ganze Hilfe!



  • @zoro
    Bie der Ausgabe kommt nur ein < cnt hin.

    Bitmapper schrieb:

    @DirkB
    Die Aufgabe ist es eine Datei auszulesen in der beliebige Zahlen (beliebig angeordnet) stehen. Wenn da nun ein Komma drin ist, ist dies nicht das Problem von zoro.

    Wenn da ein falsches Zeichen in der Datei ist, dann wird das vom fscanf nicht überlesen. Es bleibt im Eingabestrom stehen. fsanf gibt in diesem Fall ein 0 zurück.

    Wenn er das == 1 hat, bricht das Einlesen ab.
    Wenn er das != EOF hat, wird immer wieder versucht eine neue Zahl einzulesen. -> Endlosschleife.



  • Also denke habe das Problem gelöst, dank eurer Hilfe^^!
    Mein Code:

    int main(void) {
    	char dateiname[60];
    	float Messdaten[100];
    	int i=0,cnt=0;
    	puts("Wie heisst die zu oeffnende Datei?");
    	scanf("%s",dateiname);
    	FILE *datei_ptr;
    	if((datei_ptr = fopen(dateiname,"r")) != NULL)
    	{
    		while ((fscanf(datei_ptr,"%f",&Messdaten[cnt])) == 1)
    		{
    			cnt++;
    		}
    	}
    	printf("Anzahl Messwerte: %i\n",cnt);
    	for (i=0;i<cnt;i++)
    		printf("\t%f\n",Messdaten[i]);
    	system("PAUSE");
    	return EXIT_SUCCESS;
    }
    

    Und die Text.txt datei sieht folgendermaßen aus:

    12 23 34 12 234 23
    11 10 9 8
    2.123
    

    und das ist das Ergebnis:

    Wie heisst die zu oeffnende Datei?
    text.txt
    Anzahl Messwerte: 11
            12.000000
            23.000000
            34.000000
            12.000000
            234.000000
            23.000000
            11.000000
            10.000000
            9.000000
            8.000000
            2.123000
    Drücken Sie eine beliebige Taste . . .
    


  • @DirkB
    Das ist mir bewusst, ich habe gemeint, dass es nicht die Aufgabe von zoro ist auf falsche Zeichen zu reagieren. Laut Aufgabenstellung ist davon auszugehen, dass in der Datei nur Zahlen vorkommen.



  • Er soll ja auch nicht darauf reagieren (dh. überlesen oder Meldung an den Nutzer)
    Aber einen Programmabsturz sollte man schon vermeiden. Vor allem wenn es so einfach ist.

    Beim eingeben vom Dateinamen vertippt und das wars dann.


Anmelden zum Antworten