Ouvrir et fermer un fichier dans une boucle

lenouveau82 Messages postés 53 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024 - Modifié le 29 juil. 2024 à 10:25
 PierrotLeFou - 31 juil. 2024 à 05:05

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
29 juil. 2024 à 18:53

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

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 mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024
29 juil. 2024 à 10:58

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 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024 Ambassadeur 1 533
29 juil. 2024 à 14:25

bonjour,

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

0
lenouveau82 Messages postés 53 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024
29 juil. 2024 à 14:32

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 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024 1 533 > lenouveau82 Messages postés 53 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024
29 juil. 2024 à 14:40

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 mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024 > yg_be Messages postés 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024
29 juil. 2024 à 15:09
	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 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024 1 533 > lenouveau82 Messages postés 53 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024
29 juil. 2024 à 16:05

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 mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024 > yg_be Messages postés 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024
29 juil. 2024 à 16:20

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 26287 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 16 septembre 2024 3 300
29 juil. 2024 à 14:44

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 mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024
29 juil. 2024 à 15:38

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

0
blux Messages postés 26287 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 16 septembre 2024 3 300 > lenouveau82 Messages postés 53 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024
29 juil. 2024 à 15:53

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 mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024 > blux Messages postés 26287 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 16 septembre 2024
29 juil. 2024 à 16:20

Ha mince :( Je suis sous Windows malheureusement

0
blux Messages postés 26287 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 16 septembre 2024 3 300 > lenouveau82 Messages postés 53 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024
30 juil. 2024 à 08:48

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 33266 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 septembre 2024 7 777
Modifié le 30 juil. 2024 à 18:43

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

                        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