Was ist der Unterschied zwischen fgetpos/fsetpos und ftell/fseek? Wofür sind Fgetpos und Fsetpos gut?fgetpos/fsetpos und ftell/fseek
Antwort
Nun, von der Manpage können wir sehen, dass ftell und fseek long int verwenden, um Offsets (Positionen) in einer Datei darzustellen, und daher auf Offsets beschränkt sein können, die in einem langen int dargestellt werden können. (Der Typ long int garantiert nicht, dass Werte größer als 2 ** 31-1 enthalten sind, wodurch der maximale Offset auf 2 Gigabyte begrenzt wird). Die neueren Funktionen fgetpos und fsetpos verwenden andererseits einen speziellen Typdef, fpos_t, um die Offsets darzustellen. Der Typ hinter diesem Typdef kann, wenn er richtig gewählt wird, beliebig große Offsets darstellen, so dass fgetpos und fsetpos mit beliebig großen Dateien verwendet werden können. fgetpos und fsetpos zeichnen auch den Zustand auf, der Multibyte-Streams zugeordnet ist.
** Diese Antwort ist falsch! ** Wenn Sie nur nach '2 ** 31-1' suchen wollen, dann gibt es 'fseeko'. Die richtige Antwort ist, dass 'fgetpos' nur nach einer Position suchen kann, die zuvor von' fgetpos' erhalten wurde und dass 'fpos_t' ** nicht ** als ganze Zahl interpretiert werden muss, wie die man-Seite sagt: * UNIX-Systeme, ** ein fpos_t-Objekt kann ein komplexes Objekt sein ** und diese Routinen können die einzige Möglichkeit sein, einen Text-Stream portabel neu zu positionieren. * – Mecki
@Mecki Ja, diese Antwort ist falsch. Soweit ich verstehe, ist meine Antwort unten die einzig richtige. – HughHughTeotl
Nein, die Antwort ist nicht inkorrekt, aber nicht ausreichend. Es gibt korrekt die Grenzen von "fseek" und Freunden an und es sagt richtig, dass 'fgetpos' und Freunde eine Option sind, die solche Grenzen nicht hat. Die obige Antwort besagt niemals, dass man 'fseek' und' fsetpos' und Firends mischen kann, was in der Tat gefährlich ist. Außerdem gibt es niemals an, dass 'fpos_t' ein ganzzahliger Typ ist. Stattdessen schlägt Mecki 'fseeko' und firmends vor, die keine ISO-C-Standardfunktionen sind (aber POSIX-Funktionen). – math
Es gibt keinen Unterschied in der Funktionalität, obwohl die Schnittstellen unterschiedlich definiert sind. Beide werden implementiert, da beide Teil von POSIX sind.
Keine der oben genannten Antworten sind richtig - in der Tat, wenn Sie verwenden fsetpos
austauschbar mit fseek
Sie eine Sicherheitslücke vorstellen könnte (https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=20087255).
Der Grund ist, dass das fpos_t *pos
Argument zu fsetpos
nicht wirklich eine ganze Zahl ist, so dass es nicht verwendet werden kann, um beliebige Positionen in einer Datei zu suchen. Die einzigen gültigen Werte sind daher solche, die von fgetpos
erhalten werden. Da die docs sagen
Die interne Indikatordateiposition mit dem Strom zugeordnet ist, zu dem durch
pos
, dargestellten Position eingestellt, die ein Zeiger auf einfpos_t
Objekt , deren Wert zuvor durch einen Aufruf vonfgetpos
erhalten wird.
(http://www.cplusplus.com/reference/cstdio/fsetpos/)
Wenn alles, was Sie die Möglichkeit, beliebigen Orten über 32-Bit-Grenze suchen möchten, dann ftello
/fseeko
verwenden und kompilieren mit #define _FILE_OFFSET_BITS 64
.
Nicht wirklich genaue Antwort auf die Frage, aber sehr gut als Tipp! Vielen Dank! – likern
@likern Dies ist genau die Antwort auf die Frage. Und es ist auch die richtige Antwort, die angenommene Antwort ist absolut falsch, da 'fpos_t' möglicherweise gar keine Ganzzahl ist (der Standard verlangt es nicht). – Mecki
'ftello' und' fseeko' sind POSIX-Funktionen. Darüber hinaus gibt der C11-Standard in 7.2.1.9.1:"die Funktion fgetpos die aktuellen Werte des Parse-Zustands (falls vorhanden) und den Dateipositionsindikator für den Stream wieder, auf den der Stream in dem Objekt zeigt, auf das durch pos " Außerdem: in 7.21.1 es heißt: "' fpos_t' ist ein vollständiger Objekttyp, der nicht ein Array-Typ ist, der alle Informationen erfassen kann, die benötigt werden, um jede Position innerhalb einer Datei eindeutig zu spezifizieren " Jedenfalls zumindest auf meinem System' fpos_t' ist ein '__darwin_off_t', das sich als' __int64_t' herausstellt. Verwenden Sie fsetpos und fgetpos wenn möglich – math
fgetpos() geht mit fsetpos(). Und ftell() geht mit fseek().
fgetpos() sieht praktisch wie ftell() aus, da beide einen FILE * -Parameter haben und beide eine Art Position in der Datei zurückgeben, allerdings mit einem etwas anderen Stil. Aber nimm folgendes: NUR fseek() erlaubt dir, vom Anfang der Datei an deiner aktuellen Position in der Datei und rückwärts vom Ende der Datei zu suchen (das dritte Argument für fseek() ist SEEK_SET, SEEK_CUR und SEEK_END)). fsetpos() tut dies nicht. fsetpos() ist darauf beschränkt, zu einer Position zurückzukehren, die Sie von fgetpos() erhalten haben.
Nehmen wir an, Sie möchten eine Datei in den Speicher lesen. Wie viel Heap benötigen Sie von malloc()? Sie benötigen die Größe der Datei. Und ich habe noch keine Funktion in der C-Standardbibliothek gefunden, die Ihnen die Größe einer Datei sagt, obwohl einige C-Compiler eine nicht-standardmäßige Funktion hinzufügen. Zum Beispiel hatte Borland Turbo C Dateilänge(). Aber ich habe Filength() nicht unter der STANDARD C-Bibliothek gesehen.
Also, was Sie tun können, ist fseek() zu 0 Bytes vor dem Ende der Datei. Verwenden Sie dann ftell(), um die Position in Byte zu ermitteln, und legen Sie die Berechnung für die Menge des Heapspeichers fest.
Was können Sie noch tun, um die Dateigröße zu erhalten?Sie können fgetc() verwenden, um jedes Zeichen zu lesen und zu zählen, bis Sie das Ende erreicht haben. Aber ich denke, mit fseek() und ftell() ist es besser und einfacher.
- 1. SQL Server UND UND ODER UND UND
- 2. Unterschied zwischen - und - oder 'und' oder "und"
- 3. SubSonic "Oder" und "UND"
- 4. "und" und Tail-Rekursion
- 5. SOX und Ein- und Ausblenden
- 6. QOpenGLWidget und glReadPixels und Tiefenpuffer
- 7. Flasche und Skalierung und Gleichzeitigkeit
- 8. Realm: kombinieren "oder" und "und"
- 9. ArrayList und String [] UND Objekt []
- 10. Python wenn Bedingung und "und"
- 11. Schienen und Markdown und Editor
- 12. Jack und Jill und destinationDir
- 13. Excel Multiple IF und UND
- 14. Spring und JSF und JPA
- 15. Kopf- und Fußzeile und Freemarker
- 16. Android und onSaveInstance und Restore
- 17. Hibernate und Transaktionen und Tabellensperren
- 18. „Und“ und „Oder“ auf NSPredicates
- 19. reagieren und setState und Autocomplete
- 20. Codierung und Decodierung mit PHP und JavaScript und Datenattribute Validierungs
- 21. Leistung und Sortierung und eindeutige eindeutige zwischen mysql und php
- 22. Batch-Datei umbenennen und verschieben und Variablen und Dinge
- 23. Mit 'und' und 'oder' Logik mit Dropdown-Menüs und MixItUp
- 24. bash: Umleitung (und hängen) stdout und stderr Datei und Terminal und die richtige Exit-Status
- 25. Warum scheinen NSString und NSLog% C und% lc (und% S und% ls) unterschiedlich zu behandeln?
- 26. Breite und Länge, x und y und Unterschiede beim Plotten: geosphere und ggmap
- 27. User Controls und JavaScript und Masterseiten
- 28. HTTP GET und POST Semantik und Einschränkungen
- 29. WMODE und Flash Video - Stabilität und Leistung
- 30. Gunicorn und Django mit Upstart und Nginx
Siehe http://stackoverflow.com/questions/12119132/ftello-fseeko-vs-fgetpos-fsetpos Die Antwort ist viel besser als die angenommene Antwort hier. – Mecki