Alternative zu fgets()?



  • Hallo
    und schon wieder eine Frage.
    Der Inhalt einer Datei soll komplett ausgelesen und danach durchsucht werden.

    Für den ersten Teil des Problems empfehlt sich IMHO folgendes.

    char in[256];
    FILE *Datei
    Datei = fopen("xxx.txt", "r");
    while(!feof(Datei))
    {
    fgets(in, 255, Datei);
    }
    

    Soweit sogut. Zum Duchsuchen hatte ich eigentlich find() angedacht.
    Da es sich bei in aber um einen char-Array und keinen String handelt, wird das nichts. Ich find die Lösung durch diesen Array sowieso sehr sehr statisch (und Platzverschwenderisch).

    Ich habs auch bereits mit ifstream un Kombination mit getline versucht, was auch soweit klappte, allerdings habe ich dafür noch keine Möglichkeit gefunden, mehr als eine Zeile auszulesen...

    Danke & Mit freundlichen Grüßen
    Guestk5



  • zu dem c teil kann ich dir folgendes empfehlen. du liest so ein, wie du das gesagt hast, dann kannst du mit strstr substrings in einem char array suchen.



  • zu dem c teil

    Eigentlich will ich damit nicht zuweit in C "reintutschen" und bei C++ bleiben
    Trotzdem ist das ganze halt sehr unflexibel. Wenn die Datei jetzt größer als 256 Zeichen ist, besteht schon ein Problem, statisch einen Array mit Tausenden von Elementen anzulegen, wäre Verschwendung. Man könnte da was mit new machen.
    Im Optimum möchte ich aber ganz von dieser char-Array sache weg, und lieber "richtige" String benutzen.



  • du musst doch immer nur so viele elemente eines (char*) oder eines strings im speicher haben, wie die länge deines gesuchten wortes etc. ist.
    dann immer eines mehr ein zeichen "weiterrutschen", hinten ein neues zeichen einfügen, und vergleichen...

    mfG (c)h



  • du musst doch immer nur so viele elemente eines (char*) oder eines strings im speicher haben, wie die länge deines gesuchten wortes etc. ist.

    Problematischerweise weiß ich ja vorher nicht, wie groß das einzulesende ist.
    Und an die Länge komm ich auch nicht so einfach, wenn ich nur 'nen char-Array habe.

    Gäbe es eine Möglichkeit einen char-Array in string zu konvertieren? Ich dächte da an eine Schleife, die jeweils ein char-Feldelement auusliest und hinten an einen String anhängt..



  • char array[30]="testtesttest";
    strlen(array); // länge des arrays
    

    ich arbeite nicht min "string"s. (jedenfalls nur, wenns sein muss, und dass ist gott sei dank selten der fall)

    du wirst doch wissen, wie viele Zeichen das gesuchte wort hat! oder? jedenfalls wirst du das wort sicher eingeben, und dann kannst du mit strlen die länge erhalten.

    mfG (c)h



  • Hier erst mal der "Aufbau" der Datei:

    Wort1 Wort2 Wort3 Wort4
    Wort5 Wort6 Wort7 Wort8

    Das ganze wird jetzt wie oben eingelesen. Allerdings weiß ich ja vorher nicht, ob in der Datei 1, 10 oder 100 Zeilen stehen, da in die Datei auch geschrieben wird.



  • hast du schon mal etwas von

    feof(FILE*)
    

    oder
    dem rückgabewert von

    fgets(...)
    

    gehört?

    damit kann man abrufen, ob das dateiende überschritten wurde. und mit dem fgets, wieviel eingelesen wurde (wenns <=0 ist, kann nichts mehr gelesen werden

    dein prob: fgets arbeitet auch mit (char*) - warum brauchst du umbedingt "string"?

    mfg (c)h



  • Guestk5 schrieb:

    char in[256];
    FILE *Datei
    Datei = fopen("xxx.txt", "r");
    while(!feof(Datei))
    {
    fgets(in, 255, Datei);
    }
    

    Du solltest in der fgets()-Zeile schon 256 eintragen. Du willst doch kein wertvolles Byte verschwenden 😉



  • TactX schrieb:

    Guestk5 schrieb:

    char in[256];
    FILE *Datei
    Datei = fopen("xxx.txt", "r");
    while(!feof(Datei))
    {
    fgets(in, 255, Datei);
    }
    

    Du solltest in der fgets()-Zeile schon 256 eintragen. Du willst doch kein wertvolles Byte verschwenden 😉

    😮 😮 😮
    wo willst du dann das \0 hinschreiben?!?!?!?! 😕

    mfG (c)h



  • man fgets(3) schrieb:

    fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A '\0' is stored after the last character in the buffer.

    Alles klar?



  • warum brauchst du umbedingt "string"?

    Für die find()- Sache. Da mir "string" ja zur Verfügung steht, sehe ich keinen Grund, es nicht zu benutzen, da es den Rest auch erleichtert.

    Du solltest in der fgets()-Zeile schon 256 eintragen. Du willst doch kein wertvolles Byte verschwenden

    Bin davon ausgegangen, dass das \0 irgendwo noch gespeichert werden muss...

    damit kann man abrufen, ob das dateiende überschritten wurde. und mit dem fgets, wieviel eingelesen wurde (wenns <=0 ist, kann nichts mehr gelesen werden

    Soweit klar...dafür ja die Schleife. Aber damit ist das Array-Größen-Problem noch nicht gelöst.
    Hättest du evtl. mal ein Code-Listing damit ich mir das besser vorstellen kann?



  • Ich hab mal ein kleines Prog geschrieben das anliche sachen macht, aber nicht mit strings oder Zeichenketten arbeitet sonder mit bytes...sollte jedoch fur Strings auch funktionieren.

    Ich will vorwegnehmen, dass ich C/C++ Anfanger bin, also bitte nich gleich flamen, wenn's Scheisse ist.

    FILE *fin;
      char* pFindPos;    
      char* pSearchStart;  
    
      // Die gesuchte Zeichenkette
      char* flag = "find this";
      int flagLength = strlen(flag);
    
      // open file for read/binary
      if (!(fin = fopen(inputFileName, "rb"))) return 1;
    
      // get file length
      fseek(fin,0,SEEK_END);
      length = ftell(fin);
      fseek(fin,0,SEEK_SET);
    
      // read in Buffer
      char * pfileBuffer = new char [length];
      fread(pfileBuffer,1,length,fin);
      fclose(fin);
      pSearchStart=pfileBuffer;
    
      //Alle byte-Folgen finden:
      while ( pFindPos = findSequence (pSearchStart,length,flag,flagLength)) 
      {
         //Byte-Folge gefunden
         ...
    
         //Neue Startposition und Lange des gesuchten Bereiches setzten.
         pSearchStart = pFindPos;
         length -= (int)(pFindPos-pSearchStart);
    
      }
    
      delete [] pfileBuffer;
    

    Search-Funktion:

    char* findSequence (char* findInHere, int findInHereLength, char* findThis, int findThisLength) {
    
      // finds a sequence of bytes in memory
      // returns a pointer to the first occurance of 'findThis' or NULL
      if (findInHere && findThis) {
         for (int i=0;i < (findInHereLength-findThisLength+1);i++) {
            if (findInHere[i]==findThis[0]) {
               if ( findThisLength > 1 ) {
                  for (int j=1;j<findThisLength;j++) {
                     if (findInHere[i+j]==findThis[j]) {
                        if (j == (findThisLength - 1)) { return findInHere+i; }
                     } else { j =  findThisLength; }
                  }
               } else { return findInHere+i; }    
            }
         }
      }  
      return 0;
    }
    


  • ach Misst, ich kann meinen Beitrag nicht editieren...

    ich hab bloderwieser wichtingen code rausgeschnitten:

    [cpp] //Neue Startposition und Lange des gesuchten Bereiches setzten.
    findPos += flagLength;
    pSearchStart = pFindPos;
    length -= (int)(pFindPos-pSearchStart);
    [/cpp]


Anmelden zum Antworten