fscanf auslese Problem



  • void createFile(FILE *fpSE, char *SudokuEntry)
    {
        fpSE = fopen(SudokuEntry, "w");
        /* ... */
        fclose(fpSE);
    }
    

    Wieso übergibst du fpSE als Parameter? Es macht absolut keinen Sinn.



  • Die Datei habe ich mit Absicht mit Bindestrich davor benannt.

    Oh man klar. Ich Initialisiere jetzt strline mit Null, das war dumm von mir.

    Das stimmt den Filepointer könnte ich neu machen, wurde auch geändert.

    Vielen dank für die schnelle Hilfe!!! 🙂

    Ich hatte mir das ursprünglich so überlegt das mir der fscanf die Zeile durchsucht auf Zahlen und Punkte dann speichere ich wenn er was gefunden hat ab. Danach sucht der 2te fscanf den Zeilenumbruch heraus damit ich mit dem wieder nächsten fscanf die nächste Zeile auslesen kann.

    void readFile(char *SudokuEntry)
    {
        char test[] = "-test.txt";
        FILE *fptest;
        int iner;
        char strline[110]={0}, temp;
    
        fptest = fopen(test, "r");
    
        fscanf(fptest, "%[0-9.]", strline);
        fscanf(fptest, "\n", temp);
        printf("\n---%s---\n", strline);
        printf("\n===%c===\n",temp);
    
        fscanf(fptest, "%[0-9.]", strline);
        fscanf(fptest, "\n", temp);
        printf("\n---%s---\n", strline);
        printf("\n===%c===\n",temp);
    
        fclose(fptest);
    }
    

    Wenn ich das so Löse gibt er mir aber das aus:
    "------
    ===2===
    ------
    ===2==="

    Das sieht so aus als ob das mit dem Zeilenumbruch herauslesen nicht funktioniert. Wie kann ich den das richtig lösen?



  • fscanf() schreibt ja auch nur dann etwas in die weiteren Parameter, wenn du eine Format-Kennung %.. in deinem Formatstring hast (für dich wäre wohl "%c" das richtige Format). Außerdem solltest du dort nicht den Wert von temp übergeben, sondern seine Adresse - sonst bekommst du einen SegFault, wenn du den Formatstring korrigierst.

    PS: Und den Hauptpunkt aus meinem letzten Beitrag hast du auch nicht berücksichtigt: Wenn deine Datei tatsächlich in den Format is, das createFile() erzeug, dann kann das erste fscanf nichts verwertbares finden.



  • Wenn der doch aber in der Zeile wo er dann liest nichts findet ist der Filepointer dann nicht am Ende der Zeile? Oder nur wenn er irgendwas gefunden hat.

    Ich hab mir halt gedacht dass es sogar besser ist wenn das Sudoku in der Mitte der Datei steht da ich dann sowieso erst die relevanten Daten suchen muss. Damit der Benutzer "versehentlich" Zeilen vor dem Sudoku dazu schreiben kann und mein Programm trotzdem später das Sudoku findet.

    Ok das mit dem fehlendem % hab ich verstanden. Der Fehler mit dem fehlenden & habe ich auch korrigiert.

    Die Lösung Funktioniert auch nicht da bringt er mir auch nur ne 2. Das sollte so aber doch möglich sein!?

    fscanf(fptest, "%[\n]", &temp);
    

    Und bei der Lösung liest er mir andauernd nur einen Bindestrich aus u kommt nicht zum Zeilenumbruch.

    do
    {
        fscanf(fptest, "%c", &temp);
        printf("\n___%c___\n",temp);
    }while(temp != '10');
    

    Oder geh ich da ganz falsch ran und ich sollte mein Problem mit irgendwie anders angehen!?



  • bleipumpe schrieb:

    Wenn der doch aber in der Zeile wo er dann liest nichts findet ist der Filepointer dann nicht am Ende der Zeile? Oder nur wenn er irgendwas gefunden hat.

    scanf bleibt bei dem Zeichen stehen, das nicht zur Eingabe passt.
    Wenn du nur Ziffer und Punkt lesen willst, wird bis zu dem Zeichen gelesen das nicht mehr Ziffer oder Punkt ist.

    scanf sucht nicht.



  • Sry wegen der späten Antwort!!

    Aah ok dh ich werde die ganze Zeile auslesen müssen und danach das eingelesene komplett auswerten müssen.

    ich habe das jetzt mal so gelöst und ausprobiert.

    for(iner=0;iner<13;iner++)
    {
        fscanf(fptest, "%[]\[a-zA-Z0-9!-/:-@^-'{-~\t ]", strline);
        fscanf(fptest, "%[\n]", &temp);    //<--
        printf("\n---|%s|---\n", &strline);
        printf("\n===%c===\n", temp);
    }
    

    Da liest er mit dem ersten fscanf die erste Zeile ein und gibt diese auch aus ("-----------") mit dem zweiten gibt er auch einen Zeilenumbruch aus. Aber wenn sich das ganze Wiederholt gibt der erste fscanf immer nur die erste Zeile aus, der zweite fscanf aber trotzdem immer wieder einen Zeilenumbruch. Woran liegt das?
    Wenn ich denn zweiten fscanf so abändere:

    fscanf(fptest, "\n", &temp);
    

    Gibt mir dieser fscanf zwar mittels temp keinen Zeilenumbruch mehr aus (sondern ein Leerzeichen). Aber der erste fscanf gibt jeweils die nächste Zeile aus. Dh der zweite fscanf liest zwar irgendwie den Zeilenumbruch ein aber speichert in nicht in der temp ab.

    Mir ist zwar klar warum beim ersten Beispiel der Zeilenumbruch richtig in temp transferiert wird und im zweiten nicht, aber wieso rutscht der filepointer nur beim 2ten Beispiel weiter u nicht beim ersten?

    Gibt es nicht auch eine einfachere Methode mittels fscanf eine komplette Zeile mit allen Zeichen auszulesen. Oder so viel einzulesen bis der Speicher des angegebenen Strings voll ist?



  • Lerne mal C Programmieren! Und schau Dir mal die Docus zu den STD Funktionen an. Und informiere Dich wie sie funktionieren, was sie machen und was nicht!
    Dann wird sich Deine Frage von selbst lösen!



  • Es gibt zum einlesen nicht nur fscanf. Das f hinten steht da für formatiert.
    Das vordere f steht für File.

    Da du aber die ganze 1. Zeile einlesen willst nimmst du eine andere Funktion. (steht auch in der stdio.h)

    Es gibt auch sscanf. Mit s vorne für String. Damit kannst du aus einem String die Daten einlesen.

    Daher erst komplette Zeile einlesen und dann auswerten.



  • Meinung! schrieb:

    Lerne mal C Programmieren! Und schau Dir mal die Docus zu den STD Funktionen an. Und informiere Dich wie sie funktionieren, was sie machen und was nicht!
    Dann wird sich Deine Frage von selbst lösen!

    Wow!

    Das ist mir eine Nominierung zum "Schund des Monats" wert! Herzlichen Glückwunsch!



  • Pretty schrieb:

    Meinung! schrieb:

    Lerne mal C Programmieren! Und schau Dir mal die Docus zu den STD Funktionen an. Und informiere Dich wie sie funktionieren, was sie machen und was nicht!
    Dann wird sich Deine Frage von selbst lösen!

    Wow!

    Das ist mir eine Nominierung zum "Schund des Monats" wert! Herzlichen Glückwunsch!

    Warum? Nichs als die Wahrheit!



  • Meinung2 schrieb:

    Warum? Nichs als die Wahrheit!

    Auch die vermeintliche Wahrheit (die sich nach näherer Betrachtung mitunter als simple Meinung eines Individuums und nicht als generelles Faktum herausstellen könnte) ist manchmal bei sich selbst besser aufgehoben.

    Nichtsdestotrotz ist dem Fragensteller wahrscheinlich soweit klar, dass er sich in einem Lernprozess befindet (wie fast alle hier) und gerade deshalb wendet er sich (sinnvollerweise) an (zumeist) fachkundige (und größtenteils freundliche) Artgenossen, um den ein oder anderen Tipp zu erhaschen.

    Wenn Du schon zum RTFM'en ermahnst, poste wenigstens einen adäquaten Link dazu!



  • Pretty schrieb:

    Wenn Du schon zum RTFM'en ermahnst, poste wenigstens einen adäquaten Link dazu!

    Bevor das hier ausartet, hier mal ein Link:

    http://www.cplusplus.com/reference/clibrary/cstdio/fgets/



  • Jab bin grad beim C lernen und zwar mit Hilfe dieser Seite.
    http://www.c-howto.de/tutorial-dateiverarbeitung-formatiertes-lesen-schreiben.html
    Und dort wird der fscanf nicht so ausführlich erklärt.

    Was ich zum Zeilenweisen auslesen mit fscanf in Google gefunden hab hatte mir nicht sehr viel weitergeholfen aber jetzt weis ich auch wieso ich kaum was gefunden habe…

    Vielen Dank für die Hilfe, von euch allen! Auch für den Link, werde mich mal an diese Funktion setzen. Und jetzt habe ich auch denn hier gefunden und werde da mal das "c von a bis z" ausprobieren, wenn das empfohlen wird.
    http://www.c-plusplus.net/forum/134691



  • bleipumpe schrieb:

    Und jetzt habe ich auch denn hier gefunden und werde da mal das "c von a bis z" ausprobieren, wenn das empfohlen wird.

    Nein! Bücher und sonstiger Pfusch vom Autor JW wird hier ausdrücklich NICHT empfohlen aufgrund nachgewiesener Inkompetenz und schlichtweg Vermittlung von falschem Wissen.



  • Ääähm das steht direkt als erstes unter „Linkliste für Neulinge“
    http://www.c-plusplus.net/forum/f10
    und da steht "nur":

    "Edit by TactX: Das Buch "C von A bis Z" ist hier schon öfters wegen diverser Fehler aufgefallen. Dies sollte man im Hinterkopf haben wenn man das Buch liest und entsprechend kritisch hinterfragen (gilt natürlich für jede Veröffentlichung)."

    Was sich aber längst nicht so eindeutig wie deine Aussage anhört.
    Das sollte wohl dann eher gelöscht werden, anstatt vorsichtig daraufhin gewiesen.

    Gibt’s da nicht ein Buch wo ziemlich gut ist einfach aber vor allem ausführlich!? unter dem "Linkliste für Neulinge" sind nur immer wieder Bücher und links eingeworfen und teils sofort wieder kritisiert oder Dead-links etz.

    Besonders hilfreich finde ich diesen "thread" nicht!



  • Tue was du nicht lassen kannst.
    Ich gebe dir aber auf deinen Erfahrungstrip mit, dass nicht immer die Top-Google-Treffer die besten sind.
    Hier im Forum gibt es genügend Beiträge zum Suchen nach brauchbaren Links und meist auch eine Bewertung dazu.



  • Das hast du wohl falsch verstanden ich habe nicht dich gemeint sondern ausschließlich diesen „Linkliste für Neulinge“ Thread.

    Hat mir jemand ein Vorschlag für ein Tutorial o.ä.



  • Ich empfehle dir KEIN Online Tutorial.
    Ich empfehle dir ein Buch (sowas aus Papier zum Umblättern) und dabei:

    Prinz/Prinz: "C - Einführung und professionelle Anwendung"
    

    Und wenn es auch in Englisch sein darf:

    Prata: "C Primer Plus 5th Edition"
    

    Ich weiß nicht, was sich Herr "alt!!1 Unregistrierter" in der Linkliste dabei gedacht hat, den JW Pfusch zu empfehlen, wahrscheinlich hat er auch nur Google befragt.
    Noch weniger verstehe ich, warum dieser offensichtliche Pfusch hier von den Moderatoren implizit empfohlen wird.



  • 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);
            }
    

Anmelden zum Antworten