2012-08-25 15 views
10

Qual è la differenza tra ftello/fseeko e fgetpos/fsetpos? Entrambe sembrano essere le funzioni di puntamento/impostazione del puntatore del file che utilizzano tipi di offset opachi a volte consentono offset a 64 bit.ftello/fseeko vs fgetpos/fsetpos

Sono supportati su piattaforme diverse o con standard diversi? È più flessibile nel tipo di offset che usa?

E, a proposito, sono a conoscenza di fgetpos/fsetpos and ftell/fseek, ma questo è non un duplicato. Questa domanda richiede ftell/fseek e la risposta è non applicabile a ftello/fseeko.

+0

Si noti che il 'off_t' restituito da' ftello' non è in realtà un tipo di dati opaco; è solo un numero intero con segno. Potrebbe essere a 32 o 64 bit a seconda della piattaforma e dei flag di compilazione, però. Allo stesso modo, 'fpos_t' potrebbe non essere 64-bit se' _FILE_OFFSET_BITS'! = 64. – nneonneo

+0

Immagino che cosa intendessi con un tipo di dati opaco è che non è di un tipo fisso nel codice dell'utente. Immagino che non sia abbastanza opaco, perché il tipo di dati può essere modificato solo al momento della compilazione, non al momento del collegamento dinamico. –

+2

Ah. Di solito uso opaco nel senso di 'struttura con layout non pubblico', come fpos_t is. – nneonneo

risposta

8

Vedere Portable Positioning per informazioni dettagliate sulla differenza. Un estratto:

Su alcuni sistemi in cui i flussi di testo veramente diverse da flussi binari, è impossibile per rappresentare la posizione del file di un flusso di testo come numero di caratteri dall'inizio del file. Ad esempio, la posizione del file su alcuni sistemi deve codificare sia un offset di record all'interno del file, sia un offset di carattere all'interno del record.

Di conseguenza, se si desidera che i programmi per essere portatile a questi sistemi, è necessario rispettare alcune regole:

  • il valore restituito da ftell su un flusso di testo non ha alcuna relazione prevedibile al numero di caratteri hai letto finora. L'unica cosa su cui puoi fare affidamento è che puoi usarlo successivamente come argomento di offset per fseek o fseeko per tornare alla stessa posizione del file.
  • In una chiamata a fseek o fseeko su un flusso di testo, l'offset deve essere zero o, di conseguenza, deve essere SEEK_SET e l'offset deve essere il risultato di una precedente chiamata a ftell sullo stesso flusso.
  • Il valore dell'indicatore di posizione del file di un flusso di testo non è definito mentre vi sono caratteri che sono stati respinti con ungetc che non è stato letto o scartato. Vedi non letto.

In sintesi: fgetpos/fsetpos utilizzano una struttura più flessibile per memorizzare ulteriori metadati sullo stato posizione nel file, consentendo una maggiore portabilità (in teoria).