Ouvrir et fermer un fichier dans une boucle
PierrotLeFou -
Salut tout le monde, tout est dans le titre : J'ai besoin de connaitre le contenu d'un fichier qui s'actualise constamment en temps réel, pour ça j'ai trouvé la solution d'ouvrir et fermer le fichier dans une boucle. Je me demande quand même ce qu'il en est de l'optimisation : idée correcte ou hérésie ? Si c'est une mauvaise idée, que me suggèreriez vous ? Petite précision, ce fichier me sert à communiquer avec un scripte Python qui lui fait la même chose mais pour écrire dans le fichier
- Ouvrir et fermer un fichier dans une boucle
- Comment ouvrir un fichier epub ? - Guide
- Comment ouvrir un fichier bin ? - Guide
- Ouvrir un fichier .dat - Guide
- Comment ouvrir un fichier docx ? - Guide
- Comment ouvrir un fichier 7z - Guide
7 réponses
Est-ce que ton programme en C est continuellement actif ou s'il est réappelé?
S'il reste actif, tu pourrais appeler la fonction stat() ou _stat (sur Windows) qui te donne la date-heure de la dernière modification et la longueur du fichier.
Tu peux rappeler stat() en boucle avec une pause à chaque tour de boucle.
Salut.
Je ne suis pas non plus calé en c ^^
- Si le script python est sous ton contrôle, alors peut-être modifier son comportement pour qu'il lance ton programme c ?
- Ou alors une tâche planifiée (cron sur linux) qui détecterait si ton fichier a été ouvert (ou fermé) et lancerait ton programme c ?
- Ou alors un thread qui vérifierait périodiquement la date de modif ce ton fichier ?
Salut, merci pour ta réponse malheureusement tes solutions me semblent encore moins optimisées dans mon cas du fait que mon scripte python envoie réellement des informations en continu. Mon programme C doit donc s'actualiser aussi vite
bonjour,
Connais-tu les "pipe"? Sous quel OS travailles-tu?
while(quit == 0){ input = fopen("./Debug/output.txt", "r"); if(SDL_PollEvent(&event)){ switch(event.type){ case SDL_QUIT: quit = 1; break; case SDL_KEYUP: switch(event.key.keysym.sym){ case SDLK_ESCAPE: quit = 1; break; default: break; } break; default: break; } } fscanf(input, "%d", &button); int red = button; int blue = 255 - button; SDL_SetRenderDrawColor(pRenderer, red, 0, blue, 0); SDL_RenderFillRect(pRenderer, &rect); SDL_RenderPresent(pRenderer); fclose(input); }
dans ce code je mets à jour ma variable input pour avoir constamment la dernière valeur renvoyée par mon scripte Python. Malheureusement, si je me contente d'ouvrir et de fermer mon fichier en début puis en fin de programme celui ci capture une valeur à un instant T et ne se met pas à jour c'est pour ça que j'ai trouvé la solution d'intégrer ces deux actions dans la boucle dans laquelle j'utilise ma variable input
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionSalut,
https://dotclear.placeoweb.com/post/tail-windows ?
avec un -f pour en suivre l'évolution.
sous linux, la commande :
tail -f /nom_de_fichier
lit les n dernières lignes du fichier et les affiche ainsi que toute nouvelle ligne du fichier au fur et à mesure de son remplissage.
Cet affichage dure jusqu'à ce que la commande soit arrêtée.
Par contre, il est possible que le processus de lancement de la commande via ton programme ne provoque pas un fork et que tu ne sois donc obligé d'attendre la fin de la commande (qui ne viendra jamais) pour en obtenir le résultat.
A moins que tu ne puisses forker un process en mode asynchrone et venir voir son état (et sa sortie) toutes les n secondes.
Bonjour,
- Sous Linux, je te dirais de regarder du coté d'inotify qui est précisément conçu pour surveiller lorsqu'un fichier évolue.
- Sous Windows, il existe des équivalents (voir cette discussion).
Bonne chance