Beim Einlesen mittels fgetc in nächste Zeile Springen



  • Aloah Forum,

    ich möchte einen Text der Form

    text
    --- unwichtiges zeug ---
    text
    --- unwichtiges zueg ---
    text
    --- ende ---

    einlesen, wobei der "text" immer kürzer ist, als das zwischen "---". Da ich das Programm möglichst laufzeitschonend programmieren möchte, wäre es das Beste, wenn es beim Lesen von "--" sofort in die nächste Zeile springt und dort weiterliest.
    Mein ursprünglicher Versuch war mit Hilfe von fgets, aber das macht in meinem Fall wenig Sinn (aufgrund des Aufbaus der Textdatei).
    Mein bisheriger Lösungsansatz war, dass er mit fgetc die Zeilen durchgeht, beim Lesen von 2x "-" hintereinander den Rest des Codes umgeht und einfach bis zum '\n' weiterliest. Geht das auch direkt?

    Danke euch

    der Dude



  • Was spricht denn gegen fgets()? Du mußt nur die Auswertung abbrechen, wenn du eine Kommentarzeile gefunden hast:

    while(!feof(f)
    {
      fgets(line,LENGTH,f);
      if(line[0]=='-'&&line[1]=='-') continue;
      ...
    }
    


  • Ne sorry, damit hab ich auch folgendes Problem:
    Der einzulesende Text pro Zeile ist deutlich kürzer als die Kommentare. Allerdings müsste ich bei fgets die Länge des längsten Kommentars eingeben um es vollständig zu erfassen. Falls ich dein Bsp. anwende, dann skippt er zwar bei "--", aber macht dann nach der ang. Length weiter (ich will nur den max. Platz für den Text reservieren, nicht für Kommentare).
    Einfaches Bsp:

    01 --- Hier stehen alle Namen, die mir so einfallen ---
    02 Hans Dampf
    03 ...

    Wenn ich jetzt den String 01 einlese, brauch ich die Länge des Strings um ihn ganz zu erfassen, d.h. ich reservier mir Speicherplatz für diese Länge, was in dem Fall auch Sinn macht, bei 02 allerdings Verschwendung ist.

    Mir fällt noch was ein: Wäre es möglich, denn String "Hans Dampf" bei " " zu trennen, so in der Art "explode" wie bei php (übler Vergleich, ich weiß)? Das würde mich auch weiterbringen.



  • der_dude schrieb:

    Ne sorry, damit hab ich auch folgendes Problem:
    Der einzulesende Text pro Zeile ist deutlich kürzer als die Kommentare. Allerdings müsste ich bei fgets die Länge des längsten Kommentars eingeben um es vollständig zu erfassen.

    Nein. Du reservierst dein char-array auf die max. größe eines Namens. Da passen dann auch die ersten n Zeichen eines Kommentars rein und du brauchst ja nur die ersten zwei Zeichen, um herauszufinden, ob es ein Kommentar oder ein Name ist.

    Mir fällt noch was ein: Wäre es möglich, denn String "Hans Dampf" bei " " zu trennen, so in der Art "explode" wie bei php (übler Vergleich, ich weiß)? Das würde mich auch weiterbringen.

    Jap, gibt es. Mit strchr nach dem Leerzeichen suchen und dann mit str[n]cpy rausholen. Siehe Referenz: http://www.cppreference.com/stdstring/index.html

    MfG

    GPC



  • Nein. Du reservierst dein char-array auf die max. größe eines Namens. Da passen dann auch die ersten n Zeichen eines Kommentars rein und du brauchst ja nur die ersten zwei Zeichen, um herauszufinden, ob es ein Kommentar oder ein Name ist.

    Du hast schon recht, allerdings gibt es eben folgenden Nachteil, der es nicht wirklich zufriedenstellend macht:

    ---string1---
    string2

    string1 besteht also aus den Zeichen s[1]1 bis s[1]100
    und
    string2 besteht aus s[2]1 bis s[2]30.
    (Es handelt sich hier nicht um Doppelarrays, Matrizen o.ä. Ich brauch nur zwei Laufindizes 😉 )
    Jetzt reservier ich mir einen String der Länge 30 für string2.
    Wenn ich jetzt die ersten 30 Zeichen des s1 einlese, kann ich überprüfen, ob eben "--" (s[1]0 & s[1]1) drinsteht oder nicht, klar. ABER leider macht er dann nach "continue" bei s[1]30 weiter und liest weiter ein bis s[1]60. Da allerdings greift die if-else-Regel von wegen "--" natürlich nimmer, weil es normaler Text ist.
    Ich hoffe ich konnte mein Problem schildern 😕



  • Habe aufgegeben. Mein String ist jetzt 100 lang und das reicht. Vgl werden
    mit strstr() gemacht und soweit läufts.

    und dann mit str[n]cpy rausholen

    Krieg ich leider nur zum Teil hin. Ich hab das Leerzeichen (bzw. den tab) gefunden und lass mir die Position ausgeben:

    char *c = strchr(string,'\t');
    printf("found at %d\n",c-string+1);
    

    Anschließend kopier ich aus dem String bis zu dem Leerzeichen den Teil raus

    strncpy(cFrom,string,c-string+1);
    

    Aber wie schaffe ich es jetzt, dass ich den Teil vom Leerzeichen bis zum Ende des Strings (bzw. bis '\n') auch noch in einen zweiten String bekomme?



  • Ich hätte da noch eine Möglichkeit, wie du es machen könntest:
    Wenn du einen Kommentar entdeckst, liest und verwirfst du anschließend alle Zeichen bis zum Zeilenende:

    if(line[0]=='-'&&line[1]=='-')
    {
      while(fgetc(f)!='\n');//Rest der Zeile entsorgen
      continue;
    }
    


  • Danke dir, hab ich auch probiert, produziert aber irgendwie genausoviel Code, wie ein größerer Array Platz brauchen würde, also hätte ich mir die ganze Action (Mo bis heute) eigentlich auch gleich sparen können 😡

    Zum anderen Problem, wie man den Rest des Strings noch kopiert:

    char teilEins[GROSS_GENUG];
    char teilZwei[GROSS_GENUG];
    c = strchr(string,'\t'); //Suche den Tab
    strncpy(teilEins,string,c-string+1); //Kopiere bis zum Tab in teilEins
    teilEins[c-string+1]='\0'; //Schliesse teilEins ab
    strcpy(teilZwei,c+1);	//Kopiere den Rest in teilZwei
    

    Danke für eure Hilfe. Ich hätte aber nochmal eine Frage (ich weiß, es hört nie auf):

    Ich habe jetzt einen String (char string[5]). Gibt es eine Funktion, die mir automatisch alle von NULL verschiedenen chars aus dem String ausgibt und/oder mir sagt, wieviele solche Chars in dem String enthalten sind. Er ist ja immer 5 groß, muss aber nicht unbedingt 5 Chars enthalten.



  • strlen() ... danke trotzdem 😉



  • Wenn du davon ausgehst, daß mit dem ersten '\0'-Zeichen dein String zu Ende ist, kannst du dir per strlen() die Anzahl der Zeichen und per printf() den Inhalt des Strings ausgeben. Andernfalls benötigst du eine Schleife:

    for(i=0;i<size;++i)
      if(str[i]!=0)
        ++count; /* bzw. */ printf("%c",str[i]);
    


  • Stimmt, falls zwischendurch Lücken sind. Ist bei mir nicht der Fall, aber danke trotzdem. Schönes WE!


Anmelden zum Antworten