j'ai un projet en C++ qui fonctionne , a chaque fois que je change les entrée de projet je dois faire Build-Run.
est ce qu'il ya une méthode pour faire par exemple un fichier (de configuration) simple ou je peux changer juste les entrée de projet et je fais appel au projet et je fais Run directement.
(cad j'ouvre juste un fichier (a faire qui est en lien avec le projet)je met mes entrées et je Run le projet).
Si c'est un projet type "console", vous pouvez faire en sorte que les entrée claviers viennent d'un fichier via l'utilisation d'un simple pipe "|" dans l’interpréteur de commande.
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Salut. Si tu veux faire un fichier de configuration, tu peux par exemple lire un fichier .txt qui contient les données de config.
Il y a un moment, j'ai écrit une petite lib pour faire un fichier de config, le code est ici : https://tentacule.be/fossil/cpp-BConfig/index Si le navigateur rale car le certificat est invalide, pas de panique.
Je te conseille aussi de rechercher un peu sur google s'il n'existe pas de meilleures libs. J'ai écrit ce code il y a des années, et il y a sans doutes mieux et plus simple.
Tu peux aussi te faire une solution maison, va voir un tuto sur istream et la lecture dans les fichiers.
Bonne journée!
- Edité par ledemonboiteux 20 novembre 2017 à 11:33:50
bacelar: pardon j'ai pas compris votre idée ,qu'est ce que vous voulez dire avec "projet console "exactement?
ledemonboiteux: je peux pas acceder au lien que vous m'avait mentionné :(
et oui j'ai besoin de faire un fichier de configuration , comment je peux ça: "tu peux par exemple lire un fichier .txt qui contient les données de config" ?
Bon, nous allons reprendre les choses depuis le début:
Tu as une application qui doit lire des vidéos d'une part, et "différentes informations" sur comment les manipuler d'autre part. C'est bien cela?
A priori, pour charger ta video et pour la manipuler par la suite, tu n'as pas beaucoup de choix: tu dois utiliser les standards en vigueur. Mais pour désigner le fichier video qui doit être chargé, tu n'as que l'embarras du choix. Le plus facile étant, peut être, de fournir le nom du fichier sous la forme d'un argument à ton application.
Si ce n'est que tu as -- si j'ai bien compris -- besoin d'un deuxième fichier qui contienne les différentes modification à apporter à la video. Du coup, nous pourrions très bien rajouter le nom du fichier video qui doit être chargé directement dans ce deuxième fichier, mais avant de commencer à indiquer les modification qu'il faut apporter. Et, du coup, ce fichier pourrait même servir directement à indiquer les différentes transformations à entreprendre pour plusieurs fichiers vidéos.
En gros, tu aurais un fichier qui pourrait ressembler à
et, tout ce qu'il faudrait alors faire, c'est de fournir à l'application le nom du fichier de configuration que l'on veut utiliser, sous une forme qui serait proche de
monapp -f fichierDeConfiguration.ext
Faire en sorte qu'une application C++ accepte des paramètres, c'est relativement simple: il suffit d'utiliser le prototype
int main(int argc, char ** argv){
}
Récupérer les paramètres est parfois plus compliqué, mais boost::program_options rend les choses *** relativement *** simples.
Le vrai problème, ce sera de traiter le fichier de configuration. Ou de passer en "full manual" si le nom du fichier n'est pas donné.
A priori, je ne me fais pas trop de soucis pour la partie "full manual", vu que tu sembles déjà en être arrivé à ce stade. Mais pour le traitement du fichier, il va falloir que tu définisse très clairement la structure qu'il devra respecter (celle que j'ai donnée en exemple n'étant pas la meilleure qui soit), et tu devras trouver le moyen de parcourir ce fichier en faisant ce qu'il indique qui doit être fait
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
Sous Windows, c'est COMMAND.EXE, sous Linux, on peut utiliser un shell quelconque : bask, ksh, etc...
Généralement, pour une application console, les IDE lancent un shell et exécutent la ligne de commande correspondante à la configuration du projet dedans.
Vérifiez dans votre IDE les options qui permettent de configurer la ligne de commande utilisée.
>Puisque mes entrée sera des vidéos et une valeur d'intensité pour la transformation de ces vidéos
Si votre vidéo est dans un fichier, dans le système de fichier, moi, je vous conseille d'utiliser les arguments de la ligne de commande, car la redirection des entrées d'une application console s’accommode mal de plusieurs paramètres en entré.
Donc plus une ligne de commande de la forme :
"MonExecutable.exe NomDuFichierVideo 10"
Avec comme premier argument, le chemin du fichier contenant la vidéo et le second argument l'intensité.
oh, j'ai pris ext pour "extension", mais, selon la forme que tu donneras à ce fichier, tu lui donnera celle qui convient le mieux, n'est-ce pas
Donc, si tu choisi le format xml (très mauvais choix, à mon sens), ce sera .xml; si tu choisi le format json ce sera... .json (qui l'eu cru), si tu choisi un format binaire (pas facile à manipuler pour l'humain), ce sera peut-être .dat ou, tu peux aussi tout simplement lui donner l'extension txt, si il prend la forme d'un fichier texte plus ou moins formaté lisible par n'importe qui
Quant au contenu de ce fichier, tu restes tout à fait libre de le définir selon tes propres besoins. Tu souhaites indiquer clairement quel sera le nom du fichier résultant? Il n'y a rien qui t'interdise de le rajouter dans les informations.
La seule chose, c'est que tu devra apporter un certain "formalisme" à la manière dont ce fichier est rempli, car il faut qu'il le soit toujours de la même manière, autrement, ton application ne s'y retrouvera pas (et celui qui devra l'écrire non plus, d'ailleurs ).
Et donc, tu dois réfléchir très sérieusement aux informations que tu veux qu'il contienne et à la manière de les présenter dans ce fichier avant même de commencer à faire quoi que ce soit! On dit généralement que l'on crée des spécifications
Bien sur, on ne peut ignorer le fait que tu risques, à un moment donné, de te rendre compte qu'une information de plus s'avère nécessaire! Il faudra donc veiller à ce que tes spécifications restent toujours strictement adaptées au contenu de ton fichier
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
non, tu n'aurais qu'un argument à passer à ton application: le nom du fichier de configuration.
A partir de là, tu récupère ce nom, et tu l'utilise pour ouvrir et traiter le contenu du fichier en question.
Une manière "simple et idiote" de travailler serait proche de
void fullHanded(){
/* Cette fonction correspond à ce qui doit être fait
* à la main
*/
}
void byConfigFile(std::string const & filename){
std::ifstream ifs(filename);
/* ici, on va lire dans ifs les informations dont on a besoin
* pour travailler
*/
}
int main(int argc, char ** argv){
/* argc est toujours minimum à 1, car argv[0] correspond
* toujours au nom de l'application
*/
if(argc ==1){ // si on n'a que le nom de fichier
fullHanded(); // on va demander toutes les informations
// à l'utilisateur
}else{ // si on a u paramètre
byConfigFile(argv[1]); // on utilise les informations
// contenues dans le fichier de config
}
}
Et ce découpage permettrait donc d'appeler l'application soit sous la forme de
monapplication # l'utilisateur introduit tout à la main
soit sous la forme de
monapplication fichierConfig.txt # on utilise un fichier de configuration
C'est simple, mais ca fait le truc
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
1- j'ai pas compris quoi mettre dans la fonction FullHanded exactement?
2- pour la fonction configFile juste je mais mon fichier de configuration ou j'ai mentionner les entrées? c'est tout?
3- pour int main c'est la ou se commence mon programme , donc je fait tous ça dans le main.cpp du projet? et je fait cette boucle if (des 2 fonctions) tout debut de main ? (donc avant les ligne de codes de mon projet?
ou je defini Smiley = 1.2 (intensité), le chemin du védio a modifier et le chemin de vidéo a génere aprés modification. (se sont les 3 Paramétres à definir dans le fichier de configuration)
Evite les screen-shots, ce n'est vraiment pas le moyen le plus efficace de nous transmettre du code!
Préfères l'utilisation du bouton </> qui se trouve juste au dessus de la zone de texte dans laquelle tu écris ta réponse, et fais y un copier / coller de ton code (après avoir sélectionné C++, pour que la coloration syntaxique soit correcte).
Comme tu n'as pas compris mon explication, je vais reprendre (encore une fois) depuis le début, en espérant que j'ai moi-même compris correctement la situation.
D'après ce que je vois sur ton screen-shot, le nom du fichier qui doit être traité, celui du fichier résultant et les modifications à apporter sont "écrits en durs" dans ton code.
Cela t'oblige à compiler ton application à chaque fois que tu veux travailler sur un nouveau fichier ou que tu veux apporter une modification différente. Ce qui n'est vraiment pas pratique, surtout si tu as de nombreux fichiers à manipuler.
La première chose à faire serait donc d'apporter un peu de "dynamisme" à ton application, en lui permettant de "dialoguer" avec l'utilisateur.
Par exemple, au lieu d'utiliser un nom de fichier écrit en dur dans le code pour savoir quel fichier elle doit traiter, elle pourrait demander à l'utilisateur d'introduire ce nom de fichier. Et comme il y a exactement le même problème en ce qui concerne le nom du fichier de résultat, nous pourrions faire d'une pierre deux coups en créant une fonction qui afficherait un message donné (par exemple "veuillez introduire le nom du fichier à traiter :" ou "veuillez introduire le nom du fichier de résultat") et qui renverrait le chemin d'accès vers le fichier qui intéresse l'utilisateur.
Et on remplacerait alors ta ligne 20 par quelque chose qui serait proche de
auto infile = askFilename("Veuillez introduire le chemin d'acces au fichier a traiter");
VideoCapture(infile.c_str());
/* la suite ne change pas */
Nous pourrions ensuite créer une fonction qui demande à l'utilisateur le coefficient de modification à apporter (je ne connais pas OpenCV, mais je présume que c'est la valeur 25 que l'on trouve à la ligne 32?) sous une forme qui serait proche de
int askCoefficient(){
std::cout<<"Veuillez introduire le coefficient de modification :";
std::string answer;
int coef;
bool again{true};
do{
try{
std::getline(std::cin, answer);
size_t pos{0};
coef = std::stoi(answer,pos);
again = !(pos == answer.size());
}
catch(std::exception &e){
again = true;
}
} while(again);
}
et ta ligne 31 serait alors remplacée par quelque chose comme
auto outFile=askFilename("Veuillez introduire le chemin d'acces vers le fichier de sortie:");
auto coef = askCoef();
Videoriter video(outFile.c_str(),CV_FOURCC('M','J','P',G'),coef,/* la suite*/);
Une fois que tu aurais cela, on va faire simple, mais pas vraiment correct (parce que je ne dispose que d'un screen-shot) : ta fonction main pourrait devenir la fonction que j'ai appelée "fullHanded", car ton application demanderait toutes les informations dont elle a besoin au fur et à mesure à l'utilisateur.
L'étape suivante sera de créer une fonction (la fonction que j'ai appelée byConfigFile) qui utilisera le nom du fichier de configuration que l'utilisateur peut donner en paramètre à l'application pour... aller y rechercher toutes les informations dont elle a besoin
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
Salut, Pour le lien que tu n'arrives pas à ouvrir, il te faut accepter le certificat. J'ai aussi mis un clone de mon code sur github (qui lui marche facilement), ici :
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
* Un wrapper C++ pour sqlite * Une alternative a boost units
* Un wrapper C++ pour sqlite * Une alternative a boost units