2012-08-25 8 views
10

Was ist der Unterschied zwischen ftello/fseeko und fgetpos/fsetpos? Bei beiden scheint es sich um Dateizeiger-Getting/Setting-Funktionen zu handeln, die undurchsichtige Offset-Typen verwenden, um manchmal 64-Bit-Offsets zuzulassen.ftello/fseeko vs fgetpos/fsetpos

Werden sie auf verschiedenen Plattformen oder nach verschiedenen Standards unterstützt? Ist der Offset-Typ flexibler?

Und übrigens, ich bin bewusst, fgetpos/fsetpos and ftell/fseek, aber das ist nicht ein Duplikat. Diese Frage fragt nach ftell/fseek, und die Antwort ist nicht für ftello/fseeko.

+0

Beachten Sie, dass das von 'ftello' zurückgegebene' off_t 'eigentlich kein undurchsichtiger Datentyp ist; es ist nur eine vorzeichenbehaftete Ganzzahl. Je nach Plattform und Kompilierungsflags kann es sich jedoch auch um 32-Bit oder 64-Bit handeln. In ähnlicher Weise ist 'fpos_t' möglicherweise nicht 64-Bit, wenn' _FILE_OFFSET_BITS'! = 64. – nneonneo

+0

Ich denke, was ich mit einem undurchsichtigen Datentyp meinte ist, dass es keinen festen Typ im Benutzercode hat. Ich denke, es ist nicht ganz undurchsichtig, weil der Datentyp nur zur Kompilierungszeit, nicht zur dynamischen Verbindungszeit geändert werden kann. –

+2

Ah. Normalerweise verwende ich Opaque im Sinne von "Struktur mit nicht-öffentlichem Layout", wie zB fpos_t. – nneonneo

Antwort

8

Weitere Informationen zu diesem Unterschied finden Sie unter Portable Positioning. Ein Auszug:

Auf einigen Systemen, wo Text-Streams wirklich von binären Streams abweichen, ist es unmöglich, die Dateiposition eines Text-Stream als Anzahl der Zeichen vom Anfang der Datei darzustellen. Zum Beispiel muss die Dateiposition auf einigen Systemen sowohl einen Datensatz-Offset innerhalb der Datei als auch einen Zeichen-Offset innerhalb des Datensatzes codieren.

Als Konsequenz, wenn Sie Ihre Programme wollen diese Systeme tragbar sein, Sie einige Regeln beachten müssen:

  • Der Wert von ftell auf einem Text-Stream zurückgegeben hat keine vorhersagbare Beziehung zu der Anzahl der Zeichen du hast es bisher gelesen. Das einzige, worauf Sie sich verlassen können, ist, dass Sie es später als Offset-Argument für fseek oder fseeko verwenden können, um zur gleichen Dateiposition zurückzukehren.
  • Bei einem Aufruf von fseek oder fseeko in einem Textstream muss entweder der Offset null sein, oder es muss SEEK_SET sein, und der Offset muss das Ergebnis eines früheren Aufrufs von ftell im selben Stream sein.
  • Der Wert des Dateipositionsindikators eines Textstreams ist nicht definiert, während Zeichen, die mit ungegetc zurückgeschoben wurden, nicht gelesen oder verworfen wurden. Siehe Ungelesen.

In Kürze: fgetpos/fsetpos verwenden, um eine flexiblere Struktur zusätzliche Metadaten über den Dateipositionszustand zu speichern, ermöglicht eine bessere Übertragbarkeit (in der Theorie).

Verwandte Themen