Domanda

In poche parole, ho il seguente frammento di codice:

FILE* test = fopen("C:\\core.u", "w");
printf("Filepointer at: %d\n", ftell(test));
fwrite(data, size, 1, test);
printf("Written: %d bytes.\n", size);
fseek(test, 0, SEEK_END);
printf("Filepointer is now at %d.\n", ftell(test));
fclose(test);

e genera:

Filepointer at: 0
Written: 73105 bytes.
Filepointer is now at 74160.

Perché? Perché il numero di byte scritti non corrisponde al puntatore del file?

È stato utile?

Soluzione

Poiché stai aprendo il file in modalità testo, convertirà i marcatori di fine riga, come LF, in CR / LF.

Ciò è probabile se si esegue Windows (e probabilmente lo è, dato che il nome del file inizia con " c: \ " ).

Se apri il file in modalità " wb " , sospetto che i numeri siano identici:

FILE* test = fopen("C:\\core.u", "wb");

Lo standard C99 dice questo in 7.19.5.3 La funzione fopen :

  

La modalità argomento punta a una stringa. Se la stringa è una delle seguenti, il file è   aperto nella modalità indicata. Altrimenti, il comportamento non è definito.

     

r apre il file di testo per la lettura
   w troncato a lunghezza zero o crea un file di testo per la scrittura
   a append; aprire o creare un file di testo per la scrittura alla fine del file
   rb apre il file binario per la lettura
   wb tronca a lunghezza zero o crea un file binario per la scrittura
   ab append; aprire o creare un file binario per la scrittura alla fine del file
   r + apre il file di testo per l'aggiornamento (lettura e scrittura)
   w + troncato a lunghezza zero o crea file di testo per l'aggiornamento
   a + append; aprire o creare un file di testo per l'aggiornamento, scrivendo alla fine del file
   r + b o rb + apri il file binario per l'aggiornamento (lettura e scrittura)
   w + b o wb + troncano a lunghezza zero o creano file binario per l'aggiornamento
   a + b o ab + append; aprire o creare un file binario per l'aggiornamento, scrivendo alla fine del file

Puoi vedere che distinguono tra w e wb . Non credo che un'implementazione sia richiesta per trattare i due in modo diverso, ma di solito è più sicuro usare la modalità binaria per i dati binari.

Altri suggerimenti

cosa restituisce fwrite? normalmente il valore restituito dovrebbe essere il numero di byte scritti. Inoltre, con cosa risponde ftell () subito prima di fseek?

Potrebbe essere utile sapere quale sistema operativo, versione del compilatore C e libreria C.

Un filepointer è un cookie. Non ha valore L'unica cosa per cui puoi usarlo è cercare nello stesso posto in un file. Non sono nemmeno sicuro che ISO C garantisca che ftell restituisca valori crescenti. Se non ci credi, ti preghiamo di guardare le diverse modalità seek (). Esistono proprio perché la posizione non è un semplice offset di byte.

Windows in realtà non scrive tutti i dati nel file senza un flush e possibilmente un fsync. Forse è per questo che

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top