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
    Nouveau membre du Club
    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é
    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

    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
    Nouveau membre du Club
    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
    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 «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site