fread und filepointer



  • Hallo zusammen

    ich habe eine .dat datei, die ich einlesen moechte. Die Datei ist so aufgebaut, dass ich zuerst einen Integer in der Datei stehen habe der mir sagt wieviele Punkte in der Datei stehen. Danach kommen Punkte(3 Dimensionen) und Normalen (nochmal 3 Dimensionen, daher N*6). Danach wiederum kommt eine Integerzahl, die mir sagt wieviele faces ich in der Datei habe und es folgen die Faces.
    So, das Problem ist jetzt dass ich zwar die Punkte und Normalen einlesen kann, nicht aber die Faces. Und ich weiss nicht wieso. Liegt das vielleicht daran dass der Filepointer schon weiter ist als ich denke?

    Hier mal Programmcode:

    FILE * fp = fopen(cName,"rb");
    	if (!fp)
    	{
    		printf("Could not open file");
    		exit(1);
    	}
    
    	int N;
    	int M;
    
    	fread(&N,1,1,fp); //lese Anzahl der Punkte ein
    	fseek(fp,0,SEEK_SET);
    	int count = fread(&N,sizeof(int),1,fp);
    	printf("%i %i %i %i\n",N,feof(fp),ftell(fp),count);
    	float * buf = new float[N*6]; //reserviere Speicher fuer 3d Punkte und ihre Normalen
    	count = fread(buf,sizeof(float),N*6,fp);
    	printf("%i %i %i %i %i\n",N*6*sizeof(float),count,ferror(fp),feof(fp),ftell(fp)); // <--- bis hierher funktioniert alles
    
    	fread(&M,1,1,fp); // <---- aber schon dieser Aufruf hier liefert Mist,
     //da muesste eigentlich die Anzahl Faces drin stehen, es steht aber eine Zahl mit ueber einer Million drin
     //(die Anzahl Faces sollte bei ca. 130.000 liegen). 
    	int count1 = fread(&M,sizeof(int),1,fp);
    	printf("%i %i %i %i\n",M,feof(fp),ftell(fp),count1);
    	int * buf1 = new int[M*3];
    	count1 = fread(buf1,sizeof(int),M*3,fp);
    	printf("%i %i %i %i %i\n",M*3*sizeof(int),count1,ferror(fp),feof(fp),ftell(fp));  //ferror liefert einen Fehler
    

    Vielleicht weiss von euch jemand woran das liegt?



  • In welcher Form stehen denn deine Daten in dem File? (sprich: stehen dort lesbare Zahlen? oder hast du in der Datei eine binäre Darstellung? Im ersten Fall solltest du eher fscanf() verwenden als fread())



  • Es ist eine binaere Datei.



  • Vermutlich hast du die falschen Parameter an fread() gegeben - du liest ein Byte ein und schreibst es in einen Teil deiner int-Variablen (und int ist ein ganzes Stück größer). Versuch's mal mit folgendem Aufruf:

    fread(&N,sizeof(int),1,fp);
    

    (PS: Noch besser wäre es, wenn du auf fstreams umsteigst)



  • Dankeschoen! Jetzt passts!


Log in to reply