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 :

Conflits avec les arguments du main et la commande system()


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 9
    Points
    9
    Par défaut Conflits avec les arguments du main et la commande system()
    Bonjour,

    j'ai une fonction toute simple, composé d'un main prenant en argument le nom d'un fichier et une fonction system("dir") pour afficher le contenu d'un dossier sous windows.

    Le but étant d'afficher dans un premier temps le contenu du fichier, puis d'afficher le contenu du dossier.

    Le fichier a ouvrir est dans le dossier courant.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define BUF_SIZE 256
     
    int main(int argc, char **argv)
    {
        char buffer[BUF_SIZE];
     
        printf("L'argument est %s\n", argv[1]);
     
        FILE *f;
        f = fopen(argv[1], "r");
        while(fgets(buffer, BUF_SIZE, f) != NULL)
        {
            printf("%s", buffer);
        }
        fclose(f);
     
        printf("\n================\n\n");
    	system("dir");
     
    	system("pause");
    	return 0;
    }
    Le probleme est que lors de l'appel de la fonction system pour faire un "dir", ne s'affiche plus le contenu du dossier courant, mais du dossier personnel, c'est a dire C:\Documents and Settings\Dossier Utilisateur\

    A noté que si je vire la partie pour ouvrir mon fichier en argument, la commande affiche bien le contenu du dossier courant. Le probleme n'apparait donc que lorsque j'ouvre le fichier en argument.

    Comment faire pour que la commande m'affiche le contenu du dossier courant ?

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    primo la déclaration de main est FAUSSE ......

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main ( int argc, char *argv[] )
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main ( int argc, char **argv )
    Ensuite tu ne fait pas fclose du fichier que tu ouvres..

    Ensuite une instruction avant la déclaration.

    Ensuite ton while n'est pas correct :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        while(fgets(buffer, BUF_SIZE, f) != NULL )

    Ensuite ton buffer est mal déclaré :


    Autant de fautes en si peu de lignes...



    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    en effet, je débute et j'ai coder ca a l'instant...

    mais sinon voyez vous une solution a mon probleme ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    corrige tout ça d'abord...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    code édité.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    je te parlais pas d'éditer le code ici, mais chez toi... Et de le faire tourner...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    oui oui, j'ai éditer ici en meme temps, mais ça n'arrange rien...

    ma commande "dir" m'indique toujours le contenu du dossier utilisateur de windows, et non le dossier courant.

    Je ne comprends pas du tout... si quelqu'un pouvait m'aider.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    et tu le lances de où, ton programme ?

    je ne connais pas assez Windows pour t'indiquer plus, mais il me semble que sous DOS dir ne marche que si tu as fait cd ... jusqu'au répertoire..

    J'aurais donc tendance à penser que c'est pareil. Par défaut il prend le répertoire qu'il considère "home".

    Sur systèmes *n*x, il prend le répertoire d'où tu as lancé le programme. Mais sur Windows ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Ce probleme me prend la tete ! je n'y comprend rien, voici ce qu'il me retourne :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define BUF_SIZE 256
     
    int main(int argc, char **argv)
    {
        char buffer[BUF_SIZE];
     
        printf("L'argument est %s\n", argv[1]);
     
        FILE *f;
        f = fopen(argv[1], "r");
        while(fgets(buffer, BUF_SIZE, f) != NULL)
        {
            printf("%s", buffer);
        }
        fclose(f);
     
        printf("\n================\n\n");
    	system("dir");
     
    	system("pause");
    	return 0;
    }
    J'obtiens
    contenu de mon fichier passé en argument

    ============

    affichage du contenu du dossier utilisateur de windows
    Par contre si mon code est :


    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define BUF_SIZE 256
     
    int main(int argc, char **argv)
    {
        /*char buffer[BUF_SIZE];
     
        printf("L'argument est %s\n", argv[1]);
     
        FILE *f;
        f = fopen(argv[1], "r");
        while(fgets(buffer, BUF_SIZE, f) != NULL)
        {
            printf("%s", buffer);
        }
        fclose(f);
     
        printf("\n================\n\n");*/
    	system("dir");
     
    	system("pause");
    	return 0;
    }
    J'obtiens
    affichage du contenu du dossier courant
    Ce probleme m'embete beaucoup, je precise bien que c'est sous windows. Je le lance a partir d'un dossier sur un disque externe.

    Je vais l'essayer sous linux pour voir ce que ca donne...

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    et si c'était ;

    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
     
    int main(int argc, char **argv)
    {
        char buffer[BUF_SIZE];
        FILE *f=NULL;
     
        printf("L'argument est %s\n", argv[1]);
     
        f = fopen(argv[1], "r");
        if ( f != NULL )
          {
             while(fgets(buffer, BUF_SIZE, f) != NULL)
              {
                 printf("%s", buffer);
              }
             fclose(f);
          }
    ça change quelque chose ?

    es-tu sûr de ne pas avoir de lignes de plus de 255 caractères ?
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Non ca ne change rien...

    Je constate qu'en fait, des que l'on y met un argument, la commande "dir" change de repertoire pour pointé vers le dossier utilisateur, et ce que l'argument soit utilisé ou pas.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Ayant tester le meme code sous linux, je constate que ce bug de la fonction system n'est présent que sous windows... ce qui reste très embetant pour moi...

    N'existe-t-il pas une autre fonction qui fasse la meme chose que system() ??

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Probleme résolu !

    Il s'agissait bien evidement d'une erreur bete :s

    Je faisais un glisser deposer d'un fichier sur l'appli pour le passer en argument et dans ce cas ce ne marchait pas, il fallait le faire en ligne de commande...

    En tout cas je refairai plus cette erreur.

    Merci !

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

Discussions similaires

  1. [MVN2][JUnit] test avec les ressources du main
    Par Vince78 dans le forum Maven
    Réponses: 7
    Dernier message: 26/09/2007, 19h33
  2. [VBA-Excel]Avoir une boite de dialogue avec les arguments des fonctions ?
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 29/05/2007, 09h37
  3. Probleme avec les arguments
    Par Pitou5464 dans le forum C
    Réponses: 6
    Dernier message: 06/11/2006, 16h16
  4. Réponses: 3
    Dernier message: 20/10/2006, 17h43
  5. [débutant] problème avec les arguments de fopen
    Par Anouschka dans le forum C++
    Réponses: 13
    Dernier message: 23/02/2006, 14h56

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