Implementation von int fseek(FILE* stream,long offset ,int origin)
-
plasticKarma schrieb:
Kann mir jemand sagen, wie fseek() implementiert ist? (Ist das von Compiler zu Compiler verschieden?).
Die Implementation ist nicht spezifiziert.
Ich würd mal spekulationshalber sagen, falls es ein Binärstream ist, hast du gute Karten, bei Textstreams eventuell nicht, wobei das vom OS abhängt.
-
Wobei eine OS spezifische Lösung das performanteste ist... (File in den Speicher mappen)
Du kannst aber auch einfach den Puffer des streams ziemlich gross machen, dann hast du auch recht wenige Festplattenzugriffe und musst nicht die größe der Datei rausfinden.
-
oder z.B. die dateigröße z.B. mit stat() auslesen
-
Also es ist lang lang mit c her bei mir aber ich glaube du kannst deinen Array so nicht deklarieren. Ein C Compiler meldet dir da einen Fehler da die Grösse bei dem compilieren bekannt sein muss. Also entweder du arbeitest mit einem Zeiger ( char * ) oder mit malloc. Wobei ich den Operator new bevozugen würde.
Stimmt. Ich benutze gcc. Wenn ich es mit -ansi -pedantic kompiliere, dann bekomme ich eine Warnung.
oder z.B. die dateigröße z.B. mit stat() auslesen
Gehört stat() nicht zu Linux? Ich benutze SuSE, aber ich hätte es schon gerne plattformunabhängig. (Zur Not könnte ich auch darauf verzichten, wenn eine plattformspezifische Lösung einen großen Vorteil bieten würde)
Ich würd mal spekulationshalber sagen, falls es ein Binärstream ist, hast du gute Karten, bei Textstreams eventuell nicht, wobei das vom OS abhängt.
Wo würde denn bei fseek der Unterschied bei der Behandlung von Binärstreams und Textstreams liegen (Ich bin nicht sehr versiert in diesen Dingen)?
-
plasticKarma schrieb:
Stimmt. Ich benutze gcc. Wenn ich es mit -ansi -pedantic kompiliere, dann bekomme ich eine Warnung.
Ne, ist Blödsinn.
kompiliere halt mal mit -std=c99 oder so.
VLAs sind erlaubt.Wo würde denn bei fseek der Unterschied bei der Behandlung von Binärstreams und Textstreams liegen (Ich bin nicht sehr versiert in diesen Dingen)?
Unter Linux gibt es keinen, aber zB unter Windows besteht ein \n in wirklichkeit aus \r\n (also 2 chars). Da tut man sich mit dem seeken natürlich schwerer, als wenn man garantieren kann, dass ein gelesenes Byte auch einem 'echten' Byte entspricht...
-
stat() funktionirt auch mit dem MinGW Compiler, soweit ich mich erinnere...
-
-Foo- schrieb:
stat() funktionirt auch mit dem MinGW Compiler, soweit ich mich erinnere...
stat() ist eine Funktion die nicht im C Standard enthalten. Viele Compiler kennen sie, weil es logisch und gut ist, sie zu kennen (oder eine Variante davon), aber es ist eben kein Standard.
-
Ich glaube wir sind von dem Thema abgekommen.
Also ich würde es so machen :
FILE * fp; int size = 0; char * ptr; if ( (fp = fopen("test.txt","rb")) == NULL ) return; fseek(fp,0,SEEK_END); //Zeiger auf dateiende size = ftell(fp); //Grösse der Datei ( Bedenke das oben angesprochene Problem ) fseek(fp,0,SEEK_SET); ptr = malloc(size +1 ); fread(ptr,size,sizeof(char),fp); ptr[size + 1] = '\n'; // Das muss man glaube wegen dem Carriage Return machen (Glaube ich ) printf("Groesse : %i ",size); printf("%s",ptr); fclose(fp); free(ptr); // Auf jeden Fall freigeben
-
eine kleine Bemerkung am Rande: überprüfe immer, dass malloc kein NULL zuückgibt, sonst ...
-
Normal sollte man auch noch das fopen(......) auf null prüfen. Aber ich wollte mich halt kurz fassen.