Suchen in Datei



  • Deiner ersten Spezifikation 😉 zu urteilen nach willst du doch das!

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    Schreiben()
    {
        FILE *fhd;
        int N;
        char E[100];
        fhd=fopen("text.txt", "a+");
        if( !fhd )
        {
            printf("Datei konnte nicht erzeugt werden!\n");
        }
        else
        {
            printf("Geben Sie die Frage ein.\n");
                    printf("Beenden Sie die Frage mit einem .(Punkt)\n");
                    fflush(stdin);
                    printf(">");
                    gets(E);
                    fputs(E, fhd);
                    printf("Geben Sie die Antwort ein.\n");
                    fflush(stdin);
                    printf(">");
                    fgets(E, 99, stdin);
                    fputs(E, fhd);
                    fclose(fhd);
        }
    
    }
    Lesen()
    {
        FILE *fhd;
        char String[100], Tok[100];
        int Vergleich;
        fhd=fopen("text.txt", "r");
        if( !fhd )
        {
            printf("Datei konnte nicht geöffnet werden.\n");
        }
        else
        {
            printf("Geben sie Ihre Frage ein:\n");
            printf(">");
            fgets(String, 99, stdin);
            fgets(Tok, 99, fhd);
            strcpy(Tok,strtok(Tok, "."));
    		strcpy(Tok,strtok(NULL, "."));
            printf("Antwort: %s\n", Tok);
            fclose (fhd);
        }
    
    }
    int main(int argc, char *argv[])
    {
        Schreiben();
        Lesen();
    
    return 0;
    }
    

    P.S:
    Der erste Aufruf von strtok, der kette1 als erstes Argument hat, bewirkt, dass in kette1 das erste Zeichen gesucht wird, das nicht als Trennzeichen im zweiten Parameter kette2 vorkommt. Falls kein solches Zeichen gefunden wird, dann gibt strtok einen Null-Zeiger zurück. Wenn ein solches Nicht-Trennzeichen gefunden werden kann, dann ist dies der Anfang der ersten Teilzeichenkette.

    Von nun an sucht strtok nach einem Trennzeichen:
    Falls keines gefunden werden kann, dann erstreckt sich die Teilzeichenkette bis zum Ende von kette1 und nachfolgende Aufrufe von strtok werden fehlschlagen. Wenn ein solches Trennzeichen gefunden wird, dann wird es mit \0 überschrieben und somit das Ende der Teilzeichenkette festgelegt. Die Funktion strtok merkt sich den Zeiger auf das nächste Zeichen, von wo aus bei einem Aufruf strtok(NULL,...) die nächste Suche nach einer Teilzeichenkette beginnt.



  • @curry-king
    Langsam solltest du es aber wissen, dass man KEIN fflush(stdin) macht!

    gets() ist übrigens auch ein übler Geselle. Denn mit dieser Funktion sind Bufferoverflows sozusagen schon vorprogrammiert. Verwende lieber fgets() mit stdin als Filestream, dann kannst du die Zeichen begrenzen, die in dein char-Array gespeichert werden und somit verhindern, dass über die "Grenze" hinaus geschrieben wird.



  • Wieso kein fflush?



  • Diamond schrieb:

    Wieso kein fflush?

    FAQ lesen



  • Zudem übergibt man fgets() immer die Größe des Buffers, nicht Größe-1. Dabei sollte man die Größe des Buffers sowieso über Konstanten, defines oder (AJ bitte weghören ;)) sizeof() ermitteln.



  • @AJ, seit dem letzten posting darüber, weshalb man fflush(stdin) nicht verwenden sollte, hat sich dieses Wissen natürlich nicht aus meinem Hirn verflüchtigt. Ich wollte nur zeigen, weshalb der code von Diamond nicht das gemacht hat, was er sollte.



  • Danke Curry-King und die anderen, die Lösung geht gut. Aber du hast da in der main

    int main(int argc, char *argv[])
    

    stehen, wieso das in Klammer? Nutzt du doch nirgends?

    Außerdem ist da das Problem, dass er, egal wie viele Fragen ich eingab, er nur den ersten hinteren Teil ausgibt, also die erste Antwort in der Datei. Soll aber die Antwort passend zur Frage geben, was er nicht tut, egal welche Frage ich eingebe, er gibt mir immer die erste Antwort aus?

    Kenn mich noch nicht mit strtok aus, daher seh ich da ni ganz durch.



  • curry-king schrieb:

    Deiner ersten Spezifikation 😉 zu urteilen nach willst du doch das!

    strcpy(Tok,strtok(Tok, "."));
    		strcpy(Tok,strtok(NULL, "."));
    

    sehr hässlich! Hast du schon probiert, strcpy(buff, NULL) zu machen? was ist, wenn strtok NULL zurückgibt?



  • Kann bitte noch einer helfen? Siehe Ende erste Seite! Bin noch nicht so erfahren und find den Fehler nicht.



  • Hey, nicht so viele, helft doch bitte. Bin noch relativ weit am Anfang ohne riesige Kenntnisse wie ihr, bitte helft!



  • schau mal auf pronix.de und lies dir dort das openbook durch ... ohne zu lesen wirst du kein C lernen ... und solche sachen sind dort gut erklaert ... wenn du das gelesenhast und noch immer fragen hast kannst du sie stellen ...

    gruessle TDO



  • Aha. Hab sogar das Buch von denen, aber jeder hat ma Probs, wo er nicht weiter weiss. Fidne den Fehler nicht, daher frage ich.

    Das ist ein Forum, wo die wissenden denen helfen, die nicht weiterkommen. Sag das in jedem Thread und dsa Forum wird leer!

    Bitte um Hilfe. Komm da nicht hinter!



  • TactX schrieb:

    ... Dabei sollte man die Größe des Buffers sowieso über Konstanten, defines oder (AJ bitte weghören ;)) sizeof() ermitteln.

    Ok, hab weggehört, aber nicht übersehen :D.
    Solange sizeof() mit Hirn eingesetzt wird in Verbindung mit Arrays, hab ich nichts dagegen. 😉

    @Diamond
    Ich hab bisher hauptsächlich nur hilfreiche Beiträge gesehen, auch wenn dein Hauptproblem nicht konkret gelöst wurde. Aber Kleinvieh macht auch mist. D. h. du solltest dir die Tipps, die du bisher bekommen hast und noch bekommen wirst zu Herzen nehmen, denn dadurch kannst du noch einiges lernen. So manche Problemchen lassen sich dadurch auch vermeiden.

    Zu deinem momentanen Problem, empfehle ich dir mal die Benutzung des Debuggers. Früher oder später musst du mit diesem Tool zurechtkommen und es lohnt sich.

    Vielleicht wär auch mal ein Update deines momentanen Quellcodes hier ganz gut.


Anmelden zum Antworten