fscanf auslese Problem



  • sowas gibts noch dachte die wären ausgestorben. 😛

    Danke für die buch empfelung, dann werde ich mir die mal zu gemüte ziehen!

    Ich hoffe die kommen mal drauf andere werden sich das bestimmt extra hollen.



  • Moin moin,

    ich sitze gerade mit einem Kommilitonen zusammen über einem Semesterprojekt und stehen vor folgendem Problem ... unser C-Programm funktioniert unter Codeblocks und xcode, allerdings müssen wir noch die Igel.h aus Visual Studio einbinden, sodass es natürlich auch darunter funktionieren muss und genau da ist der Haken.
    Via Breakpoints haben wir schon rausgefunden, dass das Problem bei fscanf liegt, kommen aber einfach nicht auf die Lösung.
    Wäre sehr nett, wenn sich jemand dessen annehmen und uns die Augen öffnen könnte.
    Schonmal vielen Dank im voraus !

    Mit freundlichen Grüßen
    Florian

    void IgelMain()
    	{
    	 //Initialisierung und Deklaration
        FILE *Datei;
        struct Punkt *polygon1, *polygon2, *schnittliste;
    	//testpunkte
    	struct Punkt s1,e1,s2,e2, test2;
    	char stringPfad[300]={}, current, stringPoly[100]={};
        long pos;
        int iWahl=0, wechsel = 0, length1 = -1,length2 = -1, leer1 = 0, leer2 = 0, i, isSchnitt;
        double test = 1.0;
    
    	open_console();
        //Menue
        printf("\n ***********************************\n 
                   I   ------  Hauptmenue  ------    I\n 
                   I                                 I\n 
                   I(1) Schnittflaeche berechnen     I\n 
                   I(2) Programm beenden             I\n 
                   I                                 I\n  
                   ***********************************\n 
                   -> ");
        scanf("%i",&iWahl);
        fflush(stdin);
        if(iWahl==1)
        {
            //Textdatei mit den x- und y-werten der Polygone einlesen
            do
            {
                printf("\nBitte geben Sie den Dateipfad ein: ");
                scanf("%s",&stringPfad[0]); //Dateipfad wird als String in Varaible gespeichert
                Datei=fopen(&stringPfad[0],"r"); // Datei wird im lese-Modus geoeffnet
                if(Datei==NULL) printf("\nDatei leider nicht lesbar, bitte wiederholen Sie Ihre Eingabe !"); //Fehlerausgabe, wenn angegebene Datei nicht vorhanden ist
            }while(Datei==NULL);
    
            //***Einlesen der ersten Zeile der Datei in ein Array aus Punkten.***
            //Länge der ersten Zeile und die Anzahl der Leerzeichen feststellen.
            do{
                current = getc(Datei);
                length1++;
                if(current == 32) leer1++;
            }while(current != 0x0A);
    
            //Pos speichert den Wert des Anfangs der zweiten Zeile von Datei
            pos = ftell(Datei);
            //Dateipointer an den Anfang der Datei setzen
            //rewind(Datei);
    		fclose(Datei);
    		Datei=fopen(&stringPfad[0],"r");
            //Speicherallokation für die Punkte des ersten Arrays und Zuweisung
            polygon1 = (struct Punkt*) calloc((leer1+1)/2,sizeof(struct Punkt));
            for (i = 0; i < ((leer1+1)/2); i++){
                fscanf(Datei,"%s",stringPoly);   [b]//und genau hier liegt dann der Fehler[/b]
                polygon1[i].xvalue = atof(stringPoly);
                fscanf(Datei,"%s",stringPoly);
                polygon1[i].yvalue = atof(stringPoly);
            }
    


  • sicher, dass die datei geöffnet wird?
    btw wäre eine fehlerbeschreibung evtl brauchbar und auch compilerwarnungen etc

    🙂



  • datei wird geöffnet, nur wenn ich die erste zeile, in x- und y- werte getrennt, einlesen will, gibt er mir den fehler expression cannot be evaluated.

    test datei sieht wie folgt aus ...

    123.212 123123.0 123123 123123
    11 22 33 44 11 22 33 44



  • Welche Werte haben denn pos, length1 und leer1?
    Bei welchem i tritt der Fehler auf.

    Und wenn ich das sehe: &stringPfad[0] , dann weiß ich das ihr zwar nachgedacht aber nicht begriffen habt.



  • pos ist an der ersten stelle der zweiten zeile, length1 ist erstmal unwichtig, gibt aber die richtige anzahl aller zeichen der ersten zeile wieder ... leer1 ist die anzahl der leerzeichen und steht auf 3, so wie es soll ...
    wie gesagt, das programm funktioniert nur unter visual studio 2010 nicht

    was das &stringPfad[0] angeht, ich habe das [0] mal entfernt

    edit: und es tritt schon beim ersten Schleifendurchgang auf



  • Mit welchem System habt ihr denn die Textdatei erstellt?
    Schon mal fopen mit "rb" probiert?

    Und &stringPfad[0] ist gleichbedeutend mit stringPfad . Ohne & und []



  • stimmt ... wenn man schon so viele stunden vor dem bildschirm sitzt, erkennt man nicht immer gleich alles 😉

    mit "rb" funktioniert es leider auch nicht und die txt ist mit wordpad erstellt



  • Und mit einem Leerzeichen vor dem %s ?
    fscanf(Datei," %s",stringPoly);

    Läuft das Code::Blocks unter Linux?



  • Schon bei K&R ist nachzulesen, dass Leerzeichen und Tabs in scanf Formatstrings ignoriert werden.



  • flomo's Daten sind zu lesen:

    // Demo to read xy.csv
    // 2011jun28
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct polygon1
    {
    	char xvalue[9];
    	char yvalue[9];
    }stringPoly[7];
    
    FILE *datei = NULL;
    
    int main()
    {
    	int check;		// how many strinds/char-arrays are read	 
    	if (!(datei = fopen("xy.csv", "r")))
    		printf("can not read the file!\n");
    	else
    	{
    		for( int i = 0; i < 7; i++)
    		{
    			check = fscanf(datei, "%s %s \n", stringPoly[i].xvalue, stringPoly[i].yvalue);
    			printf("read data: %d  ", check);	// 2 if this sample works fine 
    			printf("%12s %12s\n", stringPoly[i].xvalue, stringPoly[i].yvalue);
    		}
    	}
            fclose(datei);
    }
    

    Die Rückgabewerte von fopen und fscanf geben schon mal Hinweise, wenn es klemmt.
    Warum findet man das so selten in den Beispielen im Netz?

    Aber seine Zeilen 4 bis 11 sind ein wenig unübersichtlich. <- Mein Eindruck

    MfG f.-th.


Anmelden zum Antworten