Code c+++ probleme
Fermé
Yvan64320
Messages postés
33
Date d'inscription
jeudi 28 juillet 2011
Statut
Membre
Dernière intervention
25 août 2011
-
8 août 2011 à 14:19
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 11 août 2011 à 08:02
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 11 août 2011 à 08:02
A voir également:
- Code c+++ probleme
- Le code ascii - Guide
- Code puk bloqué - Guide
- Code telephone oublié - Guide
- Code activation windows 10 - Guide
- Code gta 4 ps4 - Guide
8 réponses
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
8 août 2011 à 15:12
8 août 2011 à 15:12
Salut.
Je pense que tes deux problèmes sont liés. Déjà, il faut savoir si la fonction system retourne ou non avant la fin du programme exécuté. C'est à dire bloquant ou non.
Et Je pense à ce que tu dis qu'elle est bloquante sauf pour powerpoint (parmis ce que tu as testé).
Ensuite, ce que tu veux est impossible, il n'y a pas de signal lancé aux programmes lorsque qu'un fichier est modifié. Comme je te l'ai dit dans un autre fil de discussion, une façon de faire est de faire une boucle et de regarder périodiquement voir si le fichier a changé.
Pour éviter les problèmes de bloquage et mieux maitriser ce que tu fais, je te le redit, dirige toi vers les fonctions "exec". http://www.man-linux-magique.net/man3/execl.html
Je pense que tes deux problèmes sont liés. Déjà, il faut savoir si la fonction system retourne ou non avant la fin du programme exécuté. C'est à dire bloquant ou non.
Et Je pense à ce que tu dis qu'elle est bloquante sauf pour powerpoint (parmis ce que tu as testé).
Ensuite, ce que tu veux est impossible, il n'y a pas de signal lancé aux programmes lorsque qu'un fichier est modifié. Comme je te l'ai dit dans un autre fil de discussion, une façon de faire est de faire une boucle et de regarder périodiquement voir si le fichier a changé.
Pour éviter les problèmes de bloquage et mieux maitriser ce que tu fais, je te le redit, dirige toi vers les fonctions "exec". http://www.man-linux-magique.net/man3/execl.html
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
8 août 2011 à 15:28
8 août 2011 à 15:28
1) operator== n'est pas redéfini pour la classe std::string, en conséquence comparer string1 et string2 soit se faire avec la méthode compare
2) Puisque tes deux lectures de fichiers sont identiques, autant faire une fonction que tu appelles pour ligne1, puis pour ligne2...
3) si ligne1==ligne2, tu exécutes system(ligne1), sinon tu fais system(ligne2)... autant dire tout de suite que tu exécutes system(ligne2), ta condition ne sers à rien !
4) Puisque ligne1 et ligne2 sont lues dans le même fichier, il n'y a aucune raison que les fichiers de sorties doit différents... Tu dis que d'abord tu mets le powerpoint et ensuite le fichier texte... Mais le deuxième on s'en moque, vu ton code, seul la première ligne est considérée et le programme associé lancé deux fois !
Si je comprends bien ce que tu veux faire, tu peux essayer ceci : toutes les 10 secondes le programmes lis le fichier et regardes si il a changé auquel cas il lance le programme associé...
2) Puisque tes deux lectures de fichiers sont identiques, autant faire une fonction que tu appelles pour ligne1, puis pour ligne2...
3) si ligne1==ligne2, tu exécutes system(ligne1), sinon tu fais system(ligne2)... autant dire tout de suite que tu exécutes system(ligne2), ta condition ne sers à rien !
4) Puisque ligne1 et ligne2 sont lues dans le même fichier, il n'y a aucune raison que les fichiers de sorties doit différents... Tu dis que d'abord tu mets le powerpoint et ensuite le fichier texte... Mais le deuxième on s'en moque, vu ton code, seul la première ligne est considérée et le programme associé lancé deux fois !
#include <iostream> #include <fstream> #include <string> std::string enTete(const std::string &nomFichier) { std::ifstream fichier("D:\\test.txt"); std::string ligne; if (fichier.is_open()) { std::getline(fichier, ligne); fichier.close(); std::cout << ligne.c_str() << std::endl; } else { std::cerr << "Impossible d'ouvrir le fichier en lecture : " << nomFichier.c_str() << std::endl; //system("PAUSE"); //exit(EXIT_FAILURE); } return ligne; } int main() { std::string ligne1=enTete("D:\\test.txt"); system(ligne1.c_str()); std::string ligne2=enTete("D:\\test.txt"); system(ligne2.c_str()); system("PAUSE"); return EXIT_SUCCESS; }
Si je comprends bien ce que tu veux faire, tu peux essayer ceci : toutes les 10 secondes le programmes lis le fichier et regardes si il a changé auquel cas il lance le programme associé...
#include "windows.h" int main() { std::string ligne1=enTete("D:\\test.txt"), ligne2; while(true) { if (ligne2.compare(ligne1)!=0) { system(ligne1.c_str()); Sleep(10000); } ligne2=enTete("D:\\test.txt"); } }
Yvan64320
Messages postés
33
Date d'inscription
jeudi 28 juillet 2011
Statut
Membre
Dernière intervention
25 août 2011
Modifié par Yvan64320 le 8/08/2011 à 16:22
Modifié par Yvan64320 le 8/08/2011 à 16:22
Ok merci pour ta réponse, tu m'as bien éclairer avec tes explications sur mon code. Pour la deuxième partie c'est exactement ce que je veux faire qu'il lise le fichier par exemple toutes les 5 minutes. J'ai essayé d'intégré ton deuxième code cela marche, mais le problème est que je suis obligé tout d'abord de fermer le premier fichier pour qu'il vérifie toutes les 10 secondes si il a changé, et lorsque je le change il m'exécute toujours le fichier comme si il l'avait gardé en mémoire. Pourtant il prend bien le bon chemin d'accès (on le voit en console) mais exécute le fichier précédent et lorsque je laisse le même il l'execute en boucle en console sans rien ne se passe
Je cherche la solution pour ces ptits soucis.
Merci pour tes réponses, et ton code proposé!! ça m'a bien avancé !!
(peut-être je l'ai mal intégré ton code aussi)
Merci encore.
Je cherche la solution pour ces ptits soucis.
Merci pour tes réponses, et ton code proposé!! ça m'a bien avancé !!
(peut-être je l'ai mal intégré ton code aussi)
Merci encore.
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
8 août 2011 à 16:32
8 août 2011 à 16:32
Il suffit d'initialiser ligne2=ligne1 et tu ne devrais plus avoir le bug du premier fichier ;-)
Et effectivement je me suis trompé ce n'est pas system(ligne1) qu'il faut faire mais system(ligne2), sans oublier de changer ligne1 au fur et à mesure...
Et effectivement je me suis trompé ce n'est pas system(ligne1) qu'il faut faire mais system(ligne2), sans oublier de changer ligne1 au fur et à mesure...
int main() { std::string ligne1=enTete("D:\\test.txt"), ligne2=ligne1; while(true) { if (ligne2.compare(ligne1)!=0) { system(ligne2.c_str()); Sleep(10000); ligne1=ligne2; } ligne2=enTete("D:\\test.txt"); } }
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
8 août 2011 à 16:40
8 août 2011 à 16:40
bon je ressai une dernière fois (deux messages composer qui ont disparus).
utilise une autre fonction que system pour lancé tes programmes.
La boucle de KX n'est pas parfaite, il faut déplacer le Sleep à la racine du while et mettre quelque part une mise à jour de ligne1 (je te laisse chercher où). Essai ça :
utilise une autre fonction que system pour lancé tes programmes.
La boucle de KX n'est pas parfaite, il faut déplacer le Sleep à la racine du while et mettre quelque part une mise à jour de ligne1 (je te laisse chercher où). Essai ça :
#include "windows.h" int main() { std::string ligne1, ligne2; while(true) { ligne1=enTete("D:\\test.txt") if (ligne2.compare(ligne1)!=0) { system(ligne1.c_str()); } Sleep(10000); ligne2=ligne1; } }
Yvan64320
Messages postés
33
Date d'inscription
jeudi 28 juillet 2011
Statut
Membre
Dernière intervention
25 août 2011
Modifié par Yvan64320 le 8/08/2011 à 18:07
Modifié par Yvan64320 le 8/08/2011 à 18:07
tu parles de mettre à jour ligne1 comment je peux le mettre à jour ?
le fais de faire ligne1=enTete("D:\\test.txt"); ne le met pas à jour ?
desolé si ma question parait bête... :x
le fais de faire ligne1=enTete("D:\\test.txt"); ne le met pas à jour ?
desolé si ma question parait bête... :x
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
8 août 2011 à 18:22
8 août 2011 à 18:22
La "mise à jour" c'est l'affectation ligne2=ligne1, donc le code de Char Snipeur répond déjà à ta question ;-)
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
8 août 2011 à 19:36
8 août 2011 à 19:36
Bah c'est un tout, mais pour moi ligne1=enTete("D:\\test.txt"); (c'est à dire la relecture du fichier) ça fait plus partie de la vérification que la ligne a changée ou non. La mise à jour c'est lorsqu'on sait qu'elle a changée... C'est d'ailleurs pour ça que contrairement à Char Snipeur, j'avais mis l'instruction ligne2=ligne1 à l'intérieur du if... Mais bon tu as deux avis différents (et néanmoins proche) à toi de voir ce qui correspond le mieux à ton problème ;-)
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
9 août 2011 à 07:44
9 août 2011 à 07:44
Ha oui, dans le if c'est mieux. Comme la valeur de la variable n'a pas changé de valeur ça ne sert à rien de la modifier.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Yvan64320
Messages postés
33
Date d'inscription
jeudi 28 juillet 2011
Statut
Membre
Dernière intervention
25 août 2011
Modifié par Yvan64320 le 8/08/2011 à 17:28
Modifié par Yvan64320 le 8/08/2011 à 17:28
Ok merci beaucoup, j'ai donc ça comme code au final :
Mais j'ai toujours le soucis que je suis obligé de fermer le premier fichier, pour qu'il lance le même ou relance un nouveau fichier.Il y aurait pas un moyen pour que le fichier reste ouvert lorsque c'est le même ou ferme l'ancien fichier et lance automatiquement lorsque ce n'est pas le même fichier ? et non pas fermer le premier fichier manuellement, il vérifie si il a changé et lance le nouveau fichier ou le même si pas changé?
En tout cas un gros merci à toi, c'est gentil d'aider les noobs :p
#include <iostream> #include <fstream> #include <string> #include "windows.h" std::string enTete(const std::string &nomFichier) { std::ifstream fichier("D:\\test.txt"); std::string ligne; if (fichier.is_open()) { std::getline(fichier, ligne); fichier.close(); std::cout << ligne.c_str() << std::endl; } else { std::cerr << "Impossible d'ouvrir le fichier en lecture : " << nomFichier.c_str() << std::endl; //system("PAUSE"); //exit(EXIT_FAILURE); } return ligne; } int main() { std::string ligne1, ligne2; while(true) { ligne1=enTete("D:\\test.txt"); if (ligne2.compare(ligne1)!=0) { system(ligne1.c_str()); } Sleep(10000); ligne2=ligne1; } }
Mais j'ai toujours le soucis que je suis obligé de fermer le premier fichier, pour qu'il lance le même ou relance un nouveau fichier.Il y aurait pas un moyen pour que le fichier reste ouvert lorsque c'est le même ou ferme l'ancien fichier et lance automatiquement lorsque ce n'est pas le même fichier ? et non pas fermer le premier fichier manuellement, il vérifie si il a changé et lance le nouveau fichier ou le même si pas changé?
En tout cas un gros merci à toi, c'est gentil d'aider les noobs :p
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
8 août 2011 à 17:12
8 août 2011 à 17:12
C'est parce que tu as mal "mixé" les morceaux de code que ce soit les miens ou celui de Char Snipeur...
Ton code "final" devrait être quelque chose comme ceci :
Ton code "final" devrait être quelque chose comme ceci :
#include <iostream> #include <fstream> #include <string> #include "windows.h" std::string enTete(const std::string &nomFichier) { // je ne remets pas tout, rien ne change ici } int main() { std::string ligne1=enTete("D:\\test.txt"), ligne2=ligne1; while(true) { if (ligne2.compare(ligne1)!=0) { system(ligne2.c_str()); ligne1=ligne2; } Sleep(10000); ligne2=enTete("D:\\test.txt"); } }
Yvan64320
Messages postés
33
Date d'inscription
jeudi 28 juillet 2011
Statut
Membre
Dernière intervention
25 août 2011
8 août 2011 à 17:25
8 août 2011 à 17:25
Oui j'ai remarqué après
Yvan64320
Messages postés
33
Date d'inscription
jeudi 28 juillet 2011
Statut
Membre
Dernière intervention
25 août 2011
Modifié par Yvan64320 le 8/08/2011 à 17:23
Modifié par Yvan64320 le 8/08/2011 à 17:23
Merci aussi à toi char sniper, effectivement tes messages ont mis du temps à s'afficher je regarde ce que tu me proposes.
Yvan64320
Messages postés
33
Date d'inscription
jeudi 28 juillet 2011
Statut
Membre
Dernière intervention
25 août 2011
Modifié par Yvan64320 le 10/08/2011 à 17:51
Modifié par Yvan64320 le 10/08/2011 à 17:51
Désolé de vous embêter voir même flooder de questions mais j'ai un peu de mal en programmation :)
Donc j'aurais une autre question :
Ce code est très bien et correspond totalement à ce que je veux faire, juste une petite chose,mon soucis c'est que je souhaite que lorsque le chemin d'accès dans mon fichier txt a changé il ferme le précèdent fichier et exécute le nouveau, pour le moment il exécute le nouveau mais garde le précédent ouvert.
Si quelqu'un aurait une idée .. et si il y a plusieurs manières de faire je suis preneur :)
Merci.
Bonne journée
Donc j'aurais une autre question :
Ce code est très bien et correspond totalement à ce que je veux faire, juste une petite chose,mon soucis c'est que je souhaite que lorsque le chemin d'accès dans mon fichier txt a changé il ferme le précèdent fichier et exécute le nouveau, pour le moment il exécute le nouveau mais garde le précédent ouvert.
Si quelqu'un aurait une idée .. et si il y a plusieurs manières de faire je suis preneur :)
Merci.
Bonne journée
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
10 août 2011 à 20:27
10 août 2011 à 20:27
Le problème c'est que lorsque tu lances le fichier tu demandes au système (avec system mais ce serait pareil avec exec ou spawn) de trouver le programme par défaut pour l'ouvrir.
Et donc tu pourras (au mieux) arrêter la demande d'ouverture du fichier au système (qui sera terminée depuis longtemps) mais en aucun cas arrêter le processus qui a été lancé par le système à la suite de ta demande d'ouverture...
Une solution pourrait-être de savoir exactement quel programme doit être lancé pour ouvrir le fichier (et donc se substituer à la demande du système) comme ça il n'y aura pas d'intermédiaire.
Evidemment ce n'est plus vraiment de la programmation C++ mais de la programmation Windows et je crois que c'est au dessus de ton niveau (et du mien ^^)
Et donc tu pourras (au mieux) arrêter la demande d'ouverture du fichier au système (qui sera terminée depuis longtemps) mais en aucun cas arrêter le processus qui a été lancé par le système à la suite de ta demande d'ouverture...
Une solution pourrait-être de savoir exactement quel programme doit être lancé pour ouvrir le fichier (et donc se substituer à la demande du système) comme ça il n'y aura pas d'intermédiaire.
Evidemment ce n'est plus vraiment de la programmation C++ mais de la programmation Windows et je crois que c'est au dessus de ton niveau (et du mien ^^)
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
11 août 2011 à 08:02
11 août 2011 à 08:02
une piste pour ton problème :
https://cpp.developpez.com/faq/cpp/?page=Divers#DIVERS_system
Mais il faut bien voir qu'on exécute pas un fichier, c'est impossible. Ce qui se passe en gros sous windows, c'est qu'il regarde l'extension, puis va chercher dans une table à quoi est associé cette extension.
Cette table doit être dans la base de registre, et tu y as acces en C++. Ensuite, normalement, les diverses fonctions te retournent un PID que tu peux alors utiliser pour tuer les processus (mais tu as des modification en cours non sauvegarder, elles seront perdus).
https://cpp.developpez.com/faq/cpp/?page=Divers#DIVERS_system
Mais il faut bien voir qu'on exécute pas un fichier, c'est impossible. Ce qui se passe en gros sous windows, c'est qu'il regarde l'extension, puis va chercher dans une table à quoi est associé cette extension.
Cette table doit être dans la base de registre, et tu y as acces en C++. Ensuite, normalement, les diverses fonctions te retournent un PID que tu peux alors utiliser pour tuer les processus (mais tu as des modification en cours non sauvegarder, elles seront perdus).