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
Bonjour,
Tout d'abord voici le but de mon programme:

J'ai un fichier texte avec plusieurs lignes, mon programme doit récupérer que la première ligne dans une première variable et l'exécuter.

Ensuite j'ai rajouter une condition, dans cette condition on récupère toujours la première ligne en une deuxième variable et on les comparent si la première ligne du fichier texte est toujours la même, si c'est la même on continu à exécuter ce fichier, si elle a changée on stop l'exécution du fichier et on lance le nouveau fichier.

Voici mon code :




#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include<conio.h>  

using namespace std;
int main()
{
	{
	ifstream fichier("D:\\test.txt");
        string ligne1; //Une variable pour stocker les lignes lues

	if(fichier)
	{
		//L'ouverture s'est bien passée. On peut donc lire

		(getline(fichier, ligne1)); 
		{
			system(ligne1.c_str()); // execute le contenu de la variable ligne.
		}
		
                fichier.close();
        }
	else
	{
		cout << "ERREUR: Impossible d'ouvrir le fichier en lecture." << endl;
                return 1;
	}
	
	
	
	
		string ligne2;
		fichier.open("D:\\test.txt");
                      getline(fichier,ligne2);
		if(ligne1==ligne2)
		{
                      
		      system(ligne1.c_str()); // execute le contenu de la variable ligne.
                      fichier.close();			
		}
		 else if(ligne1!=ligne2)
		{

			system(ligne2.c_str()); // execute le contenu de la variable ligne.
			
		}
		
	}
	system("PAUSE");//mettre l'affichage de la console en pause pour pas qu'elle se referme automatiquement.
	 return EXIT_SUCCESS;

	
	
	}



Mon problème:

Lorsque je met le lien d'un fichier powerpoint en premier, il me l'execute correctement mais avec un message d'erreur dans la console (le processus ne peut accéder au fichier car ce fichier est exécute par un autre processus), et il ne prend pas en compte si je change la ligne de la variable à récupérer du fichier txt, car le programme s'arrête automatiquement après la fermeture de mon fichier.
Alors que lorsque je fais le contraire c'est à dire exécuté en variable le fichier txt en premier,puis changer la ligne du fichier texte et mettre un fichier powerpoint la il marche.
je ne comprend pas pourquoi...!!

Mon second problème:

J'aurais aimé évité de devoir fermer à chaque fois manuellement le premier fichier exécuté afin qu'il compare et reéxecute le même fichier ou un différent.
J'aurais aimé qu'il le face automatiquement, c'est à dire que lorsque mon premier fichier est executé de ne pas à avoir à le fermer afin qu'il relance le même fichier ou un nouveau suivant si la variable à changée ou pas. Il aurait fallu qu'il reste ouvert lorsque la variable est la même et qu'il se ferme et ouvre le nouveau fichier lorsque la variable a changée.Étant débutant en C++ je ne vois pas trop comment faire.

Rmq: c'est que lorsque je met un fichier powerpoint en première variable que cela ne marche pas (le fait de mettre un fichier png ou txt en premier puis un ppt marche, mais le contraire non )

Je ne sais pas si tout cela est claire...
Merci d'avance.
A voir également:

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
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
0
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
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 !

#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");
	}
}
0
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
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.
0
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
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...

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");
	}
}
0
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
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 :
#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;
	}
}
0
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
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
0
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
La "mise à jour" c'est l'affectation ligne2=ligne1, donc le code de Char Snipeur répond déjà à ta question ;-)
0
ligne1=enTete("D:\\test.txt"); ,
ça c'est pour affecter la valeur à la variable ? je me suis totalement trompé :p
0
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
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 ;-)
0
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
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.
0

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
Ok merci beaucoup, j'ai donc ça comme code au final :

#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
0
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
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 :

#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");
	}
}
0
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
Oui j'ai remarqué après
0
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
Merci aussi à toi char sniper, effectivement tes messages ont mis du temps à s'afficher je regarde ce que tu me proposes.
0
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
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
0
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
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 ^^)
0
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
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).
0