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 :

Un programme pas trop compréhensible


Sujet :

C++

  1. #21
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    Voici mon code:
    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
     
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<string>
    #include<vector>
     
    using namespace std;
     
     
    int main (int argc, char* argv[]) {
     
         ifstream entree(arg[1]);
     
    vector<string>::iterator IterAvant;
     
    vector<string>::reverse_iterator IterRecul;
     
    vector<string> c1;
     
    string recup("");
     
     
    if ( !entree )
     
    {
     
    cerr <<"erreur fichier";
     
    return 0 ;
     
    }
     
    while ( getline(entree, recup))
     
    {
     
    if ( recup =="display"|| recup =="rdisplay")
     
    break ;
     
    c1.push_back(recup);
     
    }
     
    cout <<"\r\nPremiere lecture du fichier : "<< endl;
     
    cout <<"taille du vector : "<< c1.size()<< endl;
     
     
    if ( recup =="display")
     
    {
     
    for (IterAvant = c1.begin(); IterAvant != c1.end(); IterAvant++)
     
    cout <<*IterAvant << endl;
     
    }
     
    else if ( recup =="rdisplay")
     
    {
     
    for (IterRecul = c1.rbegin(); IterRecul != c1.rend(); IterRecul++)
     
    cout <<*IterRecul << endl;
     
    }
     
    else
     
    {
     
    cout <<"\r\nRien n'a ete lu dans le fichier..."<< endl;
     
    }
     
    entree.close();
    }
    voici l'erreur que j'obtiens avec g++ test.cpp:

    $g++ test2.cpp
    test2.cpp: In function 'int main(int, char**)':
    test2.cpp:12: error: variable 'std::ifstream entree' has initializer but incomplete type
    test2.cpp:12: error: 'arg' was not declared in this scope
    $
    est une fois la compilation terminée je doit trouver ce résultat donc si vous pouviez m'aidez a le terminer ca serai vraiment sympa.
    Je tiens vraiment a remercier tout ceux qui m'aide depuis le debut de mon post et qui sont patient.

    resultat attendu :

    Exemples :

    $ cat was_demo1
    hello
    world
    great
    $ ./test < was_demo1
    hello
    world
    great
    $ cat was_demo2
    hello
    world
    rdisplay
    this
    is
    great
    $ ./test < was_demo2
    world
    hello
    this
    is
    great
    $ ./test < /dev/null
    $

  2. #22
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Ok désolé. J'ai fait une faute de frappe en plus, c'est pas arg[1] mais argv[1], mais cette syntaxe ne marche pas avec la syntaxe ./mon_prog < mon_fichier.

    Pour utiliser la syntaxe que tu souhaites, remplaces la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    while(getline(entree, recup)) {
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    while(getline(std::cin, recup)) {

  3. #23
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    C'est quand même hyper facile.
    C'est un travail qu'on t'a demandé de faire, on ne va donc pas le faire à ta place.

  4. #24
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut Savoir utiliser argc et argv
    Salut,
    En fait, il semblerait que tu ne saches déjà pas ce que sont ni à quoi servent les parametre argc et argv de ta fonction main...

    Dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(int argc, char* argv[])
    {
    // le code
    }
    (ou argc pourrait avoir n'importe quel nom, du moment que c'est un entier, et our argv également, pour autant que ce soit un tableau de pointeur de type char (ou un pointeur de pointeur de type char)):

    argc représente le nombre d'argument passés à savoir:
    1 s'il n'y a que la commande sous la forme de
    $: monapp
    ou 1+ nombre d'argument séparé par un espace, soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $: monapp <fichier ==>argc==2
    $: monap < fichier ==>argc==3
    la différence étant la présence ou non de l'espace entre > et fichier

    argv, quant à lui, sera un tableau de chaines de caractères "type C" contenant l'ensemble des parametres passés à la commande à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $: monapp ==> argv[0]=="monapp\0"
    $: monapp <fichier ==> argv[0]=="monapp\0", argv[1]=="<fichier\0"
    $: monapp < fichier ==> argv[0]=="monapp\0", argv[1]=="<\0", argv[2]=="fichier\0"
    La première chose à faire, c'est donc de vérifier le nombre et la valeur des arguments, et de gérer le fichier de sortie en fonction...

    Un exemple parmis tant d'autre serait quelque chose du genre de
    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
     
    int main(int argc, char* argv[])
    {
        //personnellement je préfère les strings aux chaine "C like"
        std::string chaine;
        switch(argc)
        {
            case 1: 
                 // l'utilisateur n'a pas donné de nom de fichier... y en a peut etre un
                 // par défaut ??? (sinon, il faudra gérer les choses correctement ;) )
                 chaine="fichierlogpardefaut";
                 break;
            case 2:
                  // si < apparait, c'est accolé au nom du fichier
                 chaine=argv[1];
                 // oops... le < apparait peut etre
                 chaine=chaine.substr(chaine.find_first_not_of("<"),chaine.lengt());
                 break;
            case 3:
                 //argv[1] a pris > et argv[2] a pris le nom du fichier
                 chaine=argv[2];
        }
        //"yapuka" ouvrir le fichier
        std::ifstream  fichier(chaine.c_str());
        // et à continuer le traitement
    }
    evidemment, cela signifie que le système n'interprète pas de lui meme la signification de <... tu devrait peut etre envisager l'utilisation de -f pour indiquer le fichier
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Par défaut
    J'ai enfin réussi a coder seul hic j'ai encore une erreur dc si vous pouviez m'aider, voici mon code:
    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
     
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<string>
    #include<vector>
     
    using std::cerr;
    using std::cin;
    using std::cout;
    using std::endl;
    using std::string;
    using std::vector;
     
    int main (void) {
            vector<string>::iterator IterAvant;
            vector<string>::reverse_iterator IterRecul;
            vector<string> c1;
            string recup("");
            while ( getline(cin, recup)){
                    if ( recup =="display"){
                            for (IterAvant = c1.begin(); IterAvant != c1.end(); IterAvant++)
                                    cout <<*IterAvant << endl;
                            c1.erase(c1.begin() , c1.end());
                    }
                    else if ( recup =="rdisplay"){
                            for (IterRecul = c1.rbegin(); IterRecul != c1.rend(); IterRecul++)
                                    cout <<*IterRecul << endl;
                            c1.erase(c1.begin() , c1.end());
                    }
            }
            c1.push_back(recup);
            for (IterAvant = c1.begin(); IterAvant != c1.end(); IterAvant++){
                    if (*IterAvant == "rdisplay" || *IterAvant == "display")
                            IterAvant++;
                    cout <<*IterAvant << endl;
            }
    }
    lorsque je compil tout fonctionne bien et mes tests aussi sauf dans un cas particulier, si l'entrée standar se termine par display ou rdisplay j'obtient une erreur de segmentation (Segmentation fault).
    Merci d'avance pour votre aide !!!

  6. #26
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    lorsque je compil tout fonctionne bien et mes tests aussi sauf dans un cas particulier, si l'entrée standar se termine par display ou rdisplay j'obtient une erreur de segmentation (Segmentation fault).
    Lorsque tu rencontres display ou rdisplay tu passes à l'élément suivant et l'affiche. Donc s'il n'y a pas d'élément suivant ça crash, normal.

Discussions similaires

  1. Un programme qui veut bosser; mais pas trop.
    Par Flodelarab dans le forum C++
    Réponses: 8
    Dernier message: 28/08/2006, 15h33
  2. [CSS] Instruction Padding : FireFox pas trop comprendre ?
    Par DemonKN dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 11/08/2005, 15h23
  3. Prob somme SQL (pas trop facile, help!!!!!)
    Par nachi dans le forum Langage SQL
    Réponses: 7
    Dernier message: 20/07/2005, 16h42
  4. Réponses: 5
    Dernier message: 23/06/2004, 22h23

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