fseek(...)
è una chiamata di libreria, non una chiamata di sistema del sistema operativo. È la libreria run-time che si prende cura del sovraccarico effettivo coinvolto nel fare una chiamata di sistema al sistema operativo, tecnicamente parlando, fseek sta facendo indirettamente una chiamata al sistema, ma in realtà non lo è (questo fa emergere una chiara distinzione tra differenze tra una chiamata in biblioteca e una chiamata di sistema). fseek(...)
è una funzione di input-output standard indipendentemente dal sistema sottostante ... però ... e questo è un grande però ...
Il sistema operativo sarà più che probabile di avere nella cache il file nella sua memoria del kernel , cioè, l'offset diretto alla posizione sul disco su cui sono memorizzati gli 1 e gli 0, è attraverso i livelli del kernel del sistema operativo, più che probabile, uno strato superiore all'interno del kernel che avrebbe l'istantanea di ciò che il file è composto da, cioè dati indipendentemente da ciò che contiene (non gli interessa in alcun modo, purché i 'puntatori' alla struttura del disco per quell'offset alla lcoation sul disco siano validi!) ...
Quando si verifica fseek(..)
, lì d un sacco di overhead, indirettamente, il kernel ha delegato il compito di leggere dal disco, a seconda di quanto sia frammentato il file, potrebbe essere teoricamente "tutto il posto", che potrebbe essere un significativo overhead in termini di dover, dal punto di vista dell'utente-terra, cioè il codice C che fa un fseek(...)
, potrebbe spargersi dappertutto per raccogliere i dati in una "vista contigua dei dati" e quindi, inserendo nel al centro di un file, (ricorda in questa fase, il kernel dovrebbe regolare la posizione/gli offset nel piatto del disco effettivo per i dati) sarebbe considerato più lento di accodare alla fine del file.
La ragione è molto semplice, il kernel "sa" che cosa era l'offset scorso è stata, e semplicemente pulire il marcatore EOF e inserire più dati, dietro le quinte, il kernel, si trova a dover allocare un altro blocco di memoria per il buffer del disco con l'offset corretto per la posizione sul disco che segue un indicatore EOF, una volta completata l'aggiunta dei dati.
Utilizzando fseek() et al semplicemente non è possibile inserire dati nel mezzo di un file, quindi la tua domanda è discutibile. –
Non puoi semplicemente inserire dati nel mezzo di un file (tanto quanto non puoi cancellare qualcosa dall'inizio o al centro di un file). Il meglio che puoi fare è sovrascrivere i dati nel mezzo di un file. – dmeister