wie funktioniert fscanf genau?



  • Hi auch

    Kann mir bitte jemand erklären wie fscanf in C genau funktioiert wenn ich beispielsweise folgendeTextdatei einlesen möchte:

    22.12.7882
    12.23.4534
    23.09.1993
    23.12.2000

    Es soll ein Programm realisiert werden welches aus einer Eingabe-Textdatei (s.o.) eine Ausgabetextdatei erzeugt wo alle "." ersetzt werden durch ":" und dabei fscanf benutzt wird.

    Mein Ansatz bisher:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int copyDates(FILE *fin, FILE *fout)
    {
        int i=0;
        char *c;
    
        c=(char*)malloc(11*sizeof(char));
    
        while(fscanf(fin,"%s",c) != EOF)
        {
    
                if(c[i]=='.')
                {
                    fprintf(fout,"%c",':');
                }
    
                else
                {
                    fprintf(fout,"%s",c);
                    i++;
                }
        }
    
    free(c);
    return i;
    }
    
    int main(void)
    {
        FILE *filein=NULL,*fileout=NULL;
        int noDates;
        char outputName[]="ausgabe.txt";
    
        filein = fopen("eingabe.txt","r");
        fileout = fopen("ausgabe.txt", "w");
    
        noDates = copyDates(filein,fileout);
        printf("Datei %s enthaelt %d Daten\n",outputName,noDates);
    
        fclose(filein);
        fclose(fileout);
    
      system("PAUSE");	
      return 0;
    }
    

    Genau an der fscanf-Zeile schmiert die Anwendung ohne Fehlermeldung ab.

    Ich hoffe ihr könnt mir weiterhelfen



  • Wieso ohne Fehlermeldung? Startest du das Programm vielleicht ohne Debugger?

    EDIT: Übrigens musst du auch die Rückgabe von fopen checken. Wenn da NULL zurückkommt, hat das mit dem Öffnen nicht so ganz geklappt und ein Verwenden des Handles ist eher nicht ratsam. 😉



  • while(fscanf(fin,"%s",c) != EOF)
    

    Was möchtest du damit bezwecken? 😕



  • @ _matze:
    Hab die NULL Abfrage eingebaut, kein Fehler.
    Beim Kompilieren und Erstellen der EXE gibt es ebenso keine Fehlermeldung.
    Der Dev C++ Compiler sagt bei der Debugging Meldung bloss "pre-prompted (gdb)"

    Beim Ausführen der EXE wird diese direkt wieder beendet.
    Mit

    system:"Pause"
    

    hab ich dann die Stelle mit fscanf als Fehler herausgefunden.

    zu fscanf (was ich bisher nicht herausgefunden hab):
    liest die Funktion den gesamten Text auf einmal ein oder String für String oder wie scanf nur bis zum ersten Leerzeichen / Zeilenumbruch?

    @ Kóyaánasqatsi:
    Die Eingabetextdatei bis zum EOF einlesen und im Array c ablegen





  • Hi!

    Stefanseiner schrieb:

    Genau an der fscanf-Zeile schmiert die Anwendung ohne Fehlermeldung ab.

    Vermutlich ist fin NULL oder ungültig. Du kommst auch wunderbar ohne malloc aus:

    int a, b, c;
    ...
    while( 0 == feof(fin))
    {
    		fscanf(fin, "%d.%d.%d\n", &a, &b, &c);
    		fprintf(fout, "%d:%d:%d\n", a, b, c);
    }
    fcloseall();
    ...
    

    Gruß,
    c.


Anmelden zum Antworten