Problem mit fseek/ftell



  • FILE *stream;
    
    	if((stream=fopen(filename,"r"))==NULL)
                  return 0;
    
            fseek(stream,NULL,SEEK_END);
            *len=(int)(ftell(stream)/50L);
    	fseek(stream,NULL,SEEK_SET);
    

    Das ist ein Teil meiner Funktion.
    ich lese aus einer TXT Datei mit einer Zeilenbreite von 50 Zeichen und einer ubekannten anzahl von zeilen.
    Ich will hiermit die Zeilenanzahl in dieser TXT bestimmen.
    Bekomme jedoch beim debuggen eine access violation bei der zeile *len....
    Kann mir iener sagen was ich falsch mache?



  • wenn len ein int ist, muss es nur "len=" heißen.
    wenn len ein pointer ist, dann muss es "*len=" heißen.

    sind alle deine zeilen 50 zeichen lang? nein? dann ist dein code falsch.
    guck dir fgets() an



  • zeigt len denn auf gültigen speicher?

    btw: NULL ist für Zeiger, fseek will nen long. Hat jetzt zwar nichts mit dem Problem zu tun weil NULL eh 0 ist aber prinzipiell ist das falsch.



  • len ist ein zeiger auf int.
    hmm hab jetzt nachgeguckt. die zeilen sind 48 zeichen lang inkl leerzeichen!

    habe immer den fehler access violation at 0x.... write of address 0x0.



  • das ist schon merkwürdig. wenn ich das programm ohne debugger ausführe läuft es wunderbar. arbeitet auch richtig mit *len.
    aber wenn ich mit dem debugger schritt für schritt den code durchgehe hört der bei der zeile mit *len auf. 😕



  • *len ist ein fehler und da wunderst du dich, dass es kracht? wie bist du denn drauf?

    klar gibts zwischen mit und ohne debugger unterschiede. das teil hängt sich ja in den programmfluss ein. da ändern sich schon ein paar adressen und wenn du hier wild in die pampa pointerst, muss es irgendwann mal passieren.



  • aha und wie kann ich es anders machen?
    mit fgets die zeilen auslesen bis eof??
    ich will ja nur die anzahl der zeilen bestimmen. ja und die breite der zeilen ist konstant!

    edit:
    muss noch erwähnen das nur in dieser funktion der wert für *len gesetzt wird.
    in anderen funktionen wird davon nur gelesen.es muss schon ein zeiger auf int sein.
    die frage ist ob man es eleganter lösen kann ohne "wild in die pampe zu pointern".



  • char temp[50];
    
            fp=fopen(argv[1],"r");
    
            while(!feof(fp))
            {
            fgets(temp,50,fp);
            i++;
            }
    

    in i steht dann meine zeilenanzahl.
    jetzt habe ich aber unnötig die zeilen in temp eingelesen.

    etwas weiter im code mach ich das schon mit fscanf. fällt mir leichert so den inhalt in eine struktur reinzubringen.


Log in to reply