Ouvrir et fermer un fichier dans une boucle

lenouveau82 Messages postés 53 Date d'inscription   Statut Membre Dernière intervention   -  
 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

A voir également:

7 réponses

PierrotLeFou
 

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.

1
flibustier
 

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 ?

0
lenouveau82 Messages postés 53 Date d'inscription   Statut Membre Dernière intervention  
 

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

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 

bonjour,

Connais-tu les "pipe"?  Sous quel OS travailles-tu? 

0
lenouveau82 Messages postés 53 Date d'inscription   Statut Membre Dernière intervention  
 

bonjour, j'en ai entendu parler en faisant mes recherches mais il me semble avoir compris que ce t'était que sur Linux. Malheureusement je suis sous Windows. J'aimerais simplement savoir si ouvrir et fermer des fichiers de la sorte est problématique

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > lenouveau82 Messages postés 53 Date d'inscription   Statut Membre Dernière intervention  
 

Tu peux utiliser des pipe également sous Windows.

Tu ne nous en dit pas assez pour déterminer si ce que tu fais est problématique.

0
lenouveau82 Messages postés 53 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
	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

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > lenouveau82 Messages postés 53 Date d'inscription   Statut Membre Dernière intervention  
 

Au minimum, j'ajouterais une pause dans la boucle.

Et, si la valeur de button n'a pas changé, je ne ferais pas les appels aux fonctions SDL.

Si cela se passe sur un ordi qui ne sert à rien d'autre, cela ne me semble pas trop gênant d'ainsi gaspiller son énergie.

0
lenouveau82 Messages postés 53 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 

c'est sur une ordi normal, je fais d'autres choses avec. Tu penses que c'est gourmand en ressources ?

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
blux Messages postés 27127 Date d'inscription   Statut Modérateur Dernière intervention   3 361
 

Salut,

https://dotclear.placeoweb.com/post/tail-windows ?

avec un -f pour en suivre l'évolution.

0
lenouveau82 Messages postés 53 Date d'inscription   Statut Membre Dernière intervention  
 

merci, mais je ne comprends pas trop comment ça fonctionne

0
blux Messages postés 27127 Date d'inscription   Statut Modérateur Dernière intervention   3 361 > lenouveau82 Messages postés 53 Date d'inscription   Statut Membre Dernière intervention  
 

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.

0
lenouveau82 Messages postés 53 Date d'inscription   Statut Membre Dernière intervention   > blux Messages postés 27127 Date d'inscription   Statut Modérateur Dernière intervention  
 

Ha mince :( Je suis sous Windows malheureusement

0
blux Messages postés 27127 Date d'inscription   Statut Modérateur Dernière intervention   3 361 > lenouveau82 Messages postés 53 Date d'inscription   Statut Membre Dernière intervention  
 

Oui mais le lien que j'ai donné te permet d'installer sous windows un programme qui se comporte comme 'tail'.

0
mamiemando Messages postés 33777 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 

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

0
PierrotLeFou
 

                        As-tu vraiment besoin d'un fichier ou seulement des données générées par ton programme Python?
Comme je l'ai indiqué dans un autre post, on peut faire quelque chose du genre sous cmd:
python mon_script.py | programme_c.exe

0