fscanf



  • int main(void) {
    	char dateiname[60];
    	char Messdaten[100];
    	int i=0,cnt=3;
    	puts("Wie heisst die zu oeffnende Datei?"); /* prints !!!Hello World!!! */
    	scanf("%s",dateiname);
    	FILE *datei_ptr;
    
    	if((datei_ptr = fopen(dateiname,"r")) != NULL)
    	{
    		while ((fscanf(datei_ptr,"%s",Messdaten)) != EOF)
    		{
    			for (i=0;i!=cnt;i++)
    				printf("%c",Messdaten[i]);
    
    		}
    	}
    	printf("%i\n",cnt);
    	system("PAUSE");
    	return EXIT_SUCCESS;
    }
    

    Hallo, also mein Problem ist, ich will eine Text.txt datei einlesen, bei der in der ersten zeile z.B. 3 Zahlen stehen in der nächsten 9 usw. Das Auslesen klappt auch wunder bar, aber wenn die Zeilen der Text.txt datei größer als meine cnt Variable wird(hier cnt = 3), dann spuckt der nur noch Müll aus.
    Wie kann ich sicher stellen das immer so viele Zeilen gelesen werden wie in der Text.txt datei vorhanden? Und wie kann ich die Messwerte bzw. die Zahlen mitzählen? bzw. die Anzahl ermitteln?



  • Wie sieht deine Datei aus?

    Stehen da drei Zahlen oder drei Ziffern?
    Wie sind diese voneinander getrennt?
    Was willst du damit machen.

    Hast du es schon mal mit

    printf("%s",Messdaten);
    

    probiert?

    Deine Abbruchbedingung für die while-Schleife ist falsch.

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


  • Nimm doch für Zeilenweises lesen fgets, damit hast du auch zwingend eine überprüfung der Länge.
    Um so viele Zeilen auszulesen wie in der Datei vorhanden, musst du den Rückgabewert von fgets auswerten.
    Die Anzahl ermitteln kannst du mit einer Zählvariable und dem Operator ++
    Edit: Was soll dieses

    /* prints !!!Hello World!!! */
    


  • Die datei sieht so aus z.B.

    12 23 14
    1 35 2
    3

    und die Zahlen sind immer mit Leerstellen getrennt.

    Zu:

    DirkB schrieb:

    Hast du es schon mal mit

    printf("%s",Messdaten);
    

    probiert?
    [/code]

    werd ich gleich mal ausprobieren.

    Die Abbruch Bedingung stimmt laut Professoer^^ und hat auch immer bis jetzt funktioniert.

    Ich würde gerne die Zahlen in mein Array speicher, und die Anzahl der gelesenen Zahlen auch noch dazu^^



  • zoro schrieb:

    Wie kann ich sicher stellen das immer so viele Zeilen gelesen werden wie in der Text.txt datei vorhanden?

    Indem du zeilenweise liest.
    Das was du da machst, ist wortweises Lesen.



  • Edit: Was soll dieses

    /* prints !!!Hello World!!! */
    

    Ist noch vom vorherigen Bsp. Code, tut nichts zur Sache. Die Sache ist die das wir das ohne fgets Probieren sollen. Sonst hätte ich das auch so gemacht.

    und

    printf("%s",Messdaten);
    

    funkt leider nicht^^ wäre auch zu einfach.



  • zoro schrieb:

    Die Abbruch Bedingung stimmt laut Professoer^^

    Professoren können wie alle anderen Lehrer nicht programmieren. Nimm deren Aussagen, zumal solche Pauschalaussagen, 'ist richtig...', 'funktioniert...', ... nicht ernst.

    zoro schrieb:

    und hat auch immer bis jetzt funktioniert.

    Das kannst du als Anfänger überhaupt nicht beurteilen (ebensowenig wie dein Professor)



  • Muss es ein Array vom Typ char sein? Mit einem int wäre es doch viel einfacher.



  • Also habe es mal einfach so mit einer Zählvariable i probiert, und hatt mir auch die richtige Anzahl an Messwerten, bzw Zahlen angegeben.

    int main(void) {
    	char dateiname[60];
    	float Messdaten[100];
    	int i=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)) != EOF)
    		{
    			i++;
    		}
    	}
    	printf("%i\n",i);
    	system("PAUSE");
    	return EXIT_SUCCESS;
    }
    

    Habe auch mal die Abbruchbedingung auf

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

    gesetzt. Und es hat genause funktioniert wie mit EOF.

    Die frage ist jetzt nur noch wie ich mein Array komplett auslesen kann, obwohl ja keine binäre "\0" am Ende ist, das geht doch jetzt ganz einfach über meinen Zähler i?

    z.B.

    for(x=0; x<i; x++)
       printf("%f",Messdaten[x]);
    


  • zoro schrieb:

    funkt leider nicht^^ wäre auch zu einfach.

    Was funkt daran nicht. Was passiert, und was erwartest du.

    Ich habe immer noch nicht verstanden, was du möchtest.
    Denn dein Vorgehen kann für dein Problem der falsche Weg sein.
    Darum ist es besser dein eigentliches Problem zu schildern und zu lösen, als das Problem bei deinen Irrweg zu beheben.

    Gehören die Werte in einer Zeile irgendwie zusammen?



  • [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.


Anmelden zum Antworten