Zeilenlaenge?



  • Hi,

    hätte folgendes Problem, ich muss eine Datei zeilenweise auslesen, das mach ich mit fgets, das Problem ist aber dass ich vorher nicht weiss wie lang die Zeilen sind, d.h. sie können beliebig lang sein. Ich kann also vorher keinen genauen Puffer einstellen.

    Ich hab mir jetzt überlegt dass ich vorher die komplette Zeile mit getc durchgehe und die Zeichen zähle bis zum newline zeichen, und dementsprechend immer den puffer anpasse. Nachteil ist natürlich dass das ganze dann wieder recht umständlich wird da ich dann immer wieder den Lesezeiger verschieben muss.

    Daher wollte ich mal nachfragen ob jemand vielleicht eine bessere Idee hat, oder es vielleicht sogar eine Funktion gibt die direkt die Länge einer Zeile wiedergibt.



  • Du könntest die Zeilen auch in kleineren Etappen einlesen und anschließend per strcat() und Co. zusammenkleben.



  • http://c-plusplus.net/forum/viewtopic-var-t-is-191078.html wäre eventuell für dich interessant (ab Seite 3).



  • Jo wäre auch ne möglichkeit, aber glaube die wäre noch komplizierter, da ich da nochmal den halben code umschreiben müsste.

    @supertux

    ich schau es mir mal an 😉



  • Hab mich jetzt entschieden einfach die gesamte Datei einmal durchzugehen, die Zeichen jeder Zeile zu zählen und je nachdem welche die längste Zeile war, ein Puffer Array zu erstellen.

    Jetzt klappt das alles nur nicht so ganz.

    Zunächst einmal müsste ich ja ein char array erstellen.

    int size =5; // angenommen die längste Zeile ist 5 Zeichen lang gewesen
    char *puffer;
    
    puffer = (char *)malloc(size*sizeof(char)); // richtig so?
    

    Das ganze muss dann noch an verschiedene Funktionen weitergegeben werden z.B.
    an fgets():

    FILE *datei
     while(fgets(puffer, size, datei)){
    // mache dies und das
    }
    

    Nur klappt das alles nicht so ganz, kann mir vielleicht jemand sagen wo der Fehler liegt?

    EDIT: Ich glaub ich weiss woran es liegt, ich arbeite auch noch mit Sachen wie strtok() und soweit ich weiss kann das nicht mit Zeigern arbeiten, hat jemand ne idee wie ich das Problem umgehen könnte? 😞



  • Hast du auch Platz für den Null-Terminator (und eventuell die \n) mitgezählt? Das "Problem" ist, daß einige Funktionen die Größenangabe unterschiedlich handhaben (manchmal mußt du den Platz für die \0 mitzählen, manchmal nicht).

    PS: malloc() solltest du nicht casten (das verschleiert nur Fehler) - und sizeof(char) ist IMMER 1.



  • Das Problem sollte nicht die grösse des Arrays sein, sofern der Code den ich oben geschrieben hab so richtig ist, also die speicher reservierung und die Übergabe an die Funktion, ist mein einziges Problem wohl, das strtok() einfach nicht mit Zeigern (also dynamischen Arrays) arbeitet sondern nur mit konstanten Arrays. Jemand eine Idee wie ich das Problem lösen oder umgehen kann?



  • Klar kann strtok() mit Zeigern umgehen (und ziemlich sicher NICHT mit konstanten Arrays) - allerdings modifiziert es seine Parameter, während es aufgerufen wird.



  • Ok, hast recht, das war das mit den Parametern. Das ist aber nicht so schlimm, da ich das Problem einfach löse indem ich das Puffer Array 2 mal erstelle. Hab den Fehler jetzt mehr oder weniger gefunden, das Programm läuft jetzt auch so halbwegs wieder, nur irgendwas stimmt wohl wirklich noch nicht so ganz mit den Array grössen.


Anmelden zum Antworten