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 :

shell avec langage c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Par défaut shell avec langage c
    BSR;
    j'ai trouvé un code dans un fichier nommé shell dans un dossier shell aussi sous le c:\ lors de l'installation du solveurlindo ; il est écrit en c mais ce code ne fait que l'affichage et l'écriture dans un fichier LND IN.txt et moi je veux executer un code ecrit en c et qui execute le solveur lindo avec un probleme lineaire qui ressemble à celui là et aprés je recuepere le resultat à partir d'un fichier et tout ça en arrière plan. donc je doit utiliser ce fichier shell .
    shell:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #include <stdio.h> // for file i/o
    #include <io.h> // for dup functions
    #include <process.h> // for spawn function
     
    void main()
    {
    char *cFileIn = "C:\\LINDO\\LNDIN.TXT";
    char *cFileOut = "C:\\LINDO\\LNDOUT.TXT";
    char *cFileSolu = "C:\\LINDO\\SOLUTION.TXT";
    float fXVal, fYVal;
    FILE *fp, *fpIn, *fpOut, *fpSolution;
    int nStdIn, nStdOut;
     
    // Open a LINDO script file
    fp = fopen( cFileIn, "w");
     
    // Always a good idea to do a PAGE 0 first off in LINDO script files
    fprintf( fp, "PAGE 0\n");
     
    // Send the formulation to the script file
    fprintf( fp, "MAX 20X+30Y\n");
    fprintf( fp, "ST\n");
    fprintf( fp, "X<50\n");
    fprintf( fp, "Y<60\n");
    fprintf( fp, "X+2Y<120\n");
    fprintf( fp, "END\n");
     
    // Supress the standard solution report
    fprintf( fp, "TERSE\n");
     
    // Solve the model
    fprintf( fp, "GO\n");
     
    // Open a file for storing the solution
    fprintf( fp, "DIVERT %s\n", cFileSolu);
     
    // Send the solution to the output file
    fprintf( fp, "CPRI /N P\n");
     
    // Close output file
    fprintf( fp, "RVRT\n");
     
    // Quit LINDO
    fprintf( fp, "QUIT\n");
     
    // Close LINDO command file
    fclose( fp);
     
    // Redirect standard input to the script file
    nStdIn = dup( 0);
    fpIn = fopen( cFileIn, "r");
    dup2( fileno( fpIn), 0);
     
    // Redirect standard output to a file
    nStdOut = dup( 1);
    fpOut = fopen( cFileOut, "w");
    dup2( fileno( fpOut), 1);
     
    // Run LINDO and process script file.
    spawnlp( P_WAIT, "C:\\LINDO\\LINDO.EXE", " ", NULL);
     
    // Flush i/o streams
    fflush( stdin);
    fflush( stdout);
     
    // Restore standard i/o
    dup2( nStdIn, 0);
    dup2( nStdOut, 1);
     
    // Close files
    fclose( fpIn);
    fclose( fpOut);
     
    // Open solution file
    fpSolution = fopen( cFileSolu, "rt");
     
    // Display the solution
    fscanf( fpSolution, "%f\n%f", &fXVal, &fYVal);
    printf("X and Y = %f %f\n", fXVal, fYVal);
     
    // Close solution file
    fclose( fpSolution);
    }
    franchement j'arrive pas à utiliser ce fichier pour shell et fichier text pour resoudre le probleme de lindo
    le fichier lNDIN.txt:


    PAGE 0
    MAX 1X+4Y
    ST
    X<5
    Y<6
    X+2Y<12
    END
    TERSE
    GO
    DIVERT C:\LINDO\SOLUTION.TXT
    RVRT
    QUIT
    je pense qui'il faut trouver un commande qui execute ce fichier text qui est en relation avec le fichier txt

    ..STP aidez moi ..BN

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par abrouch Voir le message
    BSR.....STP
    T'as la flemme d'écrire les mots en entier ???

    Citation Envoyé par abrouch Voir le message
    j'ai trouvé un code dans un fichier nommé shell dans un dossier shell aussi sous le c:\ lors de l'installation du solveurlindo ; il est écrit en c mais ce code ne fait que l'affichage et l'écriture dans un fichier LND IN.txt et moi je veux executer un code ecrit en c et qui execute le solveur lindo avec un probleme lineaire qui ressemble à celui là et aprés je recuepere le resultat à partir d'un fichier et tout ça en arrière plan. donc je doit utiliser ce fichier shell .
    Mouais. Tu es super limpide. Tu parles de shell (Unix) mais tu fais référence à c:\ (Windows). Bon bref
    Tu veux appeler un programme en C depuis un script shell => ben tu l'appelles comme tout programme
    Tu veux appeler un script shell depuis un code C sans te préoccuper de ce que le script fera => tu appelles le script avec system()
    Tu veux appeler un script shell depuis un code C et récupérer ce que fait le script => tu appelles le script avec popen() et tu traites ce que le script affiche comme un flux stdin
    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]

  3. #3
    Membre actif
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Par défaut
    bjr

    j'ai trouvé ça sur internet:
    Running Lindo as a background process allows you to work on other tasks at your terminal while Lindo is processing your program. The simplest way is to create a file containing your Lindo statements and execute the shell command 'lindo' as a background process (using an & at the end of the command line). The general format of running LINDO programs in background,

    [logic]% lindo < input_file > output_file &

    et solon ce que tu m'as dit j'ai essayer:
    fp= popen( " c:\lindow32.exe < c:\LINDO\LNDIN.txt > c:\ LINDO\LNDOUT.txt &", "rw");

    int pclose (fp);

    mais pas de resultat

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par abrouch Voir le message
    et solon ce que tu m'as dit j'ai essayer:
    fp= popen( " c:\lindow32.exe < c:\LINDO\LNDIN.txt > c:\ LINDO\LNDOUT.txt &", "rw");

    int pclose (fp);
    T'as pas bien compris comment fonctionne popen

    popen est la réplique en C d'un pipe c.ad. d'un chainage stdout=>stdin entre 2 commandes.

    Ainsi, si tu veux récupérer le résultat de ce qu'affiche une commande (on va dire d'un "ls"), alors la méthode est la suivante
    1) faire FILE *flux=popen("ls", "r") => tout ce que ls affiche ira dans le flux
    2) faire une boucle de lecture de flux comme on lirait un fichier et traiter l'info lue; info provenant directement du ls => while (fgets(flux, ...))

    Si t'as pas besoin de récupérer le résultat, alors popen marche mais ça ne sert pas à grand chose. Un peu comme si tu ouvrais un fichier pour ne pas le lire. Dans ce cas, un system() suffit.

    Toi, d'après ce que je comprends, tu veux appeler depuis ton code C le programme lindow32.exe en lui donnant en entrée un fichier X et en redirigeant sa sortie sur un fichier Y. Dans ce cas, popen est inutile (puisque ce qu'affiche le programme ne sera pas récupéré par ton code mais directement dans le fichier y) donc un system suffit
    system(" c:\lindow32.exe < c:\LINDO\LNDIN.txt > c:\ LINDO\LNDOUT.txt" );

    Citation Envoyé par abrouch Voir le message
    mais pas de resultat
    A mon avis si. A mon avis t'as quand-même eu un fichier "c:\ LINDO\LNDOUT.txt "...
    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]

  5. #5
    Membre actif
    Inscrit en
    Novembre 2010
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 14
    Par défaut
    system(" c:\\lindow32.exe < c:\\LINDO\\LNDIN.txt > c:\\LINDO\\LNDOUT.txt" );
    pffffffff j'en ai marre LNDOUT.txt est vide

    au pire des cas je veux une solution qui s'affiche sur l'écran(mieux que rien)
    stp comment je peux faire ça avec popen???

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    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 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par abrouch Voir le message
    system(" c:\\lindow32.exe < c:\\LINDO\\LNDIN.txt > c:\\LINDO\\LNDOUT.txt" );
    pffffffff j'en ai marre LNDOUT.txt est vide
    Essaye donc simplement, depuis une console MsDos, la commande
    c:\\lindow32.exe < c:\\LINDO\\LNDIN.txt > c:\\LINDO\\LNDOUT.txt (au fait, pourquoi les double backslashes ???)
    Si ça ça marche, alors ça marchera avec un system()...

    Citation Envoyé par abrouch Voir le message
    au pire des cas je veux une solution qui s'affiche sur l'écran(mieux que rien)
    stp comment je peux faire ça avec popen???
    Je tape à capella (sans tester)

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char ligne[81];
    FILE *fp=popen("C:\\lindow32.exe < c:\\LINDO\\LNDIN.txt", "r")
     
    while (fgets(ligne, 81, fp) != NULL)
    {
        printf("%s", ligne);
    }
    pclose(fp);
    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]

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/12/2006, 16h13
  2. Script shell avec HTML avec warning
    Par ab_2006 dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 05/10/2006, 13h15
  3. Un script shell avec nombre d'argument variable
    Par lastrecrue dans le forum Linux
    Réponses: 1
    Dernier message: 28/05/2006, 11h35
  4. Programmation Shell avec Red Hat Calcul de moyenne
    Par jcpoulard dans le forum Linux
    Réponses: 3
    Dernier message: 22/02/2006, 22h08
  5. Extension Shell avec une icone
    Par Bill14 dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 13/08/2005, 15h03

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