2011-08-25 14 views
6

Mi aplicación (programa C) abre dos manejadores de archivo para el mismo archivo (uno en escritura y otro en modo lectura). Dos hilos separados en la aplicación leen y escriben en el archivo. Esto funciona bien Dado que mi aplicación se ejecuta en un dispositivo incrustado con un tamaño de disco RAM limitado, me gustaría escribir FileHandle para ajustar al principio del archivo al alcanzar el tamaño máximo y leer FileHandle para seguirlo como un búfer circular. Entiendo de las respuestas a this question que esto debería funcionar. Sin embargo, tan pronto como lo hago fseek de escribir FileHandle al comienzo del archivo, fread devuelve el error. ¿El EOF se restablecerá al hacer fseek al principio del archivo? Si es así, qué función se debe utilizar para provocar que la posición del archivo de escritura se establezca en 0 sin que se restablezca EOF.¿Cómo implementar un búfer circular usando un archivo?

EDIT/UPDATE: me trató par de cosas:


  1. Basado en @neodelphi Solía ​​tuberías esto funciona. Sin embargo, mi uso requiere que escriba en un archivo. Recibo múltiples canales de transmisión de video en vivo que necesita almacenarse en el disco duro y también leerse decodificado y mostrarse en el monitor.

  2. Gracias a las sugerencias de @Clement para hacer ftell, corrigí un par de errores en mi código y envolví trabajos para el lector; sin embargo, los datos leídos parecen ser obsoletos ya que la escritura aún está almacenada pero el lector lee contenido obsoleto disco. No puedo evitar el almacenamiento en búfer debido a consideraciones de rendimiento (obtengo 32Mbps de datos en vivo que deben escribirse en el disco duro). He intentado cosas como las escrituras de barrido solo en el intervalo desde que se escriben las envolturas hasta cuando se vuelven a leer y truncar el archivo (ftruncate) después de las vueltas de lectura, pero esto no resuelve el problema de datos obsoletos.

  3. Estoy tratando de utilizar dos archivos en la moda de ping-pong para ver si esto resuelve el problema, pero quiero saber si hay una mejor solución

+0

¿Estás bloqueando mientras lees y escribes el archivo? –

+1

Si está desarrollando un sistema similar a Linux, ¿intentó archivos de tuberías? Este tipo de archivos solo almacena lo que se ha escrito pero no leído, por lo que implementar un buffer circular puede no ser necesario. – neodelphi

+0

@Clement. No estoy teniendo bloqueos. Yo uso std C lib fread y fwrite calls – Badri

Respuesta

1

usted debe tener algo así:

// Write 
if(ftell(WriteHandle)>BUFFER_MAX) rewind (WriteHandle); 
fwrite(WriteHandle,/* ... */); 

// Read (assuming binary) 
readSize = fread (buffer,1,READ_CHUNK_SIZE,ReadHandle); 
if(readSize!=READ_CHUNK_SIZE){ 
    rewind (ReadHandle); 
    if(fread (buffer+readSize,1,READ_CHUNK_SIZE-readSize,ReadHandle)!=READ_CHUNK_SIZE-readSize) 
     ;// ERROR ! 
} 

No probado, pero da una idea. La escritura también debe manejar el caso BUFFER_MAX no es el módulo WRITE_CHUNK_SIZE.

Además, puede leer solo si está seguro de que los datos ya se han escrito. Pero supongo que ya haces eso.

+0

A continuación se muestra mi código. Similar a lo que tienes, excepto que utilizo fseek en lugar de rebobinar. 'Fpos = ftell (fp); if ((fpos + bytesToWrite)> = maxFileSize) {fseek (fp, 0, SEEK_SET);} ' – Badri

+0

@Bardi fread don' Sólo devuelve un error, devuelve un número. Qué número ? ¿Qué devuelve 'feof()'? Además, 'feof()' se restablece en fseek, rewind y clearerr (http://www.cplusplus.com/reference/clibrary/cstdio/clearerr/). –

+0

En el ajuste de escritura, configuro la posición de ajuste en una variable compartida (con protección de exclusión mutua). Cuando la posición de lectura alcanza esta posición de envolvente, rebozo de Read File Handle incluso antes de hacer fread. Así que no esperaría que ocurrieran errores. Recibo errores de "fread" tan pronto como la escritura se completa aunque la posición de lectura aún no ha alcanzado el punto de ajuste. La lectura siempre tendrá el mismo tamaño que el tamaño del fragmento de escritura en mi aplicación – Badri

Cuestiones relacionadas