Newbieproblem mit "fscanf"



  • Hallöchen.

    Ich bin ein blutiger Anfänger und beschäftige mich gerade mit C und C++...

    Ich möchte gerne ein Programm schreiben, was aus einer Datei Zahlen einliest und die dann sortiert (beispielsweise mit bubble sort).

    Mein Problem ist folgendes, ich möchte den ersten Wert ja einlesen und mit dem zweiten vergleichen. Aber es gelingt mir immer nur den 1. Wert einzulesen, beim zweiten bekomme ich eine Zahl "-8457673" geliefert, weil der Zeiger sicherlich nicht an die Stelle geht an die ich möchte nämlich an den Zeilenanfang der nächsten Zeile.

    Also die Textdatei sieht so aus:
    130
    12
    345
    23033

    etc. ich schaffe es dann nur die 130 auszulesen, mehr nicht.
    Also ich weiss nicht wie ich "Lies die erste Zahl ein und gehe dann in die nächste Zeile und lies die 2. Zahl ein und vergleiche" realisiere! Oder muss ich die ganzen Werte erst komplett in ein Feld einlesen und dann vergleichen?! *no Plan* 🙂

    Danke schonmal für eure Lösungen.

    -dis-



  • Hallo,
    wie liest Du denn GENAU aus der Datei...???
    fscanf hat so seine tücken, weshalb ich lieber binär (also mit fread und fwrite) Dateien öffne...

    zu fscanf:
    das wichtigste bei diesem "tollen" befehl ist, das Trennzeichen zwischen den einzelnen Werten nicht zu vergessen. Bei Dir wäre es wohl das "enterzeichen \n".
    Üblich ist eigentlich Tabulator oder Semikolon (z.b.: bei .csv-Dateien)

    Probier doch mal folgenden Befehl:

    fsanf(*fp, "%i\n", &i);   // Zahl auslesen
    printf("ausgelesene Zahl: %i\n", i);  // ausgelesene Zahl anzeigen lassen
    

    Ich denke, so wird es auf jeden fall funktionieren - wenn nicht, dann poste mal den Code...

    Gruß
    Poolplayer



  • Also mit dem was du mir geschrieben hast, so ähnlich habe ich das auch gemacht, nur nicht mit einer Variablen i, sondern mit einem Feld. Ich habe mal deine Variante ausprobiert, aber so ging das auch nicht... Also das erste Zeichen zeigt er mir noch an, da kommt die 130 und wenn ich dann i, bzw den Zeiger von i inkrementiere, dann komm ich irgendwo im Speicher hin, aber nicht auf die nächste Zahl, das ist ja mein Problem was ich habe!

    Hier mal mein Programm, um erstmal nur Zahl für Zahl einzulesen, die Schleife fehlt noch, weil ich ja eben nicht weiss, was ich inkrementieren muss:

    void main()
    {
    
        FILE *dz;
        int Dezimal[20];
    
     if((dz=fopen("unsort.txt","r"))==NULL)
        {
            printf("\aFile not found! \n");
        }
        else
        {
    
            fscanf(dz,"%d \n", Dezimal);
            printf("%d \n",Dezimal[0]);
    
        }
    
    fclose(dz);
    }
    

    Es wird mir dann die 130 ausgegeben, aber wenn ich statt "Dezimal[0]" "Dezimal[1]" eingebe, also die eigentlich die nächste Zahl die ich will aus der Datei, kommt wüstes Zeug raus...wie realisiere ich, dass ich praktisch Zahl 130 an die erste Stelle des Feldes schreibe, Zahl 2 an die zweite Stelle des Feldes usw.? Also was muss inkrementiert werden?! Oder funktioniert mein Ansatz in der Form nicht?

    -dis-

    [ Dieser Beitrag wurde am 10.05.2003 um 22:27 Uhr von Disgrace editiert. ]



  • also das hier funzt bei mir wunderbar:

    int zahl;
    FILE *datei = fopen("zahlen.txt","r"); //die datei hat gefälligst du existieren =)
    
    while(fscanf(datei, "%d", &zahl)==1)        
       printf("%d\n", zahl);
    
    fclose(datei);
    

    anstatt die zahlen direkt auszugeben würdest du halt die werte in nem array speicher sortieren und dann erst ausgeben...
    also etwa:

    int zahlen[100]; //ich gehe einfach davon aus das maximal 100 zahlen im file stehen
    int i=0;
    FILE *datei = fopen("zahlen.txt","r");
    
    while(fscanf(datei, "%d", zahlen+(i++))==1);
    
    fclose(datei);
    

    [ Dieser Beitrag wurde am 10.05.2003 um 22:59 Uhr von japro editiert. ]



  • Hey Japro...

    Vielen Dank, dann probiere ich das mal so. Das ist genau das was ich brauche. Ich wusste nur nicht ob es das auch wirklich tut. Dann kann ich mich ja jetzt an die Sortierfunktion ran wagen...

    Ich meld mich nochmal falls es immernoch nicht geht...

    Vielen Dank, dass ihr mit den Fragen eines Grünlings so nett umgeht 😃

    -dis-



  • Weil mich die Funktion fscanf schon öfters generft hat, habe ich das Beispiel von japro noch mal eingegeben und ausporbiert... und ein wenig erweitert

    #include <stdio.h>
    #include <conio.h>
    
    int main()
    {
      int zahl;
      FILE *datei = fopen("zahlen.txt","r"); //die datei hat gefälligst du existieren =)
    
      if(!datei)
        {
          printf("Die Datei konnte nicht geöffnet werden\n");
          getch();
          exit(0);
        }
    
      while(fscanf(datei, "%i;", &zahl)==1)
        printf("%i\n", zahl);
    
      fclose(datei);
    
      getch();
      return 0;
    }
    

    Im Formatstring von fscanf habe ich "%i;" geschrieben - das wäre eine mit Semikolon getrennte Datei. japro hat nur "i" benutzt, was wohl funktioniert, wenn man die einzelnen Zahlen in verschiedene Zeilen schreibt. Ich würde trotzdem dazu tendieren, das Schlußzeichen anzugeben. In Deinem Fall "%i\n" OHNE Leerzeichen! Sonst kann es wieder Probleme geben - vorallem wenn Du mal zwei Zahlen gleichzeitig auslesen willst

    fscanf(datei, "%i\n%i\n", &i1, &i2);
    

    Das mußte ich jetzt noch los werden... 😉

    Gruß
    Poolplayer



  • alles Blödsinn, mit fscanf spricht man den Scanner an, wie der Name ja schon sagt.



  • Original erstellt von <Börni>:
    alles Blödsinn, mit fscanf spricht man den Scanner an, wie der Name ja schon sagt.

    Was ist das denn für ein Müll ?? fscanf dient zum formatierten Einlesen von Daten aus einem Strom bzw. Stream (der z.B. eine Datei sein kann).

    Wenn man sich allgemeine Syntax von fscanf mal anschaut:

    int fscanf( FILE* Stream, const char* format, ... );
    

    dann kann man wohl schon erkennen, dass man damit nicht den Scanner anspricht 😉

    Ausserdem kennt ANSI-C (Gruß an Shade 😉 ) keinen Scanner.



  • Reingefallen! Don't feed the troll(s)! (Themen rund...) scanf geht nicht 😞



  • muhahahaha ... alt



  • Original erstellt von Dill:
    muhahahaha ... alt

    Wieso? Es fällt immer wieder einer drauf rein.



  • .. und den rest nervts ... wie diese sinnlose diskussion hier



  • Naja auch ne Variante einen Thread ein wenig unübersichtlicher zu machen! 😃

    Ich habe es bereits gestern hin bekommen, auch das mit bubblesort, vielen Dank für Eure Hilfe.

    -dis-


Anmelden zum Antworten