IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

code c + shell + nom fichier


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 45
    Points : 40
    Points
    40
    Par défaut code c + shell + nom fichier
    Bonjour,

    Je voulais savoir si il etait possible de creer un fichier avec la fonction system() dans un code c. Sachant que le nom du fichier aurait comme parametre t, ou t est une variable dans mon code c ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Mon code c
            return t;
    	system("time=$t");
            system("LC_ALL=C  cat interfa* > all$time.dat");
    je vous en remercie,
    Suntory

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Je vois 2 problèmes:
    - en C, intégrer la valeur d'une variable dans une chaine
    - faire plusieurs appels à "system"

    Je ne me souviens plus très bien comment on fait une concaténation de chaines en C, peut-être quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    code1 = format("time=%s", t)
    code2 = format("LC_ALL=C  cat interfa* > all%s.dat", t)
    À vérifier avec un développeur ou un tuto C...

    Pour le 2ème problème, comme indiqué dans le manuel:
    La fonction system() exécute la commande indiquée dans commande en appelant /bin/sh -c commande
    Il faut donc savoir que chaque appel "system" crée un nouveau process shell qui hérite d'une copie des variables du contexte appelant mais ne peut pas modifier ce contexte appelant.
    Donc on ne peut pas faire ce que tu veux avec 2 appels "system".
    Dans le premier appel, on peut modifier la valeur de la variable shell "time", mais on ne peut pas (facilement) transmettre cette variable au 2ème appel.
    Vu le contexte que tu nous fournis, il vaut mieux faire comme j'ai proposé plus haut (utiliser "t" plutôt que "$time").

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    C'est possible, mais en dehors d'un exercice stupide, ça l'est tout autant.
    Les chaînes se formatent aisément via sprintf. system prend une chaîne et il faut la construire entièrement avant son appel.
    Et chaque appel crée un nouveau contexte d'exécution comme dit ci-dessus. Tu ne peux pas utiliser une variable créée dans un autre appel à system, tout comme tu ne peux pas utiliser une variable créée dans un autre invité de commandes.
    Maintenant, la manipulation de fichiers se fait via l'API de FILE, et en particulier fopen pour ouvrir et créer un fichier.
    Et les variables... ben elles existent en C directement.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 45
    Points : 40
    Points
    40
    Par défaut
    Merci beaucoup ! pour vos reponses. Voici mon nouveau code qui fonctionne :
    Tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	char command[80];
    	sprintf(command, "LC_ALL=C  cat interfa* > all%g.dat",t);
            system(command);
    Bon confinement !

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Suntory Voir le message
    Merci beaucoup ! pour vos reponses. Voici mon nouveau code qui fonctionne :
    Tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	char command[80];
    	sprintf(command, "LC_ALL=C  cat interfa* > all%g.dat",t);
            system(command);
    C'est typiquement le cas d'un code qui "tombe en marche" (ie un code mal écrit mais où l'erreur est masquée par une syntaxe permissive dans ce cas précis mais qui ne le sera pas dans un autre cas).

    En shell (et system() fait en fait appel à un shell sous-jacent du C), on sépare des instructions écrites sur une même ligne par un point-virgule. Donc LC_ALL=C cat interfa* > all.dat doit s'écrire en réalité LC_ALL=C; cat interfa* > all.dat. Ici ça le fait car la première instruction est une assignation de variable (donc l'espace a le même rôle que le point-virgule) mais si la première instruction était autre chose (ie date cat interfa* >all.dat) ça planterait complètement.

    De plus, je ne vois pas trop l'utilité de la variable "LC_ALL" dans ce contexte (mais il me faudrait un exemple complet pour voir si ça se justifie).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Optimisation de code avec shell
    Par alexandrefcsm dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 12/07/2016, 16h51
  2. problème code script shell
    Par mido1951 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 20/11/2015, 01h06
  3. Shell - Explication de code
    Par claralavraie dans le forum Linux
    Réponses: 13
    Dernier message: 13/01/2006, 16h03
  4. Description de code shell
    Par claralavraie dans le forum Linux
    Réponses: 5
    Dernier message: 10/01/2006, 14h46
  5. CODE RETOUR GENERE PAR PL/SQL POUR SHELL UNIX
    Par mimi_été dans le forum PL/SQL
    Réponses: 6
    Dernier message: 18/11/2004, 08h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo