Datei nach Wort durchsuchen



  • Moin, ich bin's nochmal. Die letzte Aufgabe, die ich erledigen muss, beinhaltet das Suchen nach einem Wort in einer Textdatei. Soweit so gut. Dabei MÜSSEN wir die Funktion suchen(FILE* eingabe, char* suchbegriff) implementieren.

    Zz. sieht's so aus:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    int suchen(FILE* eingabe, char* suchbegriff)
    {
    
    }
    
    int main()
    {
    	FILE* Datei;
    	char datei[200];
    	char Wsuchen[200];
    	char* pointer = Wsuchen;
    	fputs("Yo, bitte den Namen der Datei eingeben!\n",stdout);
    	fgets(datei, sizeof datei, stdin);
    	if(datei[0]=='\n'){
    		fputs("Yo, das ist 'ne ungültige Datei, Programm wird jetzt beendet...'\n",stdout);return EXIT_FAILURE;
    	}
    	else{
    	     datei[strlen(datei)-1]='\0';
    		 puts(datei);
    	}
    	if((Datei=fopen(datei,"r")) == NULL) // Datei wird geöffnet
    	{
    	fprintf(stderr,"Yo, ich konnte %s nicht finden, Tippfehler?\n",datei); // Fehlermeldung falls Datei nicht geöffnet werden kann
    	getchar();
    	return EXIT_FAILURE;
    	}
    	fputs("Yo, fehlt noch der Suchbegriff: ",stdout);
    	fgets(Wsuchen, sizeof Wsuchen, stdin);
    	if(Wsuchen[0]=='\n'){
    		fputs("Ungültiger Suchbegriff!!11\n",stdout);
    		return EXIT_FAILURE;
    	}
    	else{
    	Wsuchen[strlen(Wsuchen)-1]='\0';
    	puts(Wsuchen);
    	}
    	suchen(Datei, pointer);
    }
    

    Ich brauch jetzt noch die Funktion, mit der ich in der Lage bin, das Wort zusuchen. Es reicht, wenn er das Wort findet und ausgibt "Wort gefunden", also keine Anzahl oder ähnliches, sehr simpel.
    Meine erste Idee ist gewesen, die Datei einfach in einen String lesen und dann mithilfe strstr den String nach dem Suchwort (auch ein String) zu durchsuchen.
    Gibt's noch 'ne andere Lösung oder wird das dann viel zu komplex?
    Angenommen ich weiß nicht, wie groß die Datei ist (sie umfasst bspw. 20000 Zeichen).
    Kann man irgendwie dynamisch den Speicher für den String in den die Datei eingelesen wird freigeben? Oder gibt's generell noch 'ne einfache Möglichkeit unbestimmt große Dateien so zu durchsuchen?
    Ich sage einfach, weil ich noch nicht sehr lange C mache, erst rund 2 Monate.



  • int suchen(FILE* eingabe, char* suchbegriff)
    {
        size_t length = strlen(suchbegriff);
        int c;
        unsigned counter = 0;
        if (length < 1)
            return 1;
        if (eingabe == NULL)
            return 2;
        while ((c = fgetc(eingabe)) != EOF)
        {
            if ((counter < length) && (c == suchbegriff[counter]))
            {
                if (counter == (length - 1))
                {
                    puts("Suchbegriff gefunden!");
                    return 0;
                }
                counter++;
            }
            else
            {
                fseek(eingabe, -(counter), SEEK_CUR);
                counter = 0;
            }
    
        }
        puts("Suchbegriff nicht gefunden!");
        return 0;
    }
    

    So geht es ohne string.
    Edit: filepointer muss noch zurückversetzt werden.



  • Wow!
    Du hättest mir jetzt nicht alles schreiben müssen, soviel Mühe verlange ich gar nicht, aber vielen Dank. Ich hab's jetzt komplett verstanden.
    Nochmals großes Danke von mir :).



  • Dein "Wow" ist nicht gerechtfertigt.
    Du kannst als Anfänger ÜBERHAUPT NICHT beurteilen, ob Code funktioniert oder nicht.
    Du hast nichts "komplett" verstanden, du hast gar nichts verstanden.
    Du bist ein klassischer Pfuscher JW-Jünger, der alles glaubt, was er irgendwo im Internet findet und schlimmer noch, behauptet, er hätte es verstanden und noch viel schlimmer: mit diesem aufgeschnappten Halbwissen anderweitig irgendwo hausieren geht und ungefragt sinnfreie Behauptungen und Verallgemeinerungen über C von sich gibt.

    Der Bitmapper-Code ist Pfusch, klassischer JW Pfusch,
    - er funktioniert nicht (findet "Barbar" in "Barbara",...)
    - er ist designmäßig Unsinn (macht Ausgaben auf stdout, ist nicht mehrfach aufrufbar,...)
    - er ist implementierungstechnisch Unsinn (verwendet fseek und verwendet keine Stringfunktionen sondern frickelt selber rum)

    Und mit diesem Unsinn beglückst du dann evtl. sogar noch andere (im besten Fall nur deinen Prof) und behauptest, du hättest was verstanden.

    Hier mal eine funktionierende Variante:

    int suchen(FILE* f, char* s)
    {
      char t[100];
      rewind(f);
      while (1 == fscanf(f,"%99s",t))
      if (!strcmp(t, s)) return 1;
      return 0;
    }
    

    Bei solch kurzer Lösung sind natürlich Sonderfälle nicht berücksichtigt (findet nicht "Hugo" in "Hugo."), funktioniert aber PRINZIPIELL, während der Bitmapper-Pfusch PRINZIPIELL NICHT funktioniert.



  • Wutz schrieb:

    - er ist designmäßig Unsinn (macht Ausgaben auf stdout

    So wars gefordert:

    Master450 schrieb:

    Es reicht, wenn er das Wort findet und ausgibt "Wort gefunden"

    Wutz schrieb:

    - er funktioniert nicht (findet "Barbar" in "Barbara",...)

    Das Verhalten kann auch gewünscht sein. Von einer Trennung durch Leerzeichen war nicht die Rede. (strstr findet auch "Barbar" in "Barbara")

    Wutz schrieb:

    ist nicht mehrfach aufrufbar

    Dann erkläre mir bitte wieso deiner mehrfach aufrufbar ist.

    Wutz schrieb:

    er ist implementierungstechnisch Unsinn (verwendet fseek und verwendet keine Stringfunktionen sondern frickelt selber rum)

    Weil der TE nach einer Lösung ohne strings gefragt hat.

    Wutz schrieb:

    Bei solch kurzer Lösung sind natürlich Sonderfälle nicht berücksichtigt (findet nicht "Hugo" in "Hugo."), funktioniert aber PRINZIPIELL, während der Bitmapper-Pfusch PRINZIPIELL NICHT funktioniert

    Das hört sich alles so an, als wolltest du zwanghaft meinen Code schlechtreden, aber deine Argumente sind unsinnig.



  • Du hast keine Ahnung von C, halt die Klappe und trolle dich dorthin, wo du hergekommen bist.
    Du hast nicht nur keine Ahnung von C sondern auch nicht von Deutsch, es war nach Worten gefragt und nicht nach Beginnbuchstabenfolgen.



  • Ui, hat da mal wieder einer vom Chef auf die Mütze bekommen?

    @topic: Zuerst sollte geklärt werden was ein Wort ist. "Hans" ist ein Wort. Ist "Hans-Jürgen" auch ein Wort oder sind es zwei Wörter ("Hans" und "Jürgen")? Ist "123" ein Wort? Ist "Master450" ein Wort, oder wäre das "Master"?



  • - er ist implementierungstechnisch Unsinn (verwendet fseek und verwendet keine Stringfunktionen sondern frickelt selber rum)

    Was wäre denn eine Alternative zu fseek ? Ich dachte eigentlich das dies eine relativ sichere Methode sei, die Dateigröße zu ermitteln, also ans Ende Springen und dann ftell.... ?


  • Mod

    fseek_? schrieb:

    - er ist implementierungstechnisch Unsinn (verwendet fseek und verwendet keine Stringfunktionen sondern frickelt selber rum)

    Was wäre denn eine Alternative zu fseek ? Ich dachte eigentlich das dies eine relativ sichere Methode sei, die Dateigröße zu ermitteln, also ans Ende Springen und dann ftell.... ?

    Das ist nicht, wozu Bitmapper es benutzt. Bitmapper missbraucht es als eine Art Stringverarbeitungsfunktion. Wutz hat mit seiner Kritik daran völlig Recht.


Log in to reply