Mon application (programme C) ouvre deux handles de fichiers dans le même fichier (un en écriture et un en lecture). Deux threads distincts dans l'application lisent et écrivent dans le fichier. Cela fonctionne bien. Depuis mon application fonctionne sur un périphérique embarqué avec une taille de disque ram limitée, je voudrais écrire FileHandle
pour enrouler au début du fichier sur atteindre la taille maximale et la lire FileHandle
à suivre comme un tampon circulaire. Je comprends des réponses à this question que ceci devrait fonctionner. Cependant, dès que je fais fseek
d'écrire FileHandle
au début du fichier, fread
renvoie une erreur. Est-ce que le EOF
sera réinitialisé en faisant fseek
au début du fichier? Si c'est le cas, quelle fonction doit être utilisée pour que la position du fichier d'écriture soit mise à 0 sans réinitialiser EOF
.Comment implémenter un tampon circulaire en utilisant un fichier?
EDIT/MISE À JOUR: j'ai essayé deux choses:
Basé sur @neodelphi je tuyaux cela fonctionne. Cependant, mon utilisation nécessite que j'écris dans un fichier. Je reçois plusieurs canaux de flux de vidéosurveillance en direct qui doivent être stockés sur le disque dur et également relus décodés et affichés sur le moniteur. Grâce aux suggestions de @Clement sur ftell j'ai corrigé quelques bogues dans mon code et les travaux de retour pour le lecteur cependant, les données lues semblent être des données périmées puisque l'écriture est encore mise en mémoire tampon mais le lecteur lit le contenu périmé de dur disque. Je ne peux pas éviter la mise en mémoire tampon en raison de considérations de performance (j'obtiens 32 Mbps de données en direct qui doivent être écrites sur le disque dur). J'ai essayé des choses comme des écritures de vidage seulement dans l'intervalle de quand l'enveloppe enveloppe à quand la lecture enveloppe et tronque le fichier (ftruncate) après la lecture enveloppe mais ceci ne résout pas le problème de données périmé.
Je suis en train d'utiliser deux fichiers dans la mode ping-pong pour voir si cela résout le problème, mais je veux savoir s'il y a une meilleure solution
Verrouillez-vous en lisant le fichier? –
Si vous développez sur un système de type Linux, avez-vous essayé les fichiers de tuyaux? Ces types de fichiers ne stockent que ce qui a été écrit mais pas lu, donc l'implémentation d'un tampon circulaire peut ne pas être nécessaire. – neodelphi
@Clement. Je n'ai pas de verrous. J'utilise std C lib fread et fwrite – Badri