Garder un nom de fichier en enlevant une extension archive

Signaler
Messages postés
11
Date d'inscription
mardi 22 septembre 2009
Statut
Membre
Dernière intervention
20 novembre 2010
-
Messages postés
11
Date d'inscription
mardi 22 septembre 2009
Statut
Membre
Dernière intervention
20 novembre 2010
-
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

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
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.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
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.
Messages postés
11
Date d'inscription
mardi 22 septembre 2009
Statut
Membre
Dernière intervention
20 novembre 2010

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.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
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.
Messages postés
11
Date d'inscription
mardi 22 septembre 2009
Statut
Membre
Dernière intervention
20 novembre 2010

#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.
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
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;
}
Messages postés
11
Date d'inscription
mardi 22 septembre 2009
Statut
Membre
Dernière intervention
20 novembre 2010

merci de votre aide ça m'a beaucoup aidé pour le TP.