Garder un nom de fichier en enlevant une extension archive

tchiibo Messages postés 11 Date d'inscription mardi 22 septembre 2009 Statut Membre Dernière intervention 20 novembre 2010 - 25 nov. 2009 à 13:42
tchiibo Messages postés 11 Date d'inscription mardi 22 septembre 2009 Statut Membre Dernière intervention 20 novembre 2010 - 25 nov. 2009 à 17:39
Je vous présente tout d'abord le début du code:

#include

using namespace std;

int main(int argc, char* argv[])
{
if (fork() == 0)
{ //fils 1
execlp ("gunzip","gunzip",argv[1],NULL);
break;
}
if (fork() == 0)
{ //fils 2
execlp ("mpg321","mpg321",???,NULL);
break;
}


}
return 0;
}

donc voila on lancerait une décompression d'archive avec qui aurait un nom.mp3.gz
ensuite le 2eme fils lancerais le mp3 mais c'est à ce niveau la que ça bloque, il faudrait
garder le même nom en enlevant l'extension gz.
donc au premier fils pour décompresser il est mis argv[1] et au deuxième à la place des "???"
je ne sais quoi metre, merci de votre aide.

7 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 124
25 nov. 2009 à 14:48
if (fork() == 0)
{ //fils 1
execlp ("gunzip","gunzip",argv[1],NULL);
break;
}

Un break dans un if ? D'une part ça ne sert à rien, d'autre part si tu lance execlp alors le processus se duplique et est totalement remplacé par le nouveau, donc tu n'atteindras de toute façon jamais "break".


using namespace std;

Beurk ! A éviter. Mieux vaut ne pas le mettre ou à la limite écrire using std::cout; using std::endl; etc..., dans une portée limitée.

Voici un exemple tout bête qui te permet de te débarasser d'une extension:

#include 

int main(int argc, char* argv[])
{
  std::string s(argv[1]);

  std::cout << s << std::endl;
  std::cout << s.substr(0, s.find_last_of(".")) << std::endl;

  return 0;
}


L'astuce utilisée consiste à récupérer le dernier "." de la chaîne (via find_last_of), et ensuite d'extraire la chaîne contenu entre le début de celle-ci et la position du dernier "." (via substr).
Je te laisse le soin de l'adapter à ton code.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 124
25 nov. 2009 à 14:49
J'oubliais:
execlp ("mpg321","mpg321",???,NULL);

Ici il faut mettre un char* à la place de ???, or std::string n'est pas un char*, il faut donc faire un s.c_str() pour récupérer le char* contenu dans le std::string, sinon ça ne rentrera pas.
0
tchiibo Messages postés 11 Date d'inscription mardi 22 septembre 2009 Statut Membre Dernière intervention 20 novembre 2010
25 nov. 2009 à 15:13
je ne sais pas comment utiliser s.c_str()
et vous me conseillez de mettre quoi à la place du break?
merci pour la réponse.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 124
25 nov. 2009 à 15:16
vous me conseillez de mettre quoi à la place du break?

Soit rien, soit un message d'erreur, tout en quittant:

if (fork() == 0)
{
  execlp ("gunzip","gunzip",argv[1],NULL);
  std::cerr << "Error while launching gunzip" << std::endl;
  exit(1);
}


je ne sais pas comment utiliser s.c_str()

C'est l'utilisation.
0

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

Posez votre question
tchiibo Messages postés 11 Date d'inscription mardi 22 septembre 2009 Statut Membre Dernière intervention 20 novembre 2010
25 nov. 2009 à 16:51
#include
#include <sys/wait.h>
using std::endl;
#include <string>
#include <sstream>
using std::string;using std::istringstream;
using std::cout;
#include <stdlib.h>

int main(int argc, char* argv[])
{

if (fork() == 0)
{ //fils 1
execlp ("gunzip","gunzip",argv[1],NULL);
}
sleep(15);

std::string s(argv[1]);

std::cout << s << std::endl;
std::cout << s.substr(0, s.find_last_of(".")) << std::endl;
cout<<argv[1];

if (fork() == 0)
{ //fils 2
cout<<argv[1];
execlp ("vlc","vlc",argv[1],NULL);

}
sleep(15);

cout<<argv[1];
execlp ("gzip","gzip",argv[1],NULL);



}


voila ce que ça donne au final mais il y a un problème, en fait on dirais que:
execlp ("vlc","vlc",argv[1],NULL);
( le deuxième fils) reprend le int main de base
car le argv[1] reste test.mp3.gz alors que le cout juste au dessus, me montre test.mp3 dans la commande.
merci.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 124
25 nov. 2009 à 16:57
Attention, non testé, mais ça devrait donner cela:
#include 
#include <sys/wait.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
  if (fork() == 0)
  {
    execlp("gunzip","gunzip",argv[1],NULL);
    std::cerr << "Error while launching gunzip" << std::endl;
    exit(1);
  }
  sleep(15);

  std::string s(argv[1]);
  std::cout << s << std::endl;
  s = s.substr(0, s.find_last_of("."));
  std::cout << s << std::endl;

  if (fork() == 0)
  {
    execlp("vlc","vlc", s.c_str(), NULL);
    std::cerr << "Error while launching vlc" << std::endl;
    exit(1);
  }
  sleep(15);

  std::cout << argv[1] << std::endl;
  execlp("gzip","gzip",argv[1],NULL);
  std::cerr << "Error while launching gzip" << std::endl;
  return 0;
}
0
tchiibo Messages postés 11 Date d'inscription mardi 22 septembre 2009 Statut Membre Dernière intervention 20 novembre 2010
25 nov. 2009 à 17:39
merci de votre aide ça m'a beaucoup aidé pour le TP.
0
Rejoignez-nous